From 680566f99a65790fe5cc21b19035a179fc2d51d0 Mon Sep 17 00:00:00 2001 From: uparkalau <132397574+uparkalau@users.noreply.github.com> Date: Sun, 29 Sep 2024 23:00:18 -0700 Subject: [PATCH 001/178] feat(WIP): Implement secure script delivery and popup rendering - Added secure endpoint to serve popupRenderer.js script with API ID validation - Implemented middleware for API ID and client ID validation - Adjusted main index file to include new script route - Updated client-side HTML/JavaScript snippet for secure script fetching --- backend/index.js | 6 ++- backend/public/scripts/bannerRender.js | 0 backend/public/scripts/popupRender.js | 52 +++++++++++++++++++ backend/public/snippets/popupSnippet.html | 30 +++++++++++ .../onboard/bannerData.controller.js | 12 +++++ backend/src/controllers/onboard/index.js | 7 +++ .../onboard/popupData.controller.js | 13 +++++ .../onboard/tourData.controller.js | 13 +++++ backend/src/middleware/onboard.middleware.js | 35 +++++++++++++ backend/src/routes/onboard.routes.js | 15 ++++++ backend/src/routes/script.routes.js | 0 backend/src/scripts/popup.script.js | 0 backend/src/service/popup.service.js | 18 +++++++ 13 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 backend/public/scripts/bannerRender.js create mode 100644 backend/public/scripts/popupRender.js create mode 100644 backend/public/snippets/popupSnippet.html create mode 100644 backend/src/controllers/onboard/bannerData.controller.js create mode 100644 backend/src/controllers/onboard/index.js create mode 100644 backend/src/controllers/onboard/popupData.controller.js create mode 100644 backend/src/controllers/onboard/tourData.controller.js create mode 100644 backend/src/middleware/onboard.middleware.js create mode 100644 backend/src/routes/onboard.routes.js create mode 100644 backend/src/routes/script.routes.js create mode 100644 backend/src/scripts/popup.script.js diff --git a/backend/index.js b/backend/index.js index 0472de5e..5d589f98 100644 --- a/backend/index.js +++ b/backend/index.js @@ -14,7 +14,8 @@ const mocks = require('./src/routes/mocks.routes'); const popup = require('./src/routes/popup.routes'); const popup_log = require('./src/routes/popuplog.routes'); const banner = require('./src/routes/banner.routes'); -// const tourRoutes = require('./src/routes/tour.routes'); +const onboardRoutes = require('./src/routes/onboard.routes'); +// const scriptRoutes = require('./src/routes/script.routes'); const app = express(); @@ -42,7 +43,8 @@ app.use('/api/mock/', mocks); app.use('/api/popup', popup); app.use('/api/popup_log', popup_log); app.use('/api/banner', banner); -// app.use('/api/tours', tourRoutes); +app.use('/api/onboard', onboardRoutes); +// app.use('/api/scripts', scriptRoutes); app.use((err, req, res, next) => { console.error(err.stack); diff --git a/backend/public/scripts/bannerRender.js b/backend/public/scripts/bannerRender.js new file mode 100644 index 00000000..e69de29b diff --git a/backend/public/scripts/popupRender.js b/backend/public/scripts/popupRender.js new file mode 100644 index 00000000..6c8cb366 --- /dev/null +++ b/backend/public/scripts/popupRender.js @@ -0,0 +1,52 @@ +const showPopup = (popupData) => { + if (!popupData || popupData.length === 0) { + console.warn('No popup data available'); + return; + } + + popupData.forEach(popup => { + // Create popup container + const popupContainer = document.createElement('div'); + Object.assign(popupContainer.style, { + position: 'fixed', + bottom: '20px', + right: '20px', + backgroundColor: popup.headerBg || '#FFFFFF', + padding: '20px', + border: '1px solid #000', + zIndex: 1000, + }); + + // Create header + const header = document.createElement('h2'); + header.textContent = popup.headerText; + header.style.color = popup.headerTextColor || '#000'; + popupContainer.appendChild(header); + + // Create content + const content = document.createElement('div'); + content.innerHTML = popup.contentHtml; + Object.assign(content.style, { + color: popup.fontColor || '#000', + fontSize: popup.font || '14px', + }); + popupContainer.appendChild(content); + + // Create action button + const actionButton = document.createElement('button'); + actionButton.textContent = popup.actionButtonText || 'Close'; + Object.assign(actionButton.style, { + backgroundColor: popup.actionButtonColor || '#CCC', + }); + actionButton.addEventListener('click', () => { + document.body.removeChild(popupContainer); // Remove popup when button is clicked + }); + popupContainer.appendChild(actionButton); + + // Append the popup to the document body + document.body.appendChild(popupContainer); + }); + }; + + export default showPopup; + \ No newline at end of file diff --git a/backend/public/snippets/popupSnippet.html b/backend/public/snippets/popupSnippet.html new file mode 100644 index 00000000..609f3217 --- /dev/null +++ b/backend/public/snippets/popupSnippet.html @@ -0,0 +1,30 @@ + + + \ No newline at end of file diff --git a/backend/src/controllers/onboard/bannerData.controller.js b/backend/src/controllers/onboard/bannerData.controller.js new file mode 100644 index 00000000..394d0a4f --- /dev/null +++ b/backend/src/controllers/onboard/bannerData.controller.js @@ -0,0 +1,12 @@ +const bannerService = require("../service/banner.service.js"); +const getBannerData = async (req, res) => { + try { + const { userId } = req.body; + const bannerData = await bannerService.getBannerData(userId); + res.status(200).json(bannerData); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}; + +module.exports = { getBannerData }; diff --git a/backend/src/controllers/onboard/index.js b/backend/src/controllers/onboard/index.js new file mode 100644 index 00000000..db465d6d --- /dev/null +++ b/backend/src/controllers/onboard/index.js @@ -0,0 +1,7 @@ +module.exports = { + // bannerData: require('./bannerData.controller'), + popupData: require('./popupData.controller'), + // tourData: require('./tourData.controller'), + // hintData: require('./hintData.controller') + }; + \ No newline at end of file diff --git a/backend/src/controllers/onboard/popupData.controller.js b/backend/src/controllers/onboard/popupData.controller.js new file mode 100644 index 00000000..89420a83 --- /dev/null +++ b/backend/src/controllers/onboard/popupData.controller.js @@ -0,0 +1,13 @@ +const popupService = require('../../service/popup.service'); + +const getPopupData = async (req, res) => { + try { + const { userId } = req.body; + const popupData = await popupService.getPopups(userId); + res.status(200).json(popupData); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}; + +module.exports = { getPopupData }; diff --git a/backend/src/controllers/onboard/tourData.controller.js b/backend/src/controllers/onboard/tourData.controller.js new file mode 100644 index 00000000..3a2ce68f --- /dev/null +++ b/backend/src/controllers/onboard/tourData.controller.js @@ -0,0 +1,13 @@ +const tourService = require('../service/tour.service'); + +const getTourData = async (req, res) => { + try { + const { userId } = req.body; + const tourData = await tourService.getTourData(userId); + res.status(200).json(tourData); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}; + +module.exports = { getTourData }; diff --git a/backend/src/middleware/onboard.middleware.js b/backend/src/middleware/onboard.middleware.js new file mode 100644 index 00000000..fd5a79e7 --- /dev/null +++ b/backend/src/middleware/onboard.middleware.js @@ -0,0 +1,35 @@ +const db = require('../models'); +const { v4: uuidv4 } = require('uuid'); + +// Middleware to validate API ID +const validateApiId = async (req, res, next) => { + const { apiId } = req.query; // Assume API ID is sent in query params + if (!apiId) { + return res.status(400).json({ error: "API ID is required." }); + } + + try { + const user = await db.User.findOne({ where: { apiId } }); // API ID must be in User model + if (!user) { + return res.status(403).json({ error: "Invalid API ID." }); + } + + req.user = user; // Attach the user to the request for future use + next(); + } catch (error) { + return res.status(500).json({ error: "API ID validation failed." }); + } +}; + +// Middleware to generate client ID for each session +const generateClientId = (req, res, next) => { + if (!req.session.clientId) { + req.session.clientId = uuidv4(); // Generate new client ID and store in session + } + next(); +}; + +module.exports = { + validateApiId, + generateClientId +}; diff --git a/backend/src/routes/onboard.routes.js b/backend/src/routes/onboard.routes.js new file mode 100644 index 00000000..de26f64f --- /dev/null +++ b/backend/src/routes/onboard.routes.js @@ -0,0 +1,15 @@ +const express = require("express"); +const { validateApiId, generateClientId } = require("../middleware/onboard.middleware"); +const onboardControllers = require("../controllers/onboard"); + +const router = express.Router(); + +router.use(validateApiId); +router.use(generateClientId); + +// router.get("/banner", onboardControllers.bannerData.getBannerData); +router.get("/popup", onboardControllers.popupData.getPopupData); +// router.get("/tour", onboardControllers.tourData.getTourData); +// router.get("/hint", onboardControllers.hintData.getHintData); + +module.exports = router; diff --git a/backend/src/routes/script.routes.js b/backend/src/routes/script.routes.js new file mode 100644 index 00000000..e69de29b diff --git a/backend/src/scripts/popup.script.js b/backend/src/scripts/popup.script.js new file mode 100644 index 00000000..e69de29b diff --git a/backend/src/service/popup.service.js b/backend/src/service/popup.service.js index 125ff94e..4a1497e3 100644 --- a/backend/src/service/popup.service.js +++ b/backend/src/service/popup.service.js @@ -54,6 +54,24 @@ class PopupService { throw new Error("Error retrieving popup by ID"); } } + + async getPopupByApiAndClientId(apiId, clientId) { + try { + return await Popup.findAll({ + include: [ + { + model: db.User, + as: "creator", + where: { apiId } + }, + ], + where: { clientId }, + order: [['createdAt', 'DESC']], + }); + } catch (error) { + throw new Error("Error retrieving popups for the given API and Client ID"); + } + } } module.exports = new PopupService(); From a191c35afc437280f0ac94a81729d03b2362eea4 Mon Sep 17 00:00:00 2001 From: thomastepi Date: Fri, 18 Oct 2024 22:30:19 -0400 Subject: [PATCH 002/178] create hint design, refactor RichTextEditor --- .../Preview/PreviewComponent.jsx | 47 ----------------- .../RichTextEditor/RichTextEditor.jsx | 46 ++++------------ frontend/src/products/Hint/HintComponent.jsx | 52 +++++++++++++++++++ .../Hint/hintComponent.css} | 29 ++++++----- frontend/src/scenes/hints/CreateHintPage.jsx | 17 +++--- frontend/src/scenes/hints/HintDefaultPage.jsx | 2 +- 6 files changed, 89 insertions(+), 104 deletions(-) delete mode 100644 frontend/src/components/RichTextEditor/Preview/PreviewComponent.jsx create mode 100644 frontend/src/products/Hint/HintComponent.jsx rename frontend/src/{components/RichTextEditor/Preview/PreviewComponent.css => products/Hint/hintComponent.css} (55%) diff --git a/frontend/src/components/RichTextEditor/Preview/PreviewComponent.jsx b/frontend/src/components/RichTextEditor/Preview/PreviewComponent.jsx deleted file mode 100644 index 87f03265..00000000 --- a/frontend/src/components/RichTextEditor/Preview/PreviewComponent.jsx +++ /dev/null @@ -1,47 +0,0 @@ -import React from "react"; -// import { Button } from "@mui/material"; -import DOMPurify from "dompurify"; -import "./PreviewComponent.css"; -import CloseOutlinedIcon from '@mui/icons-material/CloseOutlined'; -import Button from "../../Button/Button"; - -const PreviewComponent = ({ header, - content, - previewBtnText, - headerBackgroundColor, - headerColor, - textColor, - buttonBackgroundColor, - buttonTextColor }) => { - - return ( - <> -
- {header && ( -
-

{header}

- -
- )} -
-
- {previewBtnText && ( - - )} -
-
- - ); -}; - -export default PreviewComponent; diff --git a/frontend/src/components/RichTextEditor/RichTextEditor.jsx b/frontend/src/components/RichTextEditor/RichTextEditor.jsx index 124b7ec0..6cf59798 100644 --- a/frontend/src/components/RichTextEditor/RichTextEditor.jsx +++ b/frontend/src/components/RichTextEditor/RichTextEditor.jsx @@ -1,4 +1,5 @@ -import React, { useState, useEffect } from "react"; +import React, { useState } from "react"; +import PropTypes from "prop-types"; import "./RichTextEditor.css"; import { useEditor, EditorContent } from "@tiptap/react"; import { StarterKit } from "@tiptap/starter-kit"; @@ -7,37 +8,16 @@ import Link from "@tiptap/extension-link"; import BulletList from "@tiptap/extension-bullet-list"; import OrderedList from "@tiptap/extension-ordered-list"; import Toolbar from "./Toolbar/EditorToolbar"; -import PreviewComponent from "./Preview/PreviewComponent"; import EditorTabs from "./Tabs/EditorTabs"; import CustomTextField from "../TextFieldComponents/CustomTextField/CustomTextField"; -const RichTextEditor = ({ - previewBtnText, - content: initialContent, - setContent: initialSetContent, - header: initialHeader, - setHeader: initialSetHeader, - headerBackgroundColor, - headerColor, - textColor, - buttonBackgroundColor, - buttonTextColor, - sx, -}) => { +const RichTextEditor = ({ sx = {}, previewComponent = null }) => { const [htmlContent, setHtmlContent] = useState(""); const [mode, setMode] = useState("editor"); - const [content, setContent] = useState(initialContent ?? ""); - const [header, setHeader] = useState(initialHeader ?? ""); - - useEffect(() => { - if (initialSetContent) initialSetContent(content); - }, [content]); + const [header, setHeader] = useState(""); const handleHeaderChange = (e) => { - const newHeader = e.target.value; - setHeader(newHeader); - if (initialSetHeader) initialSetHeader(newHeader); - console.log(header); + setHeader(e.target.value); }; const editor = useEditor({ @@ -77,20 +57,16 @@ const RichTextEditor = ({
) : ( - + React.cloneElement(previewComponent, { header, htmlContent }) )} ); }; +RichTextEditor.propTypes = { + sx: PropTypes.object, + previewComponent: PropTypes.node.isRequired, +}; + export default RichTextEditor; diff --git a/frontend/src/products/Hint/HintComponent.jsx b/frontend/src/products/Hint/HintComponent.jsx new file mode 100644 index 00000000..ab103268 --- /dev/null +++ b/frontend/src/products/Hint/HintComponent.jsx @@ -0,0 +1,52 @@ +import React from "react"; +import DOMPurify from "dompurify"; +import "./hintComponent.css"; +import Button from "../../components/Button/Button"; + +const HintComponent = ({ + header, + htmlContent, + previewBtnText, + headerBackgroundColor, + headerColor, + textColor, + buttonBackgroundColor, + buttonTextColor, +}) => { + return ( + <> +
+ {header && ( +
+

{header}

+
+ )} +
+
+ {previewBtnText && ( + + )} +
+
+ + ); +}; + +export default HintComponent; diff --git a/frontend/src/components/RichTextEditor/Preview/PreviewComponent.css b/frontend/src/products/Hint/hintComponent.css similarity index 55% rename from frontend/src/components/RichTextEditor/Preview/PreviewComponent.css rename to frontend/src/products/Hint/hintComponent.css index ff3147ba..ed079c5e 100644 --- a/frontend/src/components/RichTextEditor/Preview/PreviewComponent.css +++ b/frontend/src/products/Hint/hintComponent.css @@ -1,17 +1,23 @@ .preview-container { + width: 70%; + height: 60%; border: 1px solid var(--light-border-color); margin-top: 1rem; overflow: auto; + display: flex; + flex-direction: column; + word-wrap: break-word; } -.preview-content{ - padding: 12px 15px; +.preview-content { color: var(--second-text-color); font-size: 13px; + padding: 0 2rem; } .preview-content p { - margin: 0.5rem 0; + margin: 0.1rem 0; + line-height: 24px; } .preview-container h3 { @@ -19,21 +25,16 @@ font-weight: 600; line-height: 30px; text-align: left; + padding: 0 2rem; } .preview-button-container { display: flex; justify-content: flex-end; - margin-top: 5rem; + margin-top: 0.5rem; + padding: 0 2rem; } -.header { - font-size: 20px; - font-weight: bold; - background-color: var(--header-background); - border-bottom: 1px solid var(--light-border-color); - display: flex; - justify-content: space-between; - align-items: center; - padding: 0 20px; -} +.preview-button-container button { + margin: 0; +} \ No newline at end of file diff --git a/frontend/src/scenes/hints/CreateHintPage.jsx b/frontend/src/scenes/hints/CreateHintPage.jsx index 8b2eca57..807d7d77 100644 --- a/frontend/src/scenes/hints/CreateHintPage.jsx +++ b/frontend/src/scenes/hints/CreateHintPage.jsx @@ -3,6 +3,7 @@ import GuideTemplate from "../../templates/GuideTemplate/GuideTemplate"; import RichTextEditor from "../../components/RichTextEditor/RichTextEditor"; import HintLeftContent from "../../components/HintPageComponents/HintLeftContent/HintLeftContent"; import HintLeftAppearance from "../../components/HintPageComponents/HintLeftAppearance/HintLeftAppearance"; +import HintComponent from "../../products/Hint/HintComponent"; const HintPage = () => { const [activeButton, setActiveButton] = useState(0); @@ -16,7 +17,7 @@ const HintPage = () => { setActiveButton(index); }; - const [headerBackgroundColor, setHeaderBackgroundColor] = useState("#F8F9F8"); + const [headerBackgroundColor, setHeaderBackgroundColor] = useState("#FFFFFF"); const [headerColor, setHeaderColor] = useState("#101828"); const [textColor, setTextColor] = useState("#344054"); const [buttonBackgroundColor, setButtonBackgroundColor] = useState("#7F56D9"); @@ -54,18 +55,20 @@ const HintPage = () => { handleButtonClick={handleButtonClick} rightContent={() => ( } /> )} leftContent={() => ( diff --git a/frontend/src/scenes/hints/HintDefaultPage.jsx b/frontend/src/scenes/hints/HintDefaultPage.jsx index ddc5351a..c70bcb79 100644 --- a/frontend/src/scenes/hints/HintDefaultPage.jsx +++ b/frontend/src/scenes/hints/HintDefaultPage.jsx @@ -18,7 +18,7 @@ const mockHints = [ const HintDefaultPage = () => { const navigate = useNavigate(); - + return ( mockHints} From e66f26c22ed27e45e7cd59d48503f6704b7315bd Mon Sep 17 00:00:00 2001 From: thomastepi Date: Fri, 18 Oct 2024 23:54:52 -0400 Subject: [PATCH 003/178] modify hintComponent.css --- frontend/src/products/Hint/hintComponent.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/frontend/src/products/Hint/hintComponent.css b/frontend/src/products/Hint/hintComponent.css index aeaf5986..4fd7b0ab 100644 --- a/frontend/src/products/Hint/hintComponent.css +++ b/frontend/src/products/Hint/hintComponent.css @@ -9,6 +9,14 @@ word-wrap: break-word; } +.preview-container h3 { + font-size: 20px; + font-weight: 600; + line-height: 30px; + text-align: left; + padding: 0 2rem; +} + .preview-content { color: var(--second-text-color); font-size: 13px; From 52f58982839adc386e3320a0e536581c32a391b2 Mon Sep 17 00:00:00 2001 From: thomastepi Date: Sat, 26 Oct 2024 21:39:00 -0400 Subject: [PATCH 004/178] refactor preview component --- .../RichTextEditor/RichTextEditor.jsx | 4 +- frontend/src/products/Hint/HintComponent.jsx | 4 +- frontend/src/products/Hint/hintComponent.css | 8 +- .../src/products/Popup/PopupComponent.jsx | 33 ++++---- frontend/src/scenes/hints/CreateHintPage.jsx | 24 ++++-- frontend/src/scenes/popup/CreatePopupPage.jsx | 84 +++++++++++-------- 6 files changed, 94 insertions(+), 63 deletions(-) diff --git a/frontend/src/components/RichTextEditor/RichTextEditor.jsx b/frontend/src/components/RichTextEditor/RichTextEditor.jsx index 5fc71e30..2d82e731 100644 --- a/frontend/src/components/RichTextEditor/RichTextEditor.jsx +++ b/frontend/src/components/RichTextEditor/RichTextEditor.jsx @@ -16,6 +16,8 @@ const RichTextEditor = ({ sx = {}, previewComponent = null }) => { const [mode, setMode] = useState("editor"); const [header, setHeader] = useState(""); + const Preview = previewComponent; + const handleHeaderChange = (e) => { setHeader(e.target.value); }; @@ -57,7 +59,7 @@ const RichTextEditor = ({ sx = {}, previewComponent = null }) => {
) : ( - React.cloneElement(previewComponent, { header, htmlContent }) + )}
{previewBtnText && ( diff --git a/frontend/src/products/Hint/hintComponent.css b/frontend/src/products/Hint/hintComponent.css index 4fd7b0ab..85215f95 100644 --- a/frontend/src/products/Hint/hintComponent.css +++ b/frontend/src/products/Hint/hintComponent.css @@ -1,12 +1,14 @@ .preview-container { - width: 70%; - height: 60%; + width: 100%; + max-width: 400px; + max-height: 250px; border: 1px solid var(--light-border-color); margin-top: 1rem; overflow: auto; display: flex; flex-direction: column; word-wrap: break-word; + box-sizing: border-box; } .preview-container h3 { @@ -31,6 +33,8 @@ .preview-button-container { margin-top: 0.5rem; padding: 0 2rem; + display: flex; + justify-content: flex-end; } .preview-button-container button { diff --git a/frontend/src/products/Popup/PopupComponent.jsx b/frontend/src/products/Popup/PopupComponent.jsx index 8a0023c5..0e205dac 100644 --- a/frontend/src/products/Popup/PopupComponent.jsx +++ b/frontend/src/products/Popup/PopupComponent.jsx @@ -16,12 +16,14 @@ const PopupComponent = ({ buttonAction, popupSize, actionButtonUrl, - isReal + isReal, }) => { const [isVisible, setIsVisible] = useState(true); const validSizes = ["small", "medium", "large"]; - const sizeClass = validSizes.includes(popupSize.toLowerCase()) ? styles[popupSize.toLowerCase()] : ''; - const centeredClass = isReal ? styles.centered : ''; + const sizeClass = validSizes.includes(popupSize.toLowerCase()) + ? styles[popupSize.toLowerCase()] + : ""; + const centeredClass = isReal ? styles.centered : ""; const handleClose = () => { if (isReal) { @@ -30,12 +32,12 @@ const PopupComponent = ({ }; const handleButtonClick = () => { - if (buttonAction === 'close the popup') { + if (buttonAction === "close the popup") { handleClose(); - } else if (buttonAction === 'open url') { - window.open(actionButtonUrl, '_self'); - } else if (buttonAction === 'open url in new page') { - window.open(actionButtonUrl, '_blank'); + } else if (buttonAction === "open url") { + window.open(actionButtonUrl, "_self"); + } else if (buttonAction === "open url in new page") { + window.open(actionButtonUrl, "_blank"); } }; @@ -49,12 +51,15 @@ const PopupComponent = ({ {header && (
-

{header}

- {header} +
)} @@ -70,7 +75,7 @@ const PopupComponent = ({ style={{ backgroundColor: buttonBackgroundColor, color: buttonTextColor, - margin: '1rem' + margin: "1rem", }} text={previewBtnText} onClick={handleButtonClick} // Add onClick handler diff --git a/frontend/src/scenes/hints/CreateHintPage.jsx b/frontend/src/scenes/hints/CreateHintPage.jsx index 807d7d77..81f6384a 100644 --- a/frontend/src/scenes/hints/CreateHintPage.jsx +++ b/frontend/src/scenes/hints/CreateHintPage.jsx @@ -50,7 +50,7 @@ const HintPage = () => { return ( ( @@ -61,14 +61,20 @@ const HintPage = () => { marginLeft: "2.5rem", marginTop: "1rem", }} - previewComponent={} + previewComponent={({ header, content }) => { + return ( + + ); + }} /> )} leftContent={() => ( diff --git a/frontend/src/scenes/popup/CreatePopupPage.jsx b/frontend/src/scenes/popup/CreatePopupPage.jsx index 6578a724..6a3771b8 100644 --- a/frontend/src/scenes/popup/CreatePopupPage.jsx +++ b/frontend/src/scenes/popup/CreatePopupPage.jsx @@ -2,6 +2,7 @@ import React, { useState, useEffect } from 'react'; import { useNavigate, useLocation } from 'react-router-dom'; import GuideTemplate from '../../templates/GuideTemplate/GuideTemplate'; import RichTextEditor from '../../components/RichTextEditor/RichTextEditor'; +import PopupComponent from "../../products/Popup/PopupComponent"; import PopupAppearance from '../../components/PopupPageComponents/PopupAppearance/PopupAppearance'; import PopupContent from '../../components/PopupPageComponents/PopupContent/PopupContent'; import { addPopup, getPopupById, editPopup } from '../../services/popupServices'; @@ -101,41 +102,54 @@ const CreatePopupPage = () => { }; return ( - - } - leftContent={() => - } - leftAppearance={() => ( - - )} /> + ( + ( + + )} + sx={{ + width: "100%", + maxWidth: "700px", + marginLeft: "2.5rem", + marginTop: "1rem", + }} + /> + )} + leftContent={() => ( + + )} + leftAppearance={() => ( + + )} + /> ); }; From 4bcc4f257204ac299866ce74f343355a6f2612d8 Mon Sep 17 00:00:00 2001 From: thomastepi Date: Tue, 5 Nov 2024 03:29:18 -0500 Subject: [PATCH 005/178] convert in-page designs to modal --- frontend/src/App.jsx | 12 +- .../HintLeftAppearance/HintLeftAppearance.css | 1 + .../HintLeftContent/HintLeftContent.css | 2 +- .../HintLeftContent/HintLeftContent.jsx | 13 +- .../RichTextEditor/RichTextEditor.css | 3 +- .../RichTextEditor/RichTextEditor.jsx | 4 +- .../RichTextEditor/Tabs/EditorTabs.css | 4 + .../RichTextEditor/Toolbar/EditorToolbar.css | 1 - .../CustomTextField/CustomTextField.jsx | 74 +++++----- frontend/src/products/Hint/hintComponent.css | 1 + frontend/src/scenes/hints/CreateHintPage.jsx | 33 ++--- frontend/src/scenes/hints/HintDefaultPage.jsx | 30 ++-- frontend/src/scenes/login/Login.module.css | 2 +- .../src/scenes/popup/PopupDefaultPage.jsx | 29 ++-- .../templates/GuideTemplate/GuideTemplate.jsx | 133 +++++++++++------- .../GuideTemplate/GuideTemplate.module.scss | 4 +- .../GuideTemplate/GuideTemplateContext.jsx | 18 +++ 17 files changed, 213 insertions(+), 151 deletions(-) create mode 100644 frontend/src/templates/GuideTemplate/GuideTemplateContext.jsx diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 062f50b7..c0de02f9 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -14,17 +14,18 @@ import BannerDefaultPage from "./scenes/banner/BannerDefaultPage"; import LinksDefaultPage from "./scenes/links/LinksDefaultPage"; import ToursDefaultPage from "./scenes/tours/ToursDefaultPage"; import PopupDefaultPage from "./scenes/popup/PopupDefaultPage"; -import CreateHintPage from "./scenes/hints/CreateHintPage"; import HintDefaultPage from "./scenes/hints/HintDefaultPage"; import CreatePopupPage from "./scenes/popup/CreatePopupPage"; import { Error404 } from "./scenes/errors/404"; import { Error403 } from "./scenes/errors/403"; import HomePageTemplate from "./templates/HomePageTemplate/HomePageTemplate"; +import { GuideTemplateProvider } from "./templates/GuideTemplate/GuideTemplateContext"; + const App = () => { return ( - <> + }> } /> @@ -34,7 +35,6 @@ const App = () => { } /> } /> } /> - } /> } /> } /> @@ -47,6 +47,7 @@ const App = () => { } /> + } /> } /> } /> @@ -54,13 +55,12 @@ const App = () => { } /> } /> } /> - } /> } /> + } /> } /> } /> - - + ); } diff --git a/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css b/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css index da8d157f..2b027786 100644 --- a/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css +++ b/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css @@ -4,6 +4,7 @@ align-items: flex-start; flex: 1; color: var(--main-text-color); + width: 241px; } .hint-state-name { diff --git a/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.css b/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.css index d4663b6e..87c7adec 100644 --- a/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.css +++ b/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.css @@ -10,5 +10,5 @@ .hint-label { font-weight: 400; font-size: var(--font-regular); - margin-top: 1.5rem; + margin-top: 0.5rem; } \ No newline at end of file diff --git a/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.jsx b/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.jsx index 384a6619..38f68d78 100644 --- a/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.jsx +++ b/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.jsx @@ -4,22 +4,23 @@ import CustomTextField from "../../TextFieldComponents/CustomTextField/CustomTex import "./HintLeftContent.css"; const HintLeftContent = ({ setLeftContentFormData, formData }) => { - const handleChange = (name) => (e) => { setLeftContentFormData({ ...formData, [name]: e.target.value }); }; return (
-

Action

+

+ Action +

-

+

Action button url (can be relative)

@@ -27,7 +28,7 @@ const HintLeftContent = ({ setLeftContentFormData, formData }) => { Action button text @@ -35,7 +36,7 @@ const HintLeftContent = ({ setLeftContentFormData, formData }) => { Target Element { labelText="Header" labelFontWeight={600} inputHeight="40px" - TextFieldWidth={"100%"} + TextFieldWidth="100%" value={header} onChange={handleHeaderChange} style={{ marginBottom: "2rem" }} @@ -73,7 +73,7 @@ const RichTextEditor = ({ sx = {}, previewComponent = null }) => { RichTextEditor.propTypes = { sx: PropTypes.object, - previewComponent: PropTypes.node.isRequired, + previewComponent: PropTypes.elementType.isRequired, }; export default RichTextEditor; diff --git a/frontend/src/components/RichTextEditor/Tabs/EditorTabs.css b/frontend/src/components/RichTextEditor/Tabs/EditorTabs.css index 4e174a97..c072971c 100644 --- a/frontend/src/components/RichTextEditor/Tabs/EditorTabs.css +++ b/frontend/src/components/RichTextEditor/Tabs/EditorTabs.css @@ -4,6 +4,10 @@ width: fit-content; } +.editor-tabs.css-11keaam-MuiTabs-root { + top: 350px!important; +} + .tab[aria-selected="true"] { background-color: var(--main-purple); color: white !important; diff --git a/frontend/src/components/RichTextEditor/Toolbar/EditorToolbar.css b/frontend/src/components/RichTextEditor/Toolbar/EditorToolbar.css index 17ee239b..10dddd63 100644 --- a/frontend/src/components/RichTextEditor/Toolbar/EditorToolbar.css +++ b/frontend/src/components/RichTextEditor/Toolbar/EditorToolbar.css @@ -1,7 +1,6 @@ .toolbar-container { display: flex; gap: 16px; - /* justify-content: space-between; */ align-items: center; width: 70%; } diff --git a/frontend/src/components/TextFieldComponents/CustomTextField/CustomTextField.jsx b/frontend/src/components/TextFieldComponents/CustomTextField/CustomTextField.jsx index d09c1124..3ce934d1 100644 --- a/frontend/src/components/TextFieldComponents/CustomTextField/CustomTextField.jsx +++ b/frontend/src/components/TextFieldComponents/CustomTextField/CustomTextField.jsx @@ -1,7 +1,7 @@ import React from "react"; import PropTypes from "prop-types"; import { TextField, InputLabel } from "@mui/material"; -import CheckCircleIcon from '@mui/icons-material/CheckCircle'; +import CheckCircleIcon from "@mui/icons-material/CheckCircle"; import ChipAdornment from "../Chips/ChipAdornment"; import "./CustomTextFieldStyles.css"; @@ -12,7 +12,7 @@ const CustomTextField = ({ displayCheckCircleIcon = false, labelText = "", value = "", - onChange = () => { }, + onChange = () => {}, helperText = "", error = false, multiline = false, @@ -28,33 +28,34 @@ const CustomTextField = ({ type = "text", required = false, style, - labelSubText, + labelSubText = "", disabled = false, - autofocus = false + autofocus = false, }) => { return (
- {!checkCircleIconVisible && + {!checkCircleIconVisible && (
- {labelText} - {labelSubText && {labelSubText}} -
- } - {checkCircleIconVisible && -
- {displayCheckCircleIcon && } - {labelText} - {labelSubText && {labelSubText}} -
- } + {labelText} + {labelSubText && {labelSubText}} +
+ )} + {checkCircleIconVisible && ( +
+ {displayCheckCircleIcon && } + {labelText} + {labelSubText && {labelSubText}} +
+ )} + 0 && { - startAdornment: , - }), - }} - inputProps={{ - style: { - height: inputHeight, - paddingTop: 0, - paddingBottom: 0, + slotProps={{ + formHelperText: { + style: { marginLeft: 0, paddingTop: 1 }, + }, + textField: { + InputProps: { + height: inputHeight, + }, + }, + input: { + style: { + height: inputHeight, + paddingTop: 0, + paddingBottom: 0, + }, + startAdornment: startAdornment, + endAdornment: endAdornment, + ...(chips && + chips.length > 0 && { + startAdornment: , + }), }, - }} - FormHelperTextProps={{ - sx: { margin: 0, paddingTop: 1 }, }} />
diff --git a/frontend/src/products/Hint/hintComponent.css b/frontend/src/products/Hint/hintComponent.css index 85215f95..5d710d1a 100644 --- a/frontend/src/products/Hint/hintComponent.css +++ b/frontend/src/products/Hint/hintComponent.css @@ -9,6 +9,7 @@ flex-direction: column; word-wrap: break-word; box-sizing: border-box; + box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.2); } .preview-container h3 { diff --git a/frontend/src/scenes/hints/CreateHintPage.jsx b/frontend/src/scenes/hints/CreateHintPage.jsx index 81f6384a..f3fc0408 100644 --- a/frontend/src/scenes/hints/CreateHintPage.jsx +++ b/frontend/src/scenes/hints/CreateHintPage.jsx @@ -8,8 +8,8 @@ import HintComponent from "../../products/Hint/HintComponent"; const HintPage = () => { const [activeButton, setActiveButton] = useState(0); const [leftContentFormData, setLeftContentFormData] = useState({ - actionButtonUrl: "https//", - actionButtonText: "", + actionButtonUrl: "https://", + actionButtonText: "Take me to subscribe page", targetElement: ".element", }); @@ -56,25 +56,22 @@ const HintPage = () => { rightContent={() => ( { - return ( - - ); - }} + previewComponent={({ header, content }) => ( + + )} /> )} leftContent={() => ( diff --git a/frontend/src/scenes/hints/HintDefaultPage.jsx b/frontend/src/scenes/hints/HintDefaultPage.jsx index e9cfd362..38a04af3 100644 --- a/frontend/src/scenes/hints/HintDefaultPage.jsx +++ b/frontend/src/scenes/hints/HintDefaultPage.jsx @@ -1,7 +1,8 @@ import React from "react"; import DefaultPageTemplate from "../../templates/DefaultPageTemplate/DefaultPageTemplate"; +import CreateHintPage from "./CreateHintPage"; import { ACTIVITY_TYPES_INFO } from "../../data/guideMainPageData"; -import { useNavigate } from "react-router"; +import { useDialog } from "../../templates/GuideTemplate/GuideTemplateContext"; const mockHints = [ { @@ -17,20 +18,23 @@ const mockHints = [ ]; const HintDefaultPage = () => { - const navigate = useNavigate(); + const { openDialog } = useDialog(); return ( - mockHints} - deleteItem={() => {}} - navigateToCreate={() => navigate("/hint/create")} - itemType={ACTIVITY_TYPES_INFO.HINTS} - itemTypeInfo={ACTIVITY_TYPES_INFO.HINTS} - getItemDetails={(hint) => ({ - title: hint.title, - text: hint.text, - })} - /> + <> + mockHints} + deleteItem={() => {}} + navigateToCreate={openDialog} + itemType={ACTIVITY_TYPES_INFO.HINTS} + itemTypeInfo={ACTIVITY_TYPES_INFO.HINTS} + getItemDetails={(hint) => ({ + title: hint.title, + text: hint.text, + })} + /> + + ); }; diff --git a/frontend/src/scenes/login/Login.module.css b/frontend/src/scenes/login/Login.module.css index ed2c76cf..5676660d 100644 --- a/frontend/src/scenes/login/Login.module.css +++ b/frontend/src/scenes/login/Login.module.css @@ -47,7 +47,7 @@ .form-group input[type="password"], .form-group input[type="surname"] { width: 100%; - padding: 8px 12px; + /* padding: 8px 12px; */ border: 1px solid #D0D5DD; border-radius: 8px; font-size: var(--font-regular); diff --git a/frontend/src/scenes/popup/PopupDefaultPage.jsx b/frontend/src/scenes/popup/PopupDefaultPage.jsx index 4763cb77..ef0c9b05 100644 --- a/frontend/src/scenes/popup/PopupDefaultPage.jsx +++ b/frontend/src/scenes/popup/PopupDefaultPage.jsx @@ -1,30 +1,31 @@ import React from 'react'; import DefaultPageTemplate from '../../templates/DefaultPageTemplate/DefaultPageTemplate'; +import CreatePopupPage from './CreatePopupPage'; import { getPopups, deletePopup } from '../../services/popupServices'; -import { useNavigate } from 'react-router-dom'; import { ACTIVITY_TYPES_INFO } from '../../data/guideMainPageData'; +import { useDialog } from "../../templates/GuideTemplate/GuideTemplateContext"; const PopupDefaultPage = () => { - const navigate = useNavigate(); + const { openDialog } = useDialog(); const getPopupDetails = (popup) => ({ title: `Popup ${popup.id}`, text: popup.header, }); - const navigateToCreate = (state) => { - navigate('/popup/create', state); - }; - return ( - + <> + + + + ); }; diff --git a/frontend/src/templates/GuideTemplate/GuideTemplate.jsx b/frontend/src/templates/GuideTemplate/GuideTemplate.jsx index 6752cf59..b5168690 100644 --- a/frontend/src/templates/GuideTemplate/GuideTemplate.jsx +++ b/frontend/src/templates/GuideTemplate/GuideTemplate.jsx @@ -1,59 +1,90 @@ -import { React } from 'react'; -import PropTypes from 'prop-types'; -import CloseOutlinedIcon from '@mui/icons-material/CloseOutlined'; -import styles from './GuideTemplate.module.scss'; -import classNames from 'classnames'; -import Button from '../../components/Button/Button'; -import { useNavigate } from 'react-router-dom'; +import { React } from "react"; +import PropTypes from "prop-types"; +import CloseOutlinedIcon from "@mui/icons-material/CloseOutlined"; +import { Dialog } from "@mui/material"; +import styles from "./GuideTemplate.module.scss"; +import classNames from "classnames"; +import Button from "../../components/Button/Button"; +import { useNavigate } from "react-router-dom"; +import { useDialog } from "./GuideTemplateContext"; -const GuideTemplate = ({ title = '', handleButtonClick = () => null, activeButton = 0, leftContent = () => null, rightContent = () => null, leftAppearance = () => null, onSave= () => null, contentType = "/" }) => { - const navigate = useNavigate(); - const buttons = ['Content', 'Appearance']; - return ( -
-
-
- {title} - navigate(`/${contentType}`)} /> -
-
- {/* Content and Appereance buttons */} -
- {buttons.map((buttonName, index) => ( - - ))} -
-
- {activeButton === 1 ? leftAppearance() : leftContent()} - {rightContent()} -
-
-
-
+const GuideTemplate = ({ + title = "", + handleButtonClick = () => null, + activeButton = 0, + leftContent = () => null, + rightContent = () => null, + leftAppearance = () => null, + onSave = () => null, +}) => { + const { isOpen, closeDialog } = useDialog(); + const navigate = useNavigate(); + const buttons = ["Content", "Appearance"]; + return ( + +
+
+
+ {title} + +
+
+ {/* Content and Appereance buttons */} +
+ {buttons.map((buttonName, index) => ( + + ))}
- +
+ {activeButton === 1 ? leftAppearance() : leftContent()} + {rightContent()} +
+
+
+
- ); +
+
+ ); }; GuideTemplate.propTypes = { - title: PropTypes.string, - handleButtonClick: PropTypes.func, - activeButton: PropTypes.number, - leftContent: PropTypes.func, - rightContent: PropTypes.func, - leftAppearance: PropTypes.func, - onSave: PropTypes.func, + title: PropTypes.string, + handleButtonClick: PropTypes.func, + activeButton: PropTypes.number, + leftContent: PropTypes.func, + rightContent: PropTypes.func, + leftAppearance: PropTypes.func, + onSave: PropTypes.func, }; -export default GuideTemplate; \ No newline at end of file +export default GuideTemplate; diff --git a/frontend/src/templates/GuideTemplate/GuideTemplate.module.scss b/frontend/src/templates/GuideTemplate/GuideTemplate.module.scss index 384a5034..d8d0f545 100644 --- a/frontend/src/templates/GuideTemplate/GuideTemplate.module.scss +++ b/frontend/src/templates/GuideTemplate/GuideTemplate.module.scss @@ -1,10 +1,10 @@ @use '../../styles/globals.scss' as *; + .container { background-color: var(--background-color); box-sizing: border-box; - padding: 50px 150px 10px 110px; width: 100%; .popup { @@ -45,8 +45,8 @@ .optionButtons { display: flex; justify-content: flex-end; - margin-top: 2rem; gap: 1rem; + margin-top: 1rem; } diff --git a/frontend/src/templates/GuideTemplate/GuideTemplateContext.jsx b/frontend/src/templates/GuideTemplate/GuideTemplateContext.jsx new file mode 100644 index 00000000..53b7e971 --- /dev/null +++ b/frontend/src/templates/GuideTemplate/GuideTemplateContext.jsx @@ -0,0 +1,18 @@ +import React, { createContext, useContext, useState } from "react"; + +const GuideTemplateContext = createContext(); + +export const useDialog = () => useContext(GuideTemplateContext); + +export const GuideTemplateProvider = ({ children }) => { + const [isOpen, setIsOpen] = useState(false); + + const openDialog = () => setIsOpen(true); + const closeDialog = () => setIsOpen(false); + + return ( + + {children} + + ); +}; From 44f8ad2b1bc5bf874be2c76d58c36e5441f095a4 Mon Sep 17 00:00:00 2001 From: thomastepi Date: Sun, 10 Nov 2024 21:28:18 -0500 Subject: [PATCH 006/178] fix poopup dialog overflow --- .../HintLeftAppearance/HintLeftAppearance.css | 2 +- .../RichTextEditor/RichTextEditor.css | 1 + .../RichTextEditor/RichTextEditor.jsx | 27 +++++++++------ .../RichTextEditor/Tabs/EditorTabs.css | 8 ++++- frontend/src/scenes/hints/CreateHintPage.jsx | 21 ++++++------ frontend/src/scenes/popup/CreatePopupPage.jsx | 33 ++++++++++++++----- .../templates/GuideTemplate/GuideTemplate.jsx | 6 ++-- .../GuideTemplate/GuideTemplate.module.scss | 4 ++- .../GuideTemplate/GuideTemplateContext.jsx | 8 ++++- .../CustomTextField.test.jsx | 2 +- .../scenes/popup/CreatePopupPage.test.jsx | 25 ++++++-------- 11 files changed, 84 insertions(+), 53 deletions(-) diff --git a/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css b/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css index 2b027786..37d3a6f9 100644 --- a/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css +++ b/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css @@ -4,7 +4,6 @@ align-items: flex-start; flex: 1; color: var(--main-text-color); - width: 241px; } .hint-state-name { @@ -17,4 +16,5 @@ .hint-appearance-color { display: flex; align-items: center; + width: 241px; } diff --git a/frontend/src/components/RichTextEditor/RichTextEditor.css b/frontend/src/components/RichTextEditor/RichTextEditor.css index 48a756a5..723272b7 100644 --- a/frontend/src/components/RichTextEditor/RichTextEditor.css +++ b/frontend/src/components/RichTextEditor/RichTextEditor.css @@ -5,6 +5,7 @@ border-radius: 8px; padding-top: 1rem; margin-top: 1rem; + width: 466px; } .ProseMirror { diff --git a/frontend/src/components/RichTextEditor/RichTextEditor.jsx b/frontend/src/components/RichTextEditor/RichTextEditor.jsx index 61c0bc81..51cf8cd0 100644 --- a/frontend/src/components/RichTextEditor/RichTextEditor.jsx +++ b/frontend/src/components/RichTextEditor/RichTextEditor.jsx @@ -11,10 +11,14 @@ import Toolbar from "./Toolbar/EditorToolbar"; import EditorTabs from "./Tabs/EditorTabs"; import CustomTextField from "../TextFieldComponents/CustomTextField/CustomTextField"; -const RichTextEditor = ({ sx = {}, previewComponent = null }) => { - const [htmlContent, setHtmlContent] = useState(""); +const RichTextEditor = ({ + sx = {}, + previewComponent, + header, + setHeader, + setContent, +}) => { const [mode, setMode] = useState("editor"); - const [header, setHeader] = useState(""); const Preview = previewComponent; @@ -35,12 +39,12 @@ const RichTextEditor = ({ sx = {}, previewComponent = null }) => { OrderedList, ], onUpdate: ({ editor }) => { - setHtmlContent(editor.getHTML()); + setContent(editor.getHTML()); }, }); return ( -
+
{mode === "editor" ? ( <> {
) : ( - + )} - + }} + />
); }; diff --git a/frontend/src/components/RichTextEditor/Tabs/EditorTabs.css b/frontend/src/components/RichTextEditor/Tabs/EditorTabs.css index c072971c..039e5f97 100644 --- a/frontend/src/components/RichTextEditor/Tabs/EditorTabs.css +++ b/frontend/src/components/RichTextEditor/Tabs/EditorTabs.css @@ -2,10 +2,16 @@ border: 1px solid var(--light-border-color); border-radius: 5px; width: fit-content; + min-height: 34px!important; + margin-top: 15px; +} + +.editor-tabs button { + min-height: 34px!important; } .editor-tabs.css-11keaam-MuiTabs-root { - top: 350px!important; + position: static!important; } .tab[aria-selected="true"] { diff --git a/frontend/src/scenes/hints/CreateHintPage.jsx b/frontend/src/scenes/hints/CreateHintPage.jsx index 5f3b7d7a..47507aee 100644 --- a/frontend/src/scenes/hints/CreateHintPage.jsx +++ b/frontend/src/scenes/hints/CreateHintPage.jsx @@ -7,10 +7,11 @@ import HintLeftAppearance from "@components/HintPageComponents/HintLeftAppearanc import { addHint, getHintById, editHint } from '../../services/hintServices'; import toastEmitter, { TOAST_EMITTER_KEY } from "../../utils/toastEmitter"; import { emitToastError } from "../../utils/guideHelper"; -import { useNavigate, useLocation } from "react-router"; +import { useLocation } from "react-router"; +import { useDialog } from "../../templates/GuideTemplate/GuideTemplateContext"; const HintPage = () => { - const navigate = useNavigate(); + const { closeDialog } = useDialog(); const location = useLocation(); const [activeButton, setActiveButton] = useState(0); @@ -102,7 +103,7 @@ const HintPage = () => { : await addHint(hintData); const toastMessage = location?.state?.isEdit ? "You edited this hint" : "New hint saved"; toastEmitter.emit(TOAST_EMITTER_KEY, toastMessage); - navigate("/hint"); + closeDialog(); } catch (error) { const errorMessage = error.response?.data?.message ? `Error: ${error.response.data.message}` @@ -119,18 +120,16 @@ const HintPage = () => { onSave={onSave} rightContent={() => ( ( + header={header} + setHeader={setHeader} + setContent={setContent} + previewComponent={() => ( { - const navigate = useNavigate(); +const CreatePopupPage = ({autoOpen = false}) => { + const { openDialog, closeDialog } = useDialog(); const location = useLocation(); + useEffect(() => { + if (autoOpen) { // auto open dialog to run tests + openDialog(); + } + }, [autoOpen, openDialog]); + const [activeButton, setActiveButton] = useState(0); const [headerBackgroundColor, setHeaderBackgroundColor] = useState('#F8F9F8'); @@ -23,11 +30,18 @@ const CreatePopupPage = () => { const [header, setHeader] = useState(''); const [content, setContent] = useState(''); - + const [actionButtonUrl, setActionButtonUrl] = useState("https://"); const [actionButtonText, setActionButtonText] = useState("Take me to subscription page"); const [buttonAction, setButtonAction] = useState('No action'); const [popupSize, setPopupSize] = useState('Small'); + const [stablePopupSize, setStablePopupSize] = useState(''); + + useEffect(() => { + if (popupSize) { + setStablePopupSize(popupSize); // prevent passing empty string to PopupComponent + } + }, [popupSize]); const stateList = [ { stateName: 'Header Background Color', state: headerBackgroundColor, setState: setHeaderBackgroundColor }, @@ -86,7 +100,7 @@ const CreatePopupPage = () => { const toastMessage = location.state?.isEdit ? 'You edited this popup' : 'New popup Saved' toastEmitter.emit(TOAST_EMITTER_KEY, toastMessage) - navigate('/popup'); + closeDialog(); } catch (error) { const errorMessage = error.response?.data?.message ? `Error: ${error.response.data.message}` @@ -107,21 +121,22 @@ const CreatePopupPage = () => { onSave={onSave} rightContent={() => ( ( + previewComponent={() => ( )} + header={header} + setHeader={setHeader} + setContent={setContent} sx={{ width: "100%", maxWidth: "700px", diff --git a/frontend/src/templates/GuideTemplate/GuideTemplate.jsx b/frontend/src/templates/GuideTemplate/GuideTemplate.jsx index b5168690..a0e98e90 100644 --- a/frontend/src/templates/GuideTemplate/GuideTemplate.jsx +++ b/frontend/src/templates/GuideTemplate/GuideTemplate.jsx @@ -24,9 +24,9 @@ const GuideTemplate = ({
diff --git a/frontend/src/templates/GuideTemplate/GuideTemplate.module.scss b/frontend/src/templates/GuideTemplate/GuideTemplate.module.scss index d8d0f545..155a15ab 100644 --- a/frontend/src/templates/GuideTemplate/GuideTemplate.module.scss +++ b/frontend/src/templates/GuideTemplate/GuideTemplate.module.scss @@ -5,7 +5,8 @@ background-color: var(--background-color); box-sizing: border-box; - width: 100%; + min-width: 100%; + width: fit-content; .popup { height: 100%; @@ -47,6 +48,7 @@ justify-content: flex-end; gap: 1rem; margin-top: 1rem; + height: 34px; } diff --git a/frontend/src/templates/GuideTemplate/GuideTemplateContext.jsx b/frontend/src/templates/GuideTemplate/GuideTemplateContext.jsx index 53b7e971..7b482bea 100644 --- a/frontend/src/templates/GuideTemplate/GuideTemplateContext.jsx +++ b/frontend/src/templates/GuideTemplate/GuideTemplateContext.jsx @@ -2,7 +2,13 @@ import React, { createContext, useContext, useState } from "react"; const GuideTemplateContext = createContext(); -export const useDialog = () => useContext(GuideTemplateContext); +export const useDialog = () => { + const context = useContext(GuideTemplateContext); + if (context === undefined) { + throw new Error("useDialog must be used within a GuideTemplateProvider"); + } + return context; +}; export const GuideTemplateProvider = ({ children }) => { const [isOpen, setIsOpen] = useState(false); diff --git a/frontend/src/tests/components/textFieldComponent/CustomTextField.test.jsx b/frontend/src/tests/components/textFieldComponent/CustomTextField.test.jsx index b8fe2ace..e2cbbb4e 100644 --- a/frontend/src/tests/components/textFieldComponent/CustomTextField.test.jsx +++ b/frontend/src/tests/components/textFieldComponent/CustomTextField.test.jsx @@ -67,7 +67,7 @@ describe('CustomTextField', () => { it('renders with custom input height', () => { render(); - expect(screen.getByRole('textbox').style.height).toBe('50px'); + expect(screen.getByRole('textbox').closest('.MuiOutlinedInput-root').style.height).toBe('50px'); }); it('renders with custom label font weight', () => { diff --git a/frontend/src/tests/scenes/popup/CreatePopupPage.test.jsx b/frontend/src/tests/scenes/popup/CreatePopupPage.test.jsx index e5d86b09..e1ff38c1 100644 --- a/frontend/src/tests/scenes/popup/CreatePopupPage.test.jsx +++ b/frontend/src/tests/scenes/popup/CreatePopupPage.test.jsx @@ -6,6 +6,7 @@ import * as loginServices from '../../../services/loginServices'; import { BrowserRouter as Router, useLocation } from 'react-router-dom'; import { act } from 'react'; import toastEmitter from '../../../utils/toastEmitter'; +import { GuideTemplateProvider } from '../../../templates/GuideTemplate/GuideTemplateContext'; vi.mock('react-router-dom', async (importOriginal) => { const actual = await importOriginal(); @@ -18,6 +19,12 @@ vi.mock('react-router-dom', async (importOriginal) => { vi.mock('../../../services/popupServices'); vi.mock('../../../services/loginServices'); +const Wrapper = ({ children }) => ( + + {children} + +); + describe('CreatePopupPage component', () => { it('handles onSave and successful popup creation', async () => { // Mock the sign-up process to simulate a successful registration @@ -36,11 +43,7 @@ describe('CreatePopupPage component', () => { }); await act(async () => { - render( - - - - ); + render(, { wrapper: Wrapper }); }); const saveButton = await waitFor(() => screen.getByRole('button', { name: /Save/i })); @@ -67,11 +70,7 @@ describe('CreatePopupPage component', () => { const emitSpy = vi.spyOn(toastEmitter, 'emit'); await act(async () => { - render( - - - - ); + render(, { wrapper: Wrapper }); }); // Wait for the "Save" button to appear in the DOM @@ -97,11 +96,7 @@ describe('CreatePopupPage component', () => { it('initializes form fields correctly', async () => { - render( - - - - ); + render(, { wrapper: Wrapper }); // Check initial state of form fields const headerBackgroundColor = screen.getByDisplayValue('No action'); From 62996d8d5dac3a68d37f77d52ceeccc124d9c13d Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Wed, 13 Nov 2024 15:54:37 -0800 Subject: [PATCH 007/178] docs: install vitest --- backend/package-lock.json | 1318 ++++++++++++++++- backend/package.json | 6 +- backend/src/test/e2e/user.test.js | 5 + .../src/test/unit/controllers/user.test.js | 5 + backend/src/test/unit/mocks/user.mock.js | 0 backend/src/test/unit/models/user.test.js | 5 + backend/src/test/unit/services/user.test.js | 5 + 7 files changed, 1339 insertions(+), 5 deletions(-) create mode 100644 backend/src/test/e2e/user.test.js create mode 100644 backend/src/test/unit/controllers/user.test.js create mode 100644 backend/src/test/unit/mocks/user.mock.js create mode 100644 backend/src/test/unit/models/user.test.js create mode 100644 backend/src/test/unit/services/user.test.js diff --git a/backend/package-lock.json b/backend/package-lock.json index 178862c7..f1739d27 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -25,7 +25,399 @@ }, "devDependencies": { "nodemon": "^3.1.0", - "sequelize-cli": "^6.6.2" + "sequelize-cli": "^6.6.2", + "vitest": "^2.1.5" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, "node_modules/@isaacs/cliui": { @@ -131,6 +523,13 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -169,6 +568,258 @@ "node": ">=14" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", + "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", + "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", + "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", + "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", + "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", + "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", + "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", + "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", + "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", + "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", + "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", + "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", + "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", + "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", + "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", + "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", + "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", + "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -178,6 +829,13 @@ "@types/ms": "*" } }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", @@ -199,6 +857,119 @@ "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==", "license": "MIT" }, + "node_modules/@vitest/expect": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.5.tgz", + "integrity": "sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.5", + "@vitest/utils": "2.1.5", + "chai": "^5.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.5.tgz", + "integrity": "sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.1.5", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.12" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.5.tgz", + "integrity": "sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.5.tgz", + "integrity": "sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "2.1.5", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.5.tgz", + "integrity": "sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.5", + "magic-string": "^0.30.12", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.5.tgz", + "integrity": "sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.5.tgz", + "integrity": "sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.5", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -318,6 +1089,16 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -436,6 +1217,16 @@ "node": ">= 0.8" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -455,6 +1246,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/chai": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", + "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -663,8 +1481,18 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "dependencies": { - "ms": "2.0.0" + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/define-data-property": { @@ -839,6 +1667,13 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" + }, "node_modules/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -895,6 +1730,45 @@ "es6-symbol": "^3.1.1" } }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -927,6 +1801,16 @@ "node": ">=0.10" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -947,6 +1831,16 @@ "es5-ext": "~0.10.14" } }, + "node_modules/expect-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", + "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/express": { "version": "4.21.1", "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", @@ -1806,6 +2700,13 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, + "node_modules/loupe": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", @@ -1823,6 +2724,16 @@ "es5-ext": "~0.10.2" } }, + "node_modules/magic-string": { + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2021,6 +2932,25 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -2277,6 +3207,23 @@ "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "license": "MIT" }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/pg": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", @@ -2366,6 +3313,13 @@ "split2": "^4.1.0" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2379,6 +3333,35 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -2561,6 +3544,44 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", + "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.26.0", + "@rollup/rollup-android-arm64": "4.26.0", + "@rollup/rollup-darwin-arm64": "4.26.0", + "@rollup/rollup-darwin-x64": "4.26.0", + "@rollup/rollup-freebsd-arm64": "4.26.0", + "@rollup/rollup-freebsd-x64": "4.26.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", + "@rollup/rollup-linux-arm-musleabihf": "4.26.0", + "@rollup/rollup-linux-arm64-gnu": "4.26.0", + "@rollup/rollup-linux-arm64-musl": "4.26.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", + "@rollup/rollup-linux-riscv64-gnu": "4.26.0", + "@rollup/rollup-linux-s390x-gnu": "4.26.0", + "@rollup/rollup-linux-x64-gnu": "4.26.0", + "@rollup/rollup-linux-x64-musl": "4.26.0", + "@rollup/rollup-win32-arm64-msvc": "4.26.0", + "@rollup/rollup-win32-ia32-msvc": "4.26.0", + "@rollup/rollup-win32-x64-msvc": "4.26.0", + "fsevents": "~2.3.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2840,6 +3861,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -2868,6 +3896,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -2877,6 +3915,13 @@ "node": ">= 10.x" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -2886,6 +3931,13 @@ "node": ">= 0.8" } }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "dev": true, + "license": "MIT" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -3008,6 +4060,50 @@ "node": ">=0.12" } }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", + "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3172,6 +4268,205 @@ "node": ">= 0.8" } }, + "node_modules/vite": { + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.5.tgz", + "integrity": "sha512-rd0QIgx74q4S1Rd56XIiL2cYEdyWn13cunYBIuqh9mpmQr7gGS0IxXoP8R6OaZtNQQLyXSWbd4rXKYUbhFpK5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", + "pathe": "^1.1.2", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-node/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/vite-node/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vitest": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.5.tgz", + "integrity": "sha512-P4ljsdpuzRTPI/kbND2sDZ4VmieerR2c9szEZpjc+98Z9ebvnXmM5+0tHEKqYZumXqlvnmfWsjeFOjXVriDG7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "2.1.5", + "@vitest/mocker": "2.1.5", + "@vitest/pretty-format": "^2.1.5", + "@vitest/runner": "2.1.5", + "@vitest/snapshot": "2.1.5", + "@vitest/spy": "2.1.5", + "@vitest/utils": "2.1.5", + "chai": "^5.1.2", + "debug": "^4.3.7", + "expect-type": "^1.1.0", + "magic-string": "^0.30.12", + "pathe": "^1.1.2", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.1", + "tinypool": "^1.0.1", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.1.5", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.1.5", + "@vitest/ui": "2.1.5", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -3204,6 +4499,23 @@ "node": ">= 8" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", diff --git a/backend/package.json b/backend/package.json index 3a6370d5..b34a3fdb 100644 --- a/backend/package.json +++ b/backend/package.json @@ -5,7 +5,8 @@ "main": "index.js", "scripts": { "start": "node index.js", - "test": "echo \"Error: no test specified\" && exit 1", + "test": "vitest", + "t:coverage": "vitest run --coverage", "dev": "nodemon index.js", "prod": "NODE_ENV=production node index.js", "build": "echo 'No build script defined'" @@ -30,6 +31,7 @@ }, "devDependencies": { "nodemon": "^3.1.0", - "sequelize-cli": "^6.6.2" + "sequelize-cli": "^6.6.2", + "vitest": "^2.1.5" } } diff --git a/backend/src/test/e2e/user.test.js b/backend/src/test/e2e/user.test.js new file mode 100644 index 00000000..0637fcc1 --- /dev/null +++ b/backend/src/test/e2e/user.test.js @@ -0,0 +1,5 @@ +import { describe, it } from "vitest"; + +describe("E2e tests user", () => { + it.todo("todo tests"); +}); diff --git a/backend/src/test/unit/controllers/user.test.js b/backend/src/test/unit/controllers/user.test.js new file mode 100644 index 00000000..ba9cf399 --- /dev/null +++ b/backend/src/test/unit/controllers/user.test.js @@ -0,0 +1,5 @@ +import { describe, it } from "vitest"; + +describe("Unit test user controller", () => { + it.todo("todo tests"); +}); diff --git a/backend/src/test/unit/mocks/user.mock.js b/backend/src/test/unit/mocks/user.mock.js new file mode 100644 index 00000000..e69de29b diff --git a/backend/src/test/unit/models/user.test.js b/backend/src/test/unit/models/user.test.js new file mode 100644 index 00000000..aa40d442 --- /dev/null +++ b/backend/src/test/unit/models/user.test.js @@ -0,0 +1,5 @@ +import { describe, it } from "vitest"; + +describe("Unit test user model", () => { + it.todo("todo tests"); +}); diff --git a/backend/src/test/unit/services/user.test.js b/backend/src/test/unit/services/user.test.js new file mode 100644 index 00000000..ff896ad6 --- /dev/null +++ b/backend/src/test/unit/services/user.test.js @@ -0,0 +1,5 @@ +import { describe, it } from "vitest"; + +describe("Unit test user service", () => { + it.todo("todo tests"); +}); From 6dc20ff2a934fd78655e6c93f759e2debb339d66 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Wed, 13 Nov 2024 17:22:27 -0800 Subject: [PATCH 008/178] test: add test cases for user unit tests --- .../src/test/unit/controllers/user.test.js | 13 ++++++- backend/src/test/unit/models/user.test.js | 5 --- backend/src/test/unit/services/user.test.js | 37 ++++++++++++++++++- 3 files changed, 47 insertions(+), 8 deletions(-) delete mode 100644 backend/src/test/unit/models/user.test.js diff --git a/backend/src/test/unit/controllers/user.test.js b/backend/src/test/unit/controllers/user.test.js index ba9cf399..5f3a4045 100644 --- a/backend/src/test/unit/controllers/user.test.js +++ b/backend/src/test/unit/controllers/user.test.js @@ -1,5 +1,16 @@ import { describe, it } from "vitest"; describe("Unit test user controller", () => { - it.todo("todo tests"); + it.todo( + "getUsersList - if everything goes right, should return a list of users with pagination and status code 200" + ); + it.todo( + "getUsersList - if something goes wrong, should return status code 500 and the title error code GET_USER_LIST_ERROR" + ); + it.todo("getCurrentUser - if everything goes right, should return the user without the password"); + it.todo("getCurrentUser - if something goes wrong, should return status code 500 and the title error code GET_USER_ERROR"); + it.todo("updateUserDetails - if everything goes right, should return the updated user without the password"); + it.todo("updateUserDetails - if something goes wrong, should return status code 500 and the title error code UPDATE_USER_ERROR"); + it.todo("deleteUser - if everything goes right, should return the message 'User deleted successfully'"); + it.todo("deleteUser - if something goes wrong, should return status code 500 and the title error code DELETE_USER_ERROR"); }); diff --git a/backend/src/test/unit/models/user.test.js b/backend/src/test/unit/models/user.test.js deleted file mode 100644 index aa40d442..00000000 --- a/backend/src/test/unit/models/user.test.js +++ /dev/null @@ -1,5 +0,0 @@ -import { describe, it } from "vitest"; - -describe("Unit test user model", () => { - it.todo("todo tests"); -}); diff --git a/backend/src/test/unit/services/user.test.js b/backend/src/test/unit/services/user.test.js index ff896ad6..4ebc04ef 100644 --- a/backend/src/test/unit/services/user.test.js +++ b/backend/src/test/unit/services/user.test.js @@ -1,5 +1,38 @@ -import { describe, it } from "vitest"; +import { beforeEach, describe, it, vi } from "vitest"; +import db from "../../../models"; describe("Unit test user service", () => { - it.todo("todo tests"); + let User; + let Invite; + let Token; + let Sequelize; + let sequelize; + beforeEach(() => { + User = vi.spyOn(db, "User"); + Invite = vi.spyOn(db, "Invite"); + Token = vi.spyOn(db, "Token"); + Sequelize = vi.spyOn(db, "Sequelize"); + sequelize = vi.spyOn(db, "sequelize"); + }); + it.todo("getUser - should throw an error if something goes wrong"); + it.todo("getUser - should return the user if everything is ok"); + it.todo( + "getUsers - should return all the users if the search param is an empty string" + ); + it.todo( + "getUsers - should return filtered users if the search param has a match" + ); + it.todo( + "getUsers - should return an empty list if the search param doesn't have a match" + ); + it.todo( + "updateUser - if the user is updated, should return the updated user" + ); + it.todo("updateUser - if the user is not updated, should throw an error"); + it.todo( + "deleteUser - if the user is the only admin role, should throw an error" + ); + it.todo( + "deleteUser - if the user is not the admin role, should delete the user, the invite and the token" + ); }); From ad6a2de6dbba0d0cbd1d8f1b97293a7a68009766 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Thu, 14 Nov 2024 09:48:57 -0800 Subject: [PATCH 009/178] docs: change test libs --- backend/package-lock.json | 1835 ++++++++++++------------------------- backend/package.json | 4 +- 2 files changed, 598 insertions(+), 1241 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index f1739d27..f0d271f1 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -24,400 +24,11 @@ "sequelize": "^6.37.3" }, "devDependencies": { + "chai": "^5.1.2", + "mocha": "^10.8.2", "nodemon": "^3.1.0", "sequelize-cli": "^6.6.2", - "vitest": "^2.1.5" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "sinon": "^19.0.2" } }, "node_modules/@isaacs/cliui": { @@ -523,13 +134,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -568,257 +172,54 @@ "node": ">=14" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.26.0.tgz", - "integrity": "sha512-gJNwtPDGEaOEgejbaseY6xMFu+CPltsc8/T+diUTTbOQLqD+bnrJq9ulH6WD69TqwqWmrfRAtUv30cCFZlbGTQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.26.0.tgz", - "integrity": "sha512-YJa5Gy8mEZgz5JquFruhJODMq3lTHWLm1fOy+HIANquLzfIOzE9RA5ie3JjCdVb9r46qfAQY/l947V0zfGJ0OQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.26.0.tgz", - "integrity": "sha512-ErTASs8YKbqTBoPLp/kA1B1Um5YSom8QAc4rKhg7b9tyyVqDBlQxy7Bf2wW7yIlPGPg2UODDQcbkTlruPzDosw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.26.0.tgz", - "integrity": "sha512-wbgkYDHcdWW+NqP2mnf2NOuEbOLzDblalrOWcPyY6+BRbVhliavon15UploG7PpBRQ2bZJnbmh8o3yLoBvDIHA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.26.0.tgz", - "integrity": "sha512-Y9vpjfp9CDkAG4q/uwuhZk96LP11fBz/bYdyg9oaHYhtGZp7NrbkQrj/66DYMMP2Yo/QPAsVHkV891KyO52fhg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.26.0.tgz", - "integrity": "sha512-A/jvfCZ55EYPsqeaAt/yDAG4q5tt1ZboWMHEvKAH9Zl92DWvMIbnZe/f/eOXze65aJaaKbL+YeM0Hz4kLQvdwg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.26.0.tgz", - "integrity": "sha512-paHF1bMXKDuizaMODm2bBTjRiHxESWiIyIdMugKeLnjuS1TCS54MF5+Y5Dx8Ui/1RBPVRE09i5OUlaLnv8OGnA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.26.0.tgz", - "integrity": "sha512-cwxiHZU1GAs+TMxvgPfUDtVZjdBdTsQwVnNlzRXC5QzIJ6nhfB4I1ahKoe9yPmoaA/Vhf7m9dB1chGPpDRdGXg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.26.0.tgz", - "integrity": "sha512-4daeEUQutGRCW/9zEo8JtdAgtJ1q2g5oHaoQaZbMSKaIWKDQwQ3Yx0/3jJNmpzrsScIPtx/V+1AfibLisb3AMQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.26.0.tgz", - "integrity": "sha512-eGkX7zzkNxvvS05ROzJ/cO/AKqNvR/7t1jA3VZDi2vRniLKwAWxUr85fH3NsvtxU5vnUUKFHKh8flIBdlo2b3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.26.0.tgz", - "integrity": "sha512-Odp/lgHbW/mAqw/pU21goo5ruWsytP7/HCC/liOt0zcGG0llYWKrd10k9Fj0pdj3prQ63N5yQLCLiE7HTX+MYw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.26.0.tgz", - "integrity": "sha512-MBR2ZhCTzUgVD0OJdTzNeF4+zsVogIR1U/FsyuFerwcqjZGvg2nYe24SAHp8O5sN8ZkRVbHwlYeHqcSQ8tcYew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.26.0.tgz", - "integrity": "sha512-YYcg8MkbN17fMbRMZuxwmxWqsmQufh3ZJFxFGoHjrE7bv0X+T6l3glcdzd7IKLiwhT+PZOJCblpnNlz1/C3kGQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.26.0.tgz", - "integrity": "sha512-ZuwpfjCwjPkAOxpjAEjabg6LRSfL7cAJb6gSQGZYjGhadlzKKywDkCUnJ+KEfrNY1jH5EEoSIKLCb572jSiglA==", - "cpu": [ - "x64" - ], + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.26.0.tgz", - "integrity": "sha512-+HJD2lFS86qkeF8kNu0kALtifMpPCZU80HvwztIKnYwym3KnA1os6nsX4BGSTLtS2QVAGG1P3guRgsYyMA0Yhg==", - "cpu": [ - "x64" - ], + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.26.0.tgz", - "integrity": "sha512-WUQzVFWPSw2uJzX4j6YEbMAiLbs0BUysgysh8s817doAYhR5ybqTI1wtKARQKo6cGop3pHnrUJPFCsXdoFaimQ==", - "cpu": [ - "arm64" - ], + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.2.tgz", + "integrity": "sha512-v46t/fwnhejRSFTGqbpn9u+LQ9xJDse10gNnPgAcxgdoCDMXj/G2asWAC/8Qs+BAZDicX+MNZouXT1A7c83kVw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.26.0.tgz", - "integrity": "sha512-D4CxkazFKBfN1akAIY6ieyOqzoOoBV1OICxgUblWxff/pSjCA2khXlASUx7mK6W1oP4McqhgcCsu6QaLj3WMWg==", - "cpu": [ - "ia32" - ], + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "lodash.get": "^4.4.2", + "type-detect": "^4.1.0" + } + }, + "node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.26.0.tgz", - "integrity": "sha512-2x8MO1rm4PGEP0xWbubJW5RtbNLk3puzAMaLQd3B3JHVw4KcHlmXcO+Wewx9zCoo7EUFiMlu/aZbCJ7VjMzAag==", - "cpu": [ - "x64" - ], + "engines": { + "node": ">=4" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "license": "(Unlicense OR Apache-2.0)" }, "node_modules/@types/debug": { "version": "4.1.12", @@ -829,13 +230,6 @@ "@types/ms": "*" } }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", @@ -857,119 +251,6 @@ "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==", "license": "MIT" }, - "node_modules/@vitest/expect": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.5.tgz", - "integrity": "sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.5", - "@vitest/utils": "2.1.5", - "chai": "^5.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.5.tgz", - "integrity": "sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "2.1.5", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.12" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.5.tgz", - "integrity": "sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.5.tgz", - "integrity": "sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "2.1.5", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.5.tgz", - "integrity": "sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.5", - "magic-string": "^0.30.12", - "pathe": "^1.1.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.5.tgz", - "integrity": "sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^3.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.5.tgz", - "integrity": "sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "2.1.5", - "loupe": "^3.1.2", - "tinyrainbow": "^1.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -1024,6 +305,16 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -1083,6 +374,13 @@ "node": ">=10" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -1202,6 +500,13 @@ "node": ">=8" } }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -1217,16 +522,6 @@ "node": ">= 0.8" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -1246,6 +541,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/chai": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", @@ -1263,6 +571,46 @@ "node": ">=12" } }, + "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, + "license": "MIT", + "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/chalk/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/check-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", @@ -1485,6 +833,19 @@ "ms": "2.0.0" } }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -1546,6 +907,16 @@ "node": ">=8" } }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dotenv": { "version": "16.4.5", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", @@ -1667,13 +1038,6 @@ "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true, - "license": "MIT" - }, "node_modules/es5-ext": { "version": "0.10.64", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", @@ -1730,45 +1094,6 @@ "es6-symbol": "^3.1.1" } }, - "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -1785,6 +1110,19 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "license": "MIT" }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/esniff": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", @@ -1801,16 +1139,6 @@ "node": ">=0.10" } }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1831,16 +1159,6 @@ "es5-ext": "~0.10.14" } }, - "node_modules/expect-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz", - "integrity": "sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/express": { "version": "4.21.1", "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", @@ -1937,6 +1255,33 @@ "node": ">= 0.8" } }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, "node_modules/foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", @@ -2445,6 +1790,16 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", @@ -2452,6 +1807,19 @@ "dev": true, "license": "MIT" }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2590,6 +1958,19 @@ "node": ">=14" } }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -2631,6 +2012,13 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true, + "license": "MIT" + }, "node_modules/jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -2652,12 +2040,35 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -2700,6 +2111,23 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, + "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, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/loupe": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", @@ -2724,16 +2152,6 @@ "es5-ext": "~0.10.2" } }, - "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -2905,6 +2323,137 @@ "node": ">=10" } }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -2932,25 +2481,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -2973,6 +2503,30 @@ "dev": true, "license": "ISC" }, + "node_modules/nise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", + "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.1", + "@sinonjs/text-encoding": "^0.7.3", + "just-extend": "^6.2.0", + "path-to-regexp": "^8.1.0" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", + "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, "node_modules/node-addon-api": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", @@ -3142,6 +2696,38 @@ "wrappy": "1" } }, + "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, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", @@ -3158,6 +2744,16 @@ "node": ">= 0.8" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3207,13 +2803,6 @@ "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "license": "MIT" }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true, - "license": "MIT" - }, "node_modules/pathval": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", @@ -3313,13 +2902,6 @@ "split2": "^4.1.0" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -3333,35 +2915,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -3443,6 +2996,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -3544,44 +3107,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rollup": { - "version": "4.26.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.26.0.tgz", - "integrity": "sha512-ilcl12hnWonG8f+NxU6BlgysVA0gvY2l8N0R84S1HcINbW20bvwuCngJkkInV6LXhwRpucsW5k1ovDwEdBVrNg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.26.0", - "@rollup/rollup-android-arm64": "4.26.0", - "@rollup/rollup-darwin-arm64": "4.26.0", - "@rollup/rollup-darwin-x64": "4.26.0", - "@rollup/rollup-freebsd-arm64": "4.26.0", - "@rollup/rollup-freebsd-x64": "4.26.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.26.0", - "@rollup/rollup-linux-arm-musleabihf": "4.26.0", - "@rollup/rollup-linux-arm64-gnu": "4.26.0", - "@rollup/rollup-linux-arm64-musl": "4.26.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.26.0", - "@rollup/rollup-linux-riscv64-gnu": "4.26.0", - "@rollup/rollup-linux-s390x-gnu": "4.26.0", - "@rollup/rollup-linux-x64-gnu": "4.26.0", - "@rollup/rollup-linux-x64-musl": "4.26.0", - "@rollup/rollup-win32-arm64-msvc": "4.26.0", - "@rollup/rollup-win32-ia32-msvc": "4.26.0", - "@rollup/rollup-win32-x64-msvc": "4.26.0", - "fsevents": "~2.3.2" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -3776,6 +3301,16 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/serve-static": { "version": "1.16.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", @@ -3861,13 +3396,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -3887,20 +3415,62 @@ "node": ">=10" } }, - "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==", + "node_modules/sinon": { + "version": "19.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-19.0.2.tgz", + "integrity": "sha512-euuToqM+PjO4UgXeLETsfQiuoyPXlqFezr6YZDFwHR3t4qaX0fZUe1MfPMznTL5f8BWrVS89KduLdMUsxFCO6g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.2", + "@sinonjs/samsam": "^8.0.1", + "diff": "^7.0.0", + "nise": "^6.1.1", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=0.3.1" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "node_modules/sinon/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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sinon/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, + "license": "MIT", + "dependencies": { + "has-flag": "^4.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", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -3915,13 +3485,6 @@ "node": ">= 10.x" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -3931,13 +3494,6 @@ "node": ">= 0.8" } }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", - "dev": true, - "license": "MIT" - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -4003,6 +3559,19 @@ "node": ">=8" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -4060,50 +3629,6 @@ "node": ">=0.12" } }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", - "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinypool": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", - "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", - "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", - "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -4155,6 +3680,16 @@ "dev": true, "license": "ISC" }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -4268,205 +3803,6 @@ "node": ">= 0.8" } }, - "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.5.tgz", - "integrity": "sha512-rd0QIgx74q4S1Rd56XIiL2cYEdyWn13cunYBIuqh9mpmQr7gGS0IxXoP8R6OaZtNQQLyXSWbd4rXKYUbhFpK5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.7", - "es-module-lexer": "^1.5.4", - "pathe": "^1.1.2", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-node/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/vite-node/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/vitest": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.5.tgz", - "integrity": "sha512-P4ljsdpuzRTPI/kbND2sDZ4VmieerR2c9szEZpjc+98Z9ebvnXmM5+0tHEKqYZumXqlvnmfWsjeFOjXVriDG7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "2.1.5", - "@vitest/mocker": "2.1.5", - "@vitest/pretty-format": "^2.1.5", - "@vitest/runner": "2.1.5", - "@vitest/snapshot": "2.1.5", - "@vitest/spy": "2.1.5", - "@vitest/utils": "2.1.5", - "chai": "^5.1.2", - "debug": "^4.3.7", - "expect-type": "^1.1.0", - "magic-string": "^0.30.12", - "pathe": "^1.1.2", - "std-env": "^3.8.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.1", - "tinypool": "^1.0.1", - "tinyrainbow": "^1.2.0", - "vite": "^5.0.0", - "vite-node": "2.1.5", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.5", - "@vitest/ui": "2.1.5", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -4499,23 +3835,6 @@ "node": ">= 8" } }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -4540,6 +3859,13 @@ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "license": "MIT" }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -4636,6 +3962,35 @@ "engines": { "node": ">=10" } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/backend/package.json b/backend/package.json index b34a3fdb..9f7c036f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -30,8 +30,10 @@ "sequelize": "^6.37.3" }, "devDependencies": { + "chai": "^5.1.2", + "mocha": "^10.8.2", "nodemon": "^3.1.0", "sequelize-cli": "^6.6.2", - "vitest": "^2.1.5" + "sinon": "^19.0.2" } } From 1ca90864358b2349439861afb1903c2e8d100bc4 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Thu, 14 Nov 2024 10:59:42 -0800 Subject: [PATCH 010/178] test: add tests to user services getUser and getUsers --- backend/package.json | 4 +- backend/src/test/e2e/user.test.js | 4 +- .../src/test/unit/controllers/user.test.js | 22 +- backend/src/test/unit/mocks/user.mock.js | 68 +++++++ backend/src/test/unit/services/user.test.js | 189 +++++++++++++++--- 5 files changed, 240 insertions(+), 47 deletions(-) diff --git a/backend/package.json b/backend/package.json index 9f7c036f..a22760f8 100644 --- a/backend/package.json +++ b/backend/package.json @@ -5,8 +5,8 @@ "main": "index.js", "scripts": { "start": "node index.js", - "test": "vitest", - "t:coverage": "vitest run --coverage", + "test": "mocha 'src/test/**/*.test.js' --watch", + "t:coverage": "mocha", "dev": "nodemon index.js", "prod": "NODE_ENV=production node index.js", "build": "echo 'No build script defined'" diff --git a/backend/src/test/e2e/user.test.js b/backend/src/test/e2e/user.test.js index 0637fcc1..4d5ab515 100644 --- a/backend/src/test/e2e/user.test.js +++ b/backend/src/test/e2e/user.test.js @@ -1,5 +1,5 @@ -import { describe, it } from "vitest"; +const { describe, it } = require("mocha"); describe("E2e tests user", () => { - it.todo("todo tests"); + it.skip("todo tests", () => {}); }); diff --git a/backend/src/test/unit/controllers/user.test.js b/backend/src/test/unit/controllers/user.test.js index 5f3a4045..4b3b3523 100644 --- a/backend/src/test/unit/controllers/user.test.js +++ b/backend/src/test/unit/controllers/user.test.js @@ -1,16 +1,12 @@ -import { describe, it } from "vitest"; +const { describe, it } = require("mocha"); describe("Unit test user controller", () => { - it.todo( - "getUsersList - if everything goes right, should return a list of users with pagination and status code 200" - ); - it.todo( - "getUsersList - if something goes wrong, should return status code 500 and the title error code GET_USER_LIST_ERROR" - ); - it.todo("getCurrentUser - if everything goes right, should return the user without the password"); - it.todo("getCurrentUser - if something goes wrong, should return status code 500 and the title error code GET_USER_ERROR"); - it.todo("updateUserDetails - if everything goes right, should return the updated user without the password"); - it.todo("updateUserDetails - if something goes wrong, should return status code 500 and the title error code UPDATE_USER_ERROR"); - it.todo("deleteUser - if everything goes right, should return the message 'User deleted successfully'"); - it.todo("deleteUser - if something goes wrong, should return status code 500 and the title error code DELETE_USER_ERROR"); + it.skip("getUsersList - if everything goes right, should return a list of users with pagination and status code 200", () => {}); + it.skip("getUsersList - if something goes wrong, should return status code 500 and the title error code GET_USER_LIST_ERROR", () => {}); + it.skip("getCurrentUser - if everything goes right, should return the user without the password", () => {}); + it.skip("getCurrentUser - if something goes wrong, should return status code 500 and the title error code GET_USER_ERROR", () => {}); + it.skip("updateUserDetails - if everything goes right, should return the updated user without the password", () => {}); + it.skip("updateUserDetails - if something goes wrong, should return status code 500 and the title error code UPDATE_USER_ERROR", () => {}); + it.skip("deleteUser - if everything goes right, should return the message 'User deleted successfully'", () => {}); + it.skip("deleteUser - if something goes wrong, should return status code 500 and the title error code DELETE_USER_ERROR", () => {}); }); diff --git a/backend/src/test/unit/mocks/user.mock.js b/backend/src/test/unit/mocks/user.mock.js index e69de29b..4e393418 100644 --- a/backend/src/test/unit/mocks/user.mock.js +++ b/backend/src/test/unit/mocks/user.mock.js @@ -0,0 +1,68 @@ +const validUser = { + id: 1, + name: "Jane", + surname: "Doe", + email: "jane.doe@email.com", + password: "password123", + role: 1, + picture: "", + createdAt: "2024-11-12", +}; + +const validList = [ + { + id: 1, + name: "Jane", + surname: "Doe", + email: "jane.doe@email.com", + password: "password123", + role: 1, + picture: "", + createdAt: "2024-11-12", + }, + { + id: 2, + name: "Jane", + surname: "Valentine", + email: "jane.doe@email.com", + password: "password123", + role: 1, + picture: "", + createdAt: "2024-11-12", + }, + { + id: 3, + name: "Aria", + surname: "Stark", + email: "jane.doe@email.com", + password: "password123", + role: 1, + picture: "", + createdAt: "2024-11-12", + }, + { + id: 4, + name: "John", + surname: "Snow", + email: "jane.doe@email.com", + password: "password123", + role: 1, + picture: "", + createdAt: "2024-11-12", + }, + { + id: 5, + name: "John", + surname: "Doe", + email: "jane.doe@email.com", + password: "password123", + role: 1, + picture: "", + createdAt: "2024-11-12", + }, +]; + +module.exports = { + validUser, + validList, +}; diff --git a/backend/src/test/unit/services/user.test.js b/backend/src/test/unit/services/user.test.js index 4ebc04ef..7c4bf77f 100644 --- a/backend/src/test/unit/services/user.test.js +++ b/backend/src/test/unit/services/user.test.js @@ -1,38 +1,167 @@ -import { beforeEach, describe, it, vi } from "vitest"; -import db from "../../../models"; +const { describe, it, afterEach } = require("mocha"); +const { expect } = require("chai"); +const sinon = require("sinon"); +const db = require("../../../models/index.js"); +const UserService = require("../../../service/user.service.js"); +const mocks = require("../mocks/user.mock.js"); + +const service = new UserService(); describe("Unit test user service", () => { let User; let Invite; let Token; let Sequelize; - let sequelize; - beforeEach(() => { - User = vi.spyOn(db, "User"); - Invite = vi.spyOn(db, "Invite"); - Token = vi.spyOn(db, "Token"); - Sequelize = vi.spyOn(db, "Sequelize"); - sequelize = vi.spyOn(db, "sequelize"); + afterEach(() => { + Sequelize = sinon.spy(db, "Sequelize"); + sinon.restore(); + }); + it("getUser - should throw an error if something goes wrong", async () => { + User = sinon.stub(db.User, "findOne").rejects(); + try { + await service.getUser(1); + } catch (err) { + expect(err).to.have.property("message", "Error retrieving User by ID"); + expect(err).to.be.instanceOf(Error); + } + expect(User.callCount).to.be.equal(1); + expect( + User.calledWith({ + where: { id: 1 }, + }) + ).to.be.true; + }); + it("getUser - should return the user if everything is ok", async () => { + User = sinon.stub(db.User, "findOne").resolves(mocks.validUser); + const user = await service.getUser(1); + expect(User.threw()).to.be.false; + expect(User.callCount).to.be.equal(1); + expect( + User.calledWith({ + where: { id: 1 }, + }) + ).to.be.true; + expect(user).to.be.equal(mocks.validUser); + }); + it("getUsers - should return all the users if the search param is an empty string", async () => { + User = sinon + .stub(db.User, "findAndCountAll") + .resolves(mocks.validList.slice(0, 2)); + const users = await service.getUsers({ search: "", page: 1, limit: 2 }); + + expect( + User.calledWith({ + where: { + [Sequelize.Op.or]: [ + { + name: { + [Sequelize.Op.like]: `%%`, + }, + }, + { + surname: { + [Sequelize.Op.like]: `%%`, + }, + }, + ], + }, + limit: 2, + offset: 0, + }) + ).to.be.true; + expect(users).not.to.be.equal(mocks.validList); + expect(users).to.have.length(2); + }); + it("getUsers - should return the correct pagination when the page changes", async () => { + User = sinon + .stub(db.User, "findAndCountAll") + .onFirstCall() + .resolves(mocks.validList.slice(0, 2)) + .onSecondCall() + .resolves(mocks.validList.slice(2, 4)); + const firstList = await service.getUsers({ search: "", page: 1, limit: 2 }); + expect( + User.calledWith({ + where: { + [Sequelize.Op.or]: [ + { + name: { + [Sequelize.Op.like]: `%%`, + }, + }, + { + surname: { + [Sequelize.Op.like]: `%%`, + }, + }, + ], + }, + limit: 2, + offset: 0, + }) + ).to.be.true; + expect(firstList).not.to.be.equal(mocks.validList); + expect(firstList).to.have.length(2); + const secondList = await service.getUsers({ + search: "", + page: 2, + limit: 2, + }); + expect( + User.calledWith({ + where: { + [Sequelize.Op.or]: [ + { + name: { + [Sequelize.Op.like]: `%%`, + }, + }, + { + surname: { + [Sequelize.Op.like]: `%%`, + }, + }, + ], + }, + limit: 2, + offset: 2, + }) + ).to.be.true; + expect(secondList).to.have.length(2); + expect(secondList).not.to.be.equal(firstList); + }); + it("getUsers - should throw the error message 'Error retrieving users list' if something goes wrong", async () => { + User = sinon.stub(db.User, "findAndCountAll").rejects({}); + try { + await service.getUsers({ search: "", page: 1, limit: 2 }); + } catch (error) { + expect(error).to.have.property("message", "Error retrieving users list"); + expect(error).to.be.instanceOf(Error); + } + expect( + User.calledWith({ + where: { + [Sequelize.Op.or]: [ + { + name: { + [Sequelize.Op.like]: `%%`, + }, + }, + { + surname: { + [Sequelize.Op.like]: `%%`, + }, + }, + ], + }, + limit: 2, + offset: 0, + }) + ).to.be.true; + expect(User.callCount).to.be.equal(1); }); - it.todo("getUser - should throw an error if something goes wrong"); - it.todo("getUser - should return the user if everything is ok"); - it.todo( - "getUsers - should return all the users if the search param is an empty string" - ); - it.todo( - "getUsers - should return filtered users if the search param has a match" - ); - it.todo( - "getUsers - should return an empty list if the search param doesn't have a match" - ); - it.todo( - "updateUser - if the user is updated, should return the updated user" - ); - it.todo("updateUser - if the user is not updated, should throw an error"); - it.todo( - "deleteUser - if the user is the only admin role, should throw an error" - ); - it.todo( - "deleteUser - if the user is not the admin role, should delete the user, the invite and the token" - ); + it.skip("updateUser - if the user is updated, should return the updated user", () => {}); + it.skip("updateUser - if the user is not updated, should throw an error", () => {}); + it.skip("deleteUser - if the user is the only admin role, should throw an error", () => {}); + it.skip("deleteUser - if the user is not the admin role, should delete the user, the invite and the token", () => {}); }); From 5d8faffd22f0a37fb7a2b64fd2587eeccd77bfb9 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Thu, 14 Nov 2024 13:51:05 -0800 Subject: [PATCH 011/178] test: add user services updateUser and deleteUser tests --- backend/src/test/unit/services/user.test.js | 89 ++++++++++++++++++++- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/backend/src/test/unit/services/user.test.js b/backend/src/test/unit/services/user.test.js index 7c4bf77f..cfcfe529 100644 --- a/backend/src/test/unit/services/user.test.js +++ b/backend/src/test/unit/services/user.test.js @@ -12,6 +12,16 @@ describe("Unit test user service", () => { let Invite; let Token; let Sequelize; + let commit; + let rollback; + beforeEach(() => { + commit = sinon.spy(); + rollback = sinon.spy(); + sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ + commit, + rollback, + })); + }); afterEach(() => { Sequelize = sinon.spy(db, "Sequelize"); sinon.restore(); @@ -160,8 +170,79 @@ describe("Unit test user service", () => { ).to.be.true; expect(User.callCount).to.be.equal(1); }); - it.skip("updateUser - if the user is updated, should return the updated user", () => {}); - it.skip("updateUser - if the user is not updated, should throw an error", () => {}); - it.skip("deleteUser - if the user is the only admin role, should throw an error", () => {}); - it.skip("deleteUser - if the user is not the admin role, should delete the user, the invite and the token", () => {}); + it("updateUser - if the user is updated, should return the updated user", async () => { + const details = { + name: "Harry", + surname: "Potter", + email: "harry.potter@wizards.com", + }; + User = sinon + .stub(db.User, "update") + .resolves([1, [{ ...mocks.validUser, ...details }]]); + const user = await service.updateUser(1, details); + expect( + User.calledWith(details, { + where: { id: 1 }, + returning: true, + }) + ).to.be.true; + expect(user).not.to.equal(mocks.validUser); + expect(user).to.have.property("name", "Harry"); + }); + it("updateUser - if something goes wrong, should throw an error 'Error updating user'", async () => { + const details = { + name: "Harry", + surname: "Potter", + email: "harry.potter@wizards.com", + }; + User = sinon.stub(db.User, "update").rejects(); + try { + await service.updateUser(1, details); + } catch (error) { + expect(error).to.have.property("message", "Error updating user"); + expect(error).to.be.instanceOf(Error); + } + expect( + User.calledWith(details, { + where: { id: 1 }, + returning: true, + }) + ).to.be.true; + }); + it("deleteUser - if the user is the only admin role, should throw an error", async () => { + sinon.stub(db.User, "findOne").resolves(mocks.validUser); + sinon.stub(db.User, "count").resolves(1); + User = sinon.stub(db.User, "destroy"); + Token = sinon.stub(db.Token, "destroy"); + Invite = sinon.stub(db.Invite, "destroy"); + try { + await service.deleteUser(1); + } catch (error) { + expect(error).to.be.instanceOf(Error); + expect(error).to.have.property( + "message", + "Error deleting user ~ The team has only single admin and can't delete themselves" + ); + } + expect(User.called).to.be.false; + expect(Invite.called).to.be.false; + expect(Token.called).to.be.false; + expect(commit.called).to.be.false; + expect(rollback.called).to.be.true; + }); + it("deleteUser - if the user is not the admin role, should delete the user, the invite and the token", async () => { + sinon.stub(db.User, "findOne").resolves(mocks.validUser); + sinon.stub(db.User, "count").resolves(2); + User = sinon.stub(db.User, "destroy"); + Token = sinon.stub(db.Token, "destroy"); + Invite = sinon.stub(db.Invite, "destroy"); + + const result = await service.deleteUser(1); + console.log(result); + expect(User.called).to.be.true; + expect(Invite.called).to.be.true; + expect(Token.called).to.be.true; + expect(commit.called).to.be.true; + expect(rollback.called).to.be.false; + }); }); From aa81948be843c1b68d72824f9a58bdb270901794 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 15 Nov 2024 13:43:01 -0800 Subject: [PATCH 012/178] test: add user controller tests --- backend/src/controllers/user.controller.js | 3 +- .../src/test/unit/controllers/user.test.js | 147 ++++++++++++++++-- 2 files changed, 140 insertions(+), 10 deletions(-) diff --git a/backend/src/controllers/user.controller.js b/backend/src/controllers/user.controller.js index 69aa5149..0fab9551 100644 --- a/backend/src/controllers/user.controller.js +++ b/backend/src/controllers/user.controller.js @@ -149,5 +149,6 @@ module.exports = { deleteUser, checkAtLeastOneField, validateProfileUpdate, - handleValidationErrors + handleValidationErrors, + userService }; diff --git a/backend/src/test/unit/controllers/user.test.js b/backend/src/test/unit/controllers/user.test.js index 4b3b3523..b9577b5d 100644 --- a/backend/src/test/unit/controllers/user.test.js +++ b/backend/src/test/unit/controllers/user.test.js @@ -1,12 +1,141 @@ -const { describe, it } = require("mocha"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const { expect } = require("chai"); +const { userService } = require("../../../controllers/user.controller.js"); +const controller = require("../../../controllers/user.controller.js"); +const sinon = require("sinon"); +const mocks = require("../mocks/user.mock.js"); +const settings = require("../../../../config/settings.js"); describe("Unit test user controller", () => { - it.skip("getUsersList - if everything goes right, should return a list of users with pagination and status code 200", () => {}); - it.skip("getUsersList - if something goes wrong, should return status code 500 and the title error code GET_USER_LIST_ERROR", () => {}); - it.skip("getCurrentUser - if everything goes right, should return the user without the password", () => {}); - it.skip("getCurrentUser - if something goes wrong, should return status code 500 and the title error code GET_USER_ERROR", () => {}); - it.skip("updateUserDetails - if everything goes right, should return the updated user without the password", () => {}); - it.skip("updateUserDetails - if something goes wrong, should return status code 500 and the title error code UPDATE_USER_ERROR", () => {}); - it.skip("deleteUser - if everything goes right, should return the message 'User deleted successfully'", () => {}); - it.skip("deleteUser - if something goes wrong, should return status code 500 and the title error code DELETE_USER_ERROR", () => {}); + const req = {}; + const res = {}; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("getUsersList - if everything goes right, should return a list of users with pagination and status code 200", async () => { + const users = sinon + .stub(userService, "getUsers") + .resolves({ rows: mocks.validList.slice(0, 2), count: 5 }); + req.query = { page: 1, limit: 2, search: "Jane" }; + await controller.getUsersList(req, res); + expect(users.calledWith({ page: 1, limit: 2, search: "Jane" })).to.be.true; + expect(res.status.args[0][0]).to.be.equal(200); + expect(res.json.args[0][0]).to.be.deep.equal({ + users: mocks.validList.slice(0, 2).map((user) => ({ + name: user.name, + surname: user.surname, + email: user.email, + role: settings.user.roleName[user.role], + })), + totalPages: 3, + currentPage: 1, + totalUsers: 5, + }); + }); + it("getUsersList - if something goes wrong, should return status code 500 and the title error code GET_USER_LIST_ERROR", async () => { + sinon.stub(userService, "getUsers").rejects(); + req.query = { page: 1, limit: 2, search: "Jane" }; + await controller.getUsersList(req, res); + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + message: "Error", + errorCode: "GET_USER_LIST_ERROR", + }); + }); + it("getCurrentUser - if everything goes right, should return the user without the password", async () => { + const users = sinon.stub(userService, "getUser").resolves(mocks.validUser); + req.user = mocks.validUser; + await controller.getCurrentUser(req, res); + expect(users.calledWith(1)).to.be.true; + expect(res.status.args[0][0]).to.be.equal(200); + expect(res.json.args[0][0]).not.to.be.deep.equal(mocks.validUser); + expect(res.json.args[0][0]).not.to.have.property("password"); + }); + it("getCurrentUser - if the user is not found, should return status code 400 and the error 'User not found'", async () => { + const users = sinon.stub(userService, "getUser").resolves(null); + req.user = mocks.validUser; + await controller.getCurrentUser(req, res); + expect(users.calledWith(1)).to.be.true; + expect(res.status.args[0][0]).to.be.equal(400); + expect(res.json.args[0][0]).to.be.deep.equal({ error: "User not found" }); + }); + it("getCurrentUser - if something goes wrong, should return status code 500 and the title error code GET_USER_ERROR", async () => { + const users = sinon.stub(userService, "getUser").rejects(); + req.user = mocks.validUser; + await controller.getCurrentUser(req, res); + expect(users.calledWith(1)).to.be.true; + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_USER_ERROR", + message: "Error", + }); + }); + it("updateUserDetails - if everything goes right, should return the updated user without the password", async () => { + const users = sinon + .stub(userService, "updateUser") + .resolves(mocks.validUser); + req.user = mocks.validUser; + req.body = { + name: "Joana", + surname: "D'ark", + }; + await controller.updateUserDetails(req, res); + expect(users.args[0]).to.be.deep.equal([ + 1, + { name: "Joana", surname: "D'ark" }, + ]); + expect(res.status.args[0][0]).to.be.equal(200); + expect(res.json.args[0][0]).to.be.deep.equal({ + updated: true, + user: { + name: "Jane", + surname: "Doe", + }, + }); + }); + it("updateUserDetails - if something goes wrong, should return status code 500 and the title error code UPDATE_USER_ERROR", async () => { + const users = sinon.stub(userService, "updateUser").rejects(); + req.user = mocks.validUser; + req.body = { + name: "Joana", + surname: "D'ark", + }; + await controller.updateUserDetails(req, res); + expect(users.args[0]).to.be.deep.equal([ + 1, + { name: "Joana", surname: "D'ark" }, + ]); + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "UPDATE_USER_ERROR", + message: "Error", + }); + }); + it("deleteUser - if everything goes right, should return the message 'User deleted successfully'", async () => { + const users = sinon.stub(userService, "deleteUser").resolves(); + req.user = mocks.validUser; + await controller.deleteUser(req, res); + expect(users.called).to.be.true; + expect(res.status.args[0][0]).to.be.equal(200); + expect(res.json.args[0][0]).to.be.deep.equal({ + message: "User deleted successfully", + }); + }); + it("deleteUser - if something goes wrong, should return status code 500 and the title error code DELETE_USER_ERROR", async () => { + const users = sinon.stub(userService, "deleteUser").rejects(); + req.user = mocks.validUser; + await controller.deleteUser(req, res); + expect(users.called).to.be.true; + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_USER_ERROR", + message: "Error", + }); + }); }); From 82f25000e29d755cc00440d5e6787e457fa4be2d Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 15 Nov 2024 14:10:19 -0800 Subject: [PATCH 013/178] test: add test coverage --- .../b72fb412-1eff-4d34-8ad6-2c522d5b610c.json | 1 + .../b72fb412-1eff-4d34-8ad6-2c522d5b610c.json | 1 + backend/.nyc_output/processinfo/index.json | 1 + backend/package-lock.json | 1756 +++++++++++++++-- backend/package.json | 3 +- 5 files changed, 1649 insertions(+), 113 deletions(-) create mode 100644 backend/.nyc_output/b72fb412-1eff-4d34-8ad6-2c522d5b610c.json create mode 100644 backend/.nyc_output/processinfo/b72fb412-1eff-4d34-8ad6-2c522d5b610c.json create mode 100644 backend/.nyc_output/processinfo/index.json diff --git a/backend/.nyc_output/b72fb412-1eff-4d34-8ad6-2c522d5b610c.json b/backend/.nyc_output/b72fb412-1eff-4d34-8ad6-2c522d5b610c.json new file mode 100644 index 00000000..dfca37c8 --- /dev/null +++ b/backend/.nyc_output/b72fb412-1eff-4d34-8ad6-2c522d5b610c.json @@ -0,0 +1 @@ +{"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/controllers/user.controller.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/controllers/user.controller.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":35},"end":{"line":2,"column":63}},"2":{"start":{"line":3,"column":20},"end":{"line":3,"column":54}},"3":{"start":{"line":4,"column":11},"end":{"line":4,"column":24}},"4":{"start":{"line":5,"column":32},"end":{"line":5,"column":65}},"5":{"start":{"line":7,"column":20},"end":{"line":7,"column":37}},"6":{"start":{"line":10,"column":17},"end":{"line":12,"column":1}},"7":{"start":{"line":11,"column":2},"end":{"line":11,"column":54}},"8":{"start":{"line":14,"column":29},"end":{"line":26,"column":1}},"9":{"start":{"line":15,"column":37},"end":{"line":15,"column":45}},"10":{"start":{"line":17,"column":2},"end":{"line":23,"column":3}},"11":{"start":{"line":18,"column":4},"end":{"line":18,"column":86}},"12":{"start":{"line":19,"column":4},"end":{"line":22,"column":7}},"13":{"start":{"line":25,"column":2},"end":{"line":25,"column":9}},"14":{"start":{"line":28,"column":31},"end":{"line":34,"column":1}},"15":{"start":{"line":29,"column":17},"end":{"line":29,"column":38}},"16":{"start":{"line":30,"column":2},"end":{"line":32,"column":3}},"17":{"start":{"line":31,"column":4},"end":{"line":31,"column":76}},"18":{"start":{"line":33,"column":2},"end":{"line":33,"column":9}},"19":{"start":{"line":36,"column":30},"end":{"line":44,"column":1}},"20":{"start":{"line":40,"column":4},"end":{"line":40,"column":36}},"21":{"start":{"line":40,"column":24},"end":{"line":40,"column":36}},"22":{"start":{"line":41,"column":4},"end":{"line":41,"column":75}},"23":{"start":{"line":41,"column":63},"end":{"line":41,"column":75}},"24":{"start":{"line":42,"column":4},"end":{"line":42,"column":84}},"25":{"start":{"line":46,"column":25},"end":{"line":62,"column":1}},"26":{"start":{"line":47,"column":17},"end":{"line":47,"column":19}},"27":{"start":{"line":49,"column":2},"end":{"line":59,"column":4}},"28":{"start":{"line":50,"column":4},"end":{"line":58,"column":5}},"29":{"start":{"line":51,"column":6},"end":{"line":55,"column":7}},"30":{"start":{"line":52,"column":8},"end":{"line":52,"column":46}},"31":{"start":{"line":54,"column":8},"end":{"line":54,"column":35}},"32":{"start":{"line":56,"column":11},"end":{"line":58,"column":5}},"33":{"start":{"line":57,"column":6},"end":{"line":57,"column":25}},"34":{"start":{"line":61,"column":2},"end":{"line":61,"column":16}},"35":{"start":{"line":64,"column":21},"end":{"line":90,"column":1}},"36":{"start":{"line":65,"column":48},"end":{"line":65,"column":57}},"37":{"start":{"line":67,"column":2},"end":{"line":89,"column":3}},"38":{"start":{"line":68,"column":47},"end":{"line":68,"column":96}},"39":{"start":{"line":70,"column":20},"end":{"line":80,"column":5}},"40":{"start":{"line":71,"column":32},"end":{"line":76,"column":7}},"41":{"start":{"line":82,"column":4},"end":{"line":82,"column":36}},"42":{"start":{"line":84,"column":36},"end":{"line":87,"column":5}},"43":{"start":{"line":88,"column":4},"end":{"line":88,"column":41}},"44":{"start":{"line":93,"column":23},"end":{"line":112,"column":1}},"45":{"start":{"line":94,"column":17},"end":{"line":94,"column":28}},"46":{"start":{"line":95,"column":2},"end":{"line":111,"column":3}},"47":{"start":{"line":96,"column":17},"end":{"line":96,"column":50}},"48":{"start":{"line":97,"column":4},"end":{"line":103,"column":5}},"49":{"start":{"line":98,"column":58},"end":{"line":98,"column":62}},"50":{"start":{"line":99,"column":6},"end":{"line":99,"column":119}},"51":{"start":{"line":102,"column":6},"end":{"line":102,"column":63}},"52":{"start":{"line":106,"column":36},"end":{"line":109,"column":5}},"53":{"start":{"line":110,"column":4},"end":{"line":110,"column":41}},"54":{"start":{"line":114,"column":26},"end":{"line":128,"column":1}},"55":{"start":{"line":115,"column":17},"end":{"line":115,"column":28}},"56":{"start":{"line":116,"column":17},"end":{"line":116,"column":25}},"57":{"start":{"line":117,"column":2},"end":{"line":127,"column":3}},"58":{"start":{"line":118,"column":24},"end":{"line":118,"column":68}},"59":{"start":{"line":120,"column":4},"end":{"line":120,"column":96}},"60":{"start":{"line":122,"column":36},"end":{"line":125,"column":5}},"61":{"start":{"line":126,"column":4},"end":{"line":126,"column":41}},"62":{"start":{"line":130,"column":19},"end":{"line":143,"column":1}},"63":{"start":{"line":131,"column":2},"end":{"line":142,"column":3}},"64":{"start":{"line":132,"column":19},"end":{"line":132,"column":30}},"65":{"start":{"line":133,"column":4},"end":{"line":133,"column":41}},"66":{"start":{"line":135,"column":4},"end":{"line":135,"column":67}},"67":{"start":{"line":137,"column":36},"end":{"line":140,"column":5}},"68":{"start":{"line":141,"column":4},"end":{"line":141,"column":41}},"69":{"start":{"line":145,"column":0},"end":{"line":154,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":17},"end":{"line":10,"column":18}},"loc":{"start":{"line":10,"column":26},"end":{"line":12,"column":1}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":14,"column":29},"end":{"line":14,"column":30}},"loc":{"start":{"line":14,"column":49},"end":{"line":26,"column":1}},"line":14},"2":{"name":"(anonymous_2)","decl":{"start":{"line":28,"column":31},"end":{"line":28,"column":32}},"loc":{"start":{"line":28,"column":51},"end":{"line":34,"column":1}},"line":28},"3":{"name":"(anonymous_3)","decl":{"start":{"line":39,"column":36},"end":{"line":39,"column":37}},"loc":{"start":{"line":39,"column":45},"end":{"line":43,"column":3}},"line":39},"4":{"name":"(anonymous_4)","decl":{"start":{"line":46,"column":25},"end":{"line":46,"column":26}},"loc":{"start":{"line":46,"column":48},"end":{"line":62,"column":1}},"line":46},"5":{"name":"(anonymous_5)","decl":{"start":{"line":49,"column":32},"end":{"line":49,"column":33}},"loc":{"start":{"line":49,"column":39},"end":{"line":59,"column":3}},"line":49},"6":{"name":"(anonymous_6)","decl":{"start":{"line":64,"column":21},"end":{"line":64,"column":22}},"loc":{"start":{"line":64,"column":41},"end":{"line":90,"column":1}},"line":64},"7":{"name":"(anonymous_7)","decl":{"start":{"line":71,"column":23},"end":{"line":71,"column":24}},"loc":{"start":{"line":71,"column":32},"end":{"line":76,"column":7}},"line":71},"8":{"name":"(anonymous_8)","decl":{"start":{"line":93,"column":23},"end":{"line":93,"column":24}},"loc":{"start":{"line":93,"column":43},"end":{"line":112,"column":1}},"line":93},"9":{"name":"(anonymous_9)","decl":{"start":{"line":114,"column":26},"end":{"line":114,"column":27}},"loc":{"start":{"line":114,"column":46},"end":{"line":128,"column":1}},"line":114},"10":{"name":"(anonymous_10)","decl":{"start":{"line":130,"column":19},"end":{"line":130,"column":20}},"loc":{"start":{"line":130,"column":39},"end":{"line":143,"column":1}},"line":130}},"branchMap":{"0":{"loc":{"start":{"line":17,"column":2},"end":{"line":23,"column":3}},"type":"if","locations":[{"start":{"line":17,"column":2},"end":{"line":23,"column":3}},{"start":{},"end":{}}],"line":17},"1":{"loc":{"start":{"line":17,"column":6},"end":{"line":17,"column":74}},"type":"binary-expr","locations":[{"start":{"line":17,"column":6},"end":{"line":17,"column":24}},{"start":{"line":17,"column":28},"end":{"line":17,"column":49}},{"start":{"line":17,"column":53},"end":{"line":17,"column":74}}],"line":17},"2":{"loc":{"start":{"line":30,"column":2},"end":{"line":32,"column":3}},"type":"if","locations":[{"start":{"line":30,"column":2},"end":{"line":32,"column":3}},{"start":{},"end":{}}],"line":30},"3":{"loc":{"start":{"line":40,"column":4},"end":{"line":40,"column":36}},"type":"if","locations":[{"start":{"line":40,"column":4},"end":{"line":40,"column":36}},{"start":{},"end":{}}],"line":40},"4":{"loc":{"start":{"line":41,"column":4},"end":{"line":41,"column":75}},"type":"if","locations":[{"start":{"line":41,"column":4},"end":{"line":41,"column":75}},{"start":{},"end":{}}],"line":41},"5":{"loc":{"start":{"line":41,"column":8},"end":{"line":41,"column":61}},"type":"binary-expr","locations":[{"start":{"line":41,"column":8},"end":{"line":41,"column":23}},{"start":{"line":41,"column":27},"end":{"line":41,"column":61}}],"line":41},"6":{"loc":{"start":{"line":50,"column":4},"end":{"line":58,"column":5}},"type":"if","locations":[{"start":{"line":50,"column":4},"end":{"line":58,"column":5}},{"start":{"line":56,"column":11},"end":{"line":58,"column":5}}],"line":50},"7":{"loc":{"start":{"line":51,"column":6},"end":{"line":55,"column":7}},"type":"if","locations":[{"start":{"line":51,"column":6},"end":{"line":55,"column":7}},{"start":{"line":53,"column":13},"end":{"line":55,"column":7}}],"line":51},"8":{"loc":{"start":{"line":56,"column":11},"end":{"line":58,"column":5}},"type":"if","locations":[{"start":{"line":56,"column":11},"end":{"line":58,"column":5}},{"start":{},"end":{}}],"line":56},"9":{"loc":{"start":{"line":56,"column":15},"end":{"line":56,"column":49}},"type":"binary-expr","locations":[{"start":{"line":56,"column":15},"end":{"line":56,"column":32}},{"start":{"line":56,"column":36},"end":{"line":56,"column":49}}],"line":56},"10":{"loc":{"start":{"line":65,"column":10},"end":{"line":65,"column":18}},"type":"default-arg","locations":[{"start":{"line":65,"column":17},"end":{"line":65,"column":18}}],"line":65},"11":{"loc":{"start":{"line":65,"column":20},"end":{"line":65,"column":30}},"type":"default-arg","locations":[{"start":{"line":65,"column":28},"end":{"line":65,"column":30}}],"line":65},"12":{"loc":{"start":{"line":65,"column":32},"end":{"line":65,"column":43}},"type":"default-arg","locations":[{"start":{"line":65,"column":41},"end":{"line":65,"column":43}}],"line":65},"13":{"loc":{"start":{"line":97,"column":4},"end":{"line":103,"column":5}},"type":"if","locations":[{"start":{"line":97,"column":4},"end":{"line":103,"column":5}},{"start":{"line":101,"column":8},"end":{"line":103,"column":5}}],"line":97}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":0,"8":1,"9":2,"10":2,"11":1,"12":1,"13":1,"14":1,"15":0,"16":0,"17":0,"18":0,"19":1,"20":0,"21":0,"22":0,"23":0,"24":0,"25":1,"26":1,"27":1,"28":2,"29":2,"30":0,"31":2,"32":0,"33":0,"34":1,"35":1,"36":2,"37":2,"38":2,"39":1,"40":2,"41":1,"42":1,"43":1,"44":1,"45":3,"46":3,"47":3,"48":2,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":2,"56":2,"57":2,"58":2,"59":1,"60":1,"61":1,"62":1,"63":2,"64":2,"65":2,"66":1,"67":1,"68":1,"69":1},"f":{"0":0,"1":2,"2":0,"3":0,"4":1,"5":2,"6":2,"7":2,"8":3,"9":2,"10":2},"b":{"0":[1,1],"1":[2,1,1],"2":[0,0],"3":[0,0],"4":[0,0],"5":[0,0],"6":[2,0],"7":[0,2],"8":[0,0],"9":[0,0],"10":[0],"11":[0],"12":[0],"13":[1,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"593032c371c717b350f1648401d7c5f7ec3bc12c","contentHash":"c6a28384da085399660d8cc296f8c5f44594536dd92c72a44b035a7635b5a578"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/config/settings.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/config/settings.js","statementMap":{"0":{"start":{"line":1,"column":18},"end":{"line":1,"column":58}},"1":{"start":{"line":2,"column":17},"end":{"line":2,"column":31}},"2":{"start":{"line":4,"column":0},"end":{"line":28,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"082a0b99fa59646067b184e4d712f01952555220","contentHash":"d6ad0f2484a540a658bc1c4363f3db4832a31ff96e7ebe1921d642994caeec6d"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/constants.helper.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/constants.helper.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":14,"column":5}}},"fnMap":{},"branchMap":{},"s":{"0":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"220d227d39a5c6c75edaa96b0eb8b7cb69165c3c","contentHash":"588a5bcb27882d6a9ee8fb4323a89047700572d34bc725352ed438e99a74e1f3"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/service/user.service.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/service/user.service.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":49}},"1":{"start":{"line":2,"column":11},"end":{"line":2,"column":31}},"2":{"start":{"line":3,"column":13},"end":{"line":3,"column":20}},"3":{"start":{"line":4,"column":15},"end":{"line":4,"column":24}},"4":{"start":{"line":5,"column":14},"end":{"line":5,"column":22}},"5":{"start":{"line":6,"column":18},"end":{"line":6,"column":30}},"6":{"start":{"line":7,"column":18},"end":{"line":7,"column":30}},"7":{"start":{"line":11,"column":4},"end":{"line":17,"column":5}},"8":{"start":{"line":12,"column":6},"end":{"line":14,"column":9}},"9":{"start":{"line":16,"column":6},"end":{"line":16,"column":53}},"10":{"start":{"line":21,"column":4},"end":{"line":45,"column":5}},"11":{"start":{"line":22,"column":21},"end":{"line":22,"column":59}},"12":{"start":{"line":24,"column":6},"end":{"line":41,"column":9}},"13":{"start":{"line":44,"column":6},"end":{"line":44,"column":53}},"14":{"start":{"line":49,"column":4},"end":{"line":72,"column":5}},"15":{"start":{"line":50,"column":22},"end":{"line":56,"column":7}},"16":{"start":{"line":58,"column":43},"end":{"line":62,"column":8}},"17":{"start":{"line":64,"column":6},"end":{"line":68,"column":7}},"18":{"start":{"line":65,"column":8},"end":{"line":65,"column":27}},"19":{"start":{"line":67,"column":8},"end":{"line":67,"column":61}},"20":{"start":{"line":71,"column":6},"end":{"line":71,"column":45}},"21":{"start":{"line":76,"column":24},"end":{"line":76,"column":53}},"22":{"start":{"line":77,"column":4},"end":{"line":107,"column":5}},"23":{"start":{"line":78,"column":19},"end":{"line":80,"column":8}},"24":{"start":{"line":81,"column":6},"end":{"line":88,"column":7}},"25":{"start":{"line":82,"column":27},"end":{"line":84,"column":10}},"26":{"start":{"line":85,"column":8},"end":{"line":87,"column":9}},"27":{"start":{"line":86,"column":10},"end":{"line":86,"column":88}},"28":{"start":{"line":90,"column":6},"end":{"line":93,"column":9}},"29":{"start":{"line":94,"column":6},"end":{"line":97,"column":9}},"30":{"start":{"line":98,"column":6},"end":{"line":101,"column":9}},"31":{"start":{"line":103,"column":6},"end":{"line":103,"column":33}},"32":{"start":{"line":105,"column":6},"end":{"line":105,"column":35}},"33":{"start":{"line":106,"column":6},"end":{"line":106,"column":62}},"34":{"start":{"line":112,"column":0},"end":{"line":112,"column":29}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":10,"column":2},"end":{"line":10,"column":3}},"loc":{"start":{"line":10,"column":24},"end":{"line":18,"column":3}},"line":10},"1":{"name":"(anonymous_1)","decl":{"start":{"line":20,"column":2},"end":{"line":20,"column":3}},"loc":{"start":{"line":20,"column":42},"end":{"line":46,"column":3}},"line":20},"2":{"name":"(anonymous_2)","decl":{"start":{"line":48,"column":2},"end":{"line":48,"column":3}},"loc":{"start":{"line":48,"column":35},"end":{"line":73,"column":3}},"line":48},"3":{"name":"(anonymous_3)","decl":{"start":{"line":75,"column":2},"end":{"line":75,"column":3}},"loc":{"start":{"line":75,"column":27},"end":{"line":109,"column":3}},"line":75}},"branchMap":{"0":{"loc":{"start":{"line":51,"column":12},"end":{"line":51,"column":48}},"type":"binary-expr","locations":[{"start":{"line":51,"column":12},"end":{"line":51,"column":23}},{"start":{"line":51,"column":27},"end":{"line":51,"column":48}}],"line":51},"1":{"loc":{"start":{"line":52,"column":12},"end":{"line":52,"column":57}},"type":"binary-expr","locations":[{"start":{"line":52,"column":12},"end":{"line":52,"column":26}},{"start":{"line":52,"column":30},"end":{"line":52,"column":57}}],"line":52},"2":{"loc":{"start":{"line":53,"column":12},"end":{"line":53,"column":51}},"type":"binary-expr","locations":[{"start":{"line":53,"column":12},"end":{"line":53,"column":24}},{"start":{"line":53,"column":28},"end":{"line":53,"column":51}}],"line":53},"3":{"loc":{"start":{"line":55,"column":12},"end":{"line":55,"column":113}},"type":"binary-expr","locations":[{"start":{"line":55,"column":14},"end":{"line":55,"column":28}},{"start":{"line":55,"column":32},"end":{"line":55,"column":53}},{"start":{"line":55,"column":57},"end":{"line":55,"column":80}},{"start":{"line":55,"column":86},"end":{"line":55,"column":113}}],"line":55},"4":{"loc":{"start":{"line":64,"column":6},"end":{"line":68,"column":7}},"type":"if","locations":[{"start":{"line":64,"column":6},"end":{"line":68,"column":7}},{"start":{"line":66,"column":13},"end":{"line":68,"column":7}}],"line":64},"5":{"loc":{"start":{"line":81,"column":6},"end":{"line":88,"column":7}},"type":"if","locations":[{"start":{"line":81,"column":6},"end":{"line":88,"column":7}},{"start":{},"end":{}}],"line":81},"6":{"loc":{"start":{"line":85,"column":8},"end":{"line":87,"column":9}},"type":"if","locations":[{"start":{"line":85,"column":8},"end":{"line":87,"column":9}},{"start":{},"end":{}}],"line":85}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":2,"8":2,"9":1,"10":4,"11":4,"12":4,"13":1,"14":2,"15":2,"16":2,"17":1,"18":1,"19":0,"20":1,"21":2,"22":2,"23":2,"24":2,"25":2,"26":2,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1},"f":{"0":2,"1":4,"2":2,"3":2},"b":{"0":[2,2],"1":[2,2],"2":[2,2],"3":[2,2,2,0],"4":[1,0],"5":[2,0],"6":[1,1]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"be990e81d0cca17d6994745e3dd36d7896e55363","contentHash":"00680053ac1deb9c0b2b92f831cb4e3ad0f473f904c51ed9b054e70b3d77d708"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/index.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/index.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":42}},"1":{"start":{"line":2,"column":15},"end":{"line":2,"column":48}},"2":{"start":{"line":4,"column":12},"end":{"line":4,"column":49}},"3":{"start":{"line":5,"column":18},"end":{"line":5,"column":29}},"4":{"start":{"line":7,"column":18},"end":{"line":17,"column":1}},"5":{"start":{"line":19,"column":11},"end":{"line":19,"column":13}},"6":{"start":{"line":21,"column":0},"end":{"line":21,"column":25}},"7":{"start":{"line":22,"column":0},"end":{"line":22,"column":25}},"8":{"start":{"line":25,"column":0},"end":{"line":25,"column":63}},"9":{"start":{"line":26,"column":0},"end":{"line":26,"column":65}},"10":{"start":{"line":27,"column":0},"end":{"line":27,"column":65}},"11":{"start":{"line":28,"column":0},"end":{"line":28,"column":71}},"12":{"start":{"line":29,"column":0},"end":{"line":29,"column":67}},"13":{"start":{"line":30,"column":0},"end":{"line":30,"column":63}},"14":{"start":{"line":31,"column":0},"end":{"line":31,"column":67}},"15":{"start":{"line":32,"column":0},"end":{"line":32,"column":63}},"16":{"start":{"line":33,"column":0},"end":{"line":33,"column":63}},"17":{"start":{"line":34,"column":0},"end":{"line":34,"column":63}},"18":{"start":{"line":35,"column":0},"end":{"line":35,"column":75}},"19":{"start":{"line":38,"column":0},"end":{"line":38,"column":69}},"20":{"start":{"line":39,"column":0},"end":{"line":39,"column":72}},"21":{"start":{"line":41,"column":0},"end":{"line":41,"column":73}},"22":{"start":{"line":42,"column":0},"end":{"line":42,"column":77}},"23":{"start":{"line":44,"column":0},"end":{"line":44,"column":72}},"24":{"start":{"line":45,"column":0},"end":{"line":45,"column":75}},"25":{"start":{"line":47,"column":0},"end":{"line":47,"column":71}},"26":{"start":{"line":48,"column":0},"end":{"line":48,"column":73}},"27":{"start":{"line":50,"column":0},"end":{"line":50,"column":58}},"28":{"start":{"line":51,"column":0},"end":{"line":51,"column":56}},"29":{"start":{"line":52,"column":0},"end":{"line":52,"column":67}},"30":{"start":{"line":53,"column":0},"end":{"line":53,"column":71}},"31":{"start":{"line":54,"column":0},"end":{"line":54,"column":67}},"32":{"start":{"line":55,"column":0},"end":{"line":55,"column":71}},"33":{"start":{"line":57,"column":0},"end":{"line":57,"column":20}}},"fnMap":{},"branchMap":{"0":{"loc":{"start":{"line":4,"column":12},"end":{"line":4,"column":49}},"type":"binary-expr","locations":[{"start":{"line":4,"column":12},"end":{"line":4,"column":32}},{"start":{"line":4,"column":36},"end":{"line":4,"column":49}}],"line":4}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1},"f":{},"b":{"0":[1,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"4a052153577d8b395da88bb0ee89bac07811a62b","contentHash":"6ddb647c7594c0747bd7ec29da9c08bacdd17d2afbda720c9a7e91dc8b8d8482"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/config/config.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/config/config.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":27}},"1":{"start":{"line":2,"column":0},"end":{"line":31,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"1f6506736a0692a1ceca54018c4cf522b720d867","contentHash":"afa5e66ffcff35c27948763042e93721e2965a96e58b5afd25ce00b1067033ec"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/User.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/User.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":49}},"1":{"start":{"line":3,"column":0},"end":{"line":53,"column":2}},"2":{"start":{"line":4,"column":15},"end":{"line":50,"column":3}},"3":{"start":{"line":52,"column":2},"end":{"line":52,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":17},"end":{"line":3,"column":18}},"loc":{"start":{"line":3,"column":43},"end":{"line":53,"column":1}},"line":3}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1},"f":{"0":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"80031b7a001e9da09e83bb4031a6dc546b99aa89","contentHash":"93d7a1c6bbfb5f730658a3f016fe40df06695a4ff9a849fbe627c607f1e049fa"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Popup.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Popup.js","statementMap":{"0":{"start":{"line":1,"column":51},"end":{"line":1,"column":83}},"1":{"start":{"line":2,"column":37},"end":{"line":2,"column":69}},"2":{"start":{"line":4,"column":0},"end":{"line":119,"column":2}},"3":{"start":{"line":5,"column":16},"end":{"line":112,"column":3}},"4":{"start":{"line":18,"column":14},"end":{"line":18,"column":42}},"5":{"start":{"line":27,"column":14},"end":{"line":27,"column":46}},"6":{"start":{"line":45,"column":14},"end":{"line":45,"column":63}},"7":{"start":{"line":55,"column":14},"end":{"line":55,"column":53}},"8":{"start":{"line":65,"column":14},"end":{"line":65,"column":51}},"9":{"start":{"line":75,"column":14},"end":{"line":75,"column":63}},"10":{"start":{"line":85,"column":14},"end":{"line":85,"column":57}},"11":{"start":{"line":114,"column":2},"end":{"line":116,"column":4}},"12":{"start":{"line":115,"column":4},"end":{"line":115,"column":77}},"13":{"start":{"line":118,"column":2},"end":{"line":118,"column":15}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":17},"end":{"line":4,"column":18}},"loc":{"start":{"line":4,"column":43},"end":{"line":119,"column":1}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":17,"column":10},"end":{"line":17,"column":11}},"loc":{"start":{"line":17,"column":31},"end":{"line":19,"column":11}},"line":17},"2":{"name":"(anonymous_2)","decl":{"start":{"line":26,"column":10},"end":{"line":26,"column":11}},"loc":{"start":{"line":26,"column":34},"end":{"line":28,"column":11}},"line":26},"3":{"name":"(anonymous_3)","decl":{"start":{"line":44,"column":10},"end":{"line":44,"column":11}},"loc":{"start":{"line":44,"column":28},"end":{"line":46,"column":11}},"line":44},"4":{"name":"(anonymous_4)","decl":{"start":{"line":54,"column":10},"end":{"line":54,"column":11}},"loc":{"start":{"line":54,"column":28},"end":{"line":56,"column":11}},"line":54},"5":{"name":"(anonymous_5)","decl":{"start":{"line":64,"column":10},"end":{"line":64,"column":11}},"loc":{"start":{"line":64,"column":28},"end":{"line":66,"column":11}},"line":64},"6":{"name":"(anonymous_6)","decl":{"start":{"line":74,"column":10},"end":{"line":74,"column":11}},"loc":{"start":{"line":74,"column":28},"end":{"line":76,"column":11}},"line":74},"7":{"name":"(anonymous_7)","decl":{"start":{"line":84,"column":10},"end":{"line":84,"column":11}},"loc":{"start":{"line":84,"column":28},"end":{"line":86,"column":11}},"line":84},"8":{"name":"(anonymous_8)","decl":{"start":{"line":114,"column":20},"end":{"line":114,"column":21}},"loc":{"start":{"line":114,"column":32},"end":{"line":116,"column":3}},"line":114}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":1,"12":0,"13":1},"f":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"55e656e86723b149117407a6f28a34bc689481b7","contentHash":"321b3a651897f23891a68de39f16633023df8f92df1a313935987f0ad6cf310b"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/guide.helper.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/guide.helper.js","statementMap":{"0":{"start":{"line":1,"column":24},"end":{"line":4,"column":1}},"1":{"start":{"line":2,"column":26},"end":{"line":2,"column":92}},"2":{"start":{"line":3,"column":4},"end":{"line":3,"column":37}},"3":{"start":{"line":6,"column":25},"end":{"line":10,"column":1}},"4":{"start":{"line":7,"column":4},"end":{"line":9,"column":5}},"5":{"start":{"line":8,"column":8},"end":{"line":8,"column":71}},"6":{"start":{"line":12,"column":29},"end":{"line":21,"column":1}},"7":{"start":{"line":13,"column":2},"end":{"line":19,"column":3}},"8":{"start":{"line":14,"column":4},"end":{"line":18,"column":5}},"9":{"start":{"line":15,"column":6},"end":{"line":17,"column":9}},"10":{"start":{"line":20,"column":2},"end":{"line":20,"column":15}},"11":{"start":{"line":23,"column":34},"end":{"line":26,"column":1}},"12":{"start":{"line":24,"column":23},"end":{"line":24,"column":73}},"13":{"start":{"line":25,"column":2},"end":{"line":25,"column":38}},"14":{"start":{"line":28,"column":29},"end":{"line":32,"column":1}},"15":{"start":{"line":29,"column":2},"end":{"line":31,"column":3}},"16":{"start":{"line":30,"column":4},"end":{"line":30,"column":51}},"17":{"start":{"line":34,"column":0},"end":{"line":40,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":24},"end":{"line":1,"column":25}},"loc":{"start":{"line":1,"column":35},"end":{"line":4,"column":1}},"line":1},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":25},"end":{"line":6,"column":26}},"loc":{"start":{"line":6,"column":47},"end":{"line":10,"column":1}},"line":6},"2":{"name":"(anonymous_2)","decl":{"start":{"line":12,"column":29},"end":{"line":12,"column":30}},"loc":{"start":{"line":12,"column":51},"end":{"line":21,"column":1}},"line":12},"3":{"name":"(anonymous_3)","decl":{"start":{"line":23,"column":34},"end":{"line":23,"column":35}},"loc":{"start":{"line":23,"column":45},"end":{"line":26,"column":1}},"line":23},"4":{"name":"(anonymous_4)","decl":{"start":{"line":28,"column":29},"end":{"line":28,"column":30}},"loc":{"start":{"line":28,"column":40},"end":{"line":32,"column":1}},"line":28}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":4},"end":{"line":9,"column":5}},"type":"if","locations":[{"start":{"line":7,"column":4},"end":{"line":9,"column":5}},{"start":{},"end":{}}],"line":7},"1":{"loc":{"start":{"line":14,"column":4},"end":{"line":18,"column":5}},"type":"if","locations":[{"start":{"line":14,"column":4},"end":{"line":18,"column":5}},{"start":{},"end":{}}],"line":14},"2":{"loc":{"start":{"line":14,"column":8},"end":{"line":14,"column":40}},"type":"binary-expr","locations":[{"start":{"line":14,"column":8},"end":{"line":14,"column":13}},{"start":{"line":14,"column":17},"end":{"line":14,"column":40}}],"line":14},"3":{"loc":{"start":{"line":29,"column":2},"end":{"line":31,"column":3}},"type":"if","locations":[{"start":{"line":29,"column":2},"end":{"line":31,"column":3}},{"start":{},"end":{}}],"line":29}},"s":{"0":1,"1":0,"2":0,"3":1,"4":0,"5":0,"6":1,"7":0,"8":0,"9":0,"10":0,"11":1,"12":0,"13":0,"14":1,"15":0,"16":0,"17":1},"f":{"0":0,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0],"3":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"fa7ba17d92df65b5b29f15194c124bfdb643f2f5","contentHash":"e9dbf6ab7f2a92eb5bb962578101ad40f124a5bdd09d97cbf1bd441298efcc5f"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/popup.helper.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/popup.helper.js","statementMap":{"0":{"start":{"line":1,"column":26},"end":{"line":4,"column":1}},"1":{"start":{"line":2,"column":21},"end":{"line":2,"column":49}},"2":{"start":{"line":3,"column":2},"end":{"line":3,"column":36}},"3":{"start":{"line":6,"column":33},"end":{"line":10,"column":1}},"4":{"start":{"line":7,"column":2},"end":{"line":9,"column":3}},"5":{"start":{"line":8,"column":4},"end":{"line":8,"column":42}},"6":{"start":{"line":14,"column":0},"end":{"line":17,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":26},"end":{"line":1,"column":27}},"loc":{"start":{"line":1,"column":37},"end":{"line":4,"column":1}},"line":1},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":33},"end":{"line":6,"column":34}},"loc":{"start":{"line":6,"column":44},"end":{"line":10,"column":1}},"line":6}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":2},"end":{"line":9,"column":3}},"type":"if","locations":[{"start":{"line":7,"column":2},"end":{"line":9,"column":3}},{"start":{},"end":{}}],"line":7}},"s":{"0":1,"1":0,"2":0,"3":1,"4":0,"5":0,"6":1},"f":{"0":0,"1":0},"b":{"0":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"2c69745dd2cfaf30492633b5d564ee218c7c3487","contentHash":"3623c1e5faa355c3405009f646faba1b596cc5469690bcf0f5546e2aa3433606"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Token.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Token.js","statementMap":{"0":{"start":{"line":3,"column":0},"end":{"line":53,"column":2}},"1":{"start":{"line":4,"column":16},"end":{"line":43,"column":3}},"2":{"start":{"line":45,"column":2},"end":{"line":50,"column":4}},"3":{"start":{"line":46,"column":4},"end":{"line":49,"column":7}},"4":{"start":{"line":52,"column":2},"end":{"line":52,"column":15}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":17},"end":{"line":3,"column":18}},"loc":{"start":{"line":3,"column":43},"end":{"line":53,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":45,"column":20},"end":{"line":45,"column":21}},"loc":{"start":{"line":45,"column":32},"end":{"line":50,"column":3}},"line":45}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":1},"f":{"0":1,"1":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"a33dac7118621bf49bab3c7f7d80fb11fef21f0b","contentHash":"f3cc2cc8b32fe4be5347c27c137330418d0ae91e76578c40904aaa47ea2047cd"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/PopupLog.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/PopupLog.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":24,"column":2}},"1":{"start":{"line":2,"column":21},"end":{"line":22,"column":6}},"2":{"start":{"line":23,"column":4},"end":{"line":23,"column":20}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":17},"end":{"line":1,"column":18}},"loc":{"start":{"line":1,"column":43},"end":{"line":24,"column":1}},"line":1}},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{"0":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"318b03b5c482aa393c2f3a4ac8bff1856975cc8e","contentHash":"cd4781a5cbdc9697b7a2fab2614a0abb35c9eba0becd317bd6c86edf1ad0f7da"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Banner.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Banner.js","statementMap":{"0":{"start":{"line":1,"column":51},"end":{"line":1,"column":83}},"1":{"start":{"line":2,"column":36},"end":{"line":2,"column":69}},"2":{"start":{"line":4,"column":0},"end":{"line":73,"column":2}},"3":{"start":{"line":5,"column":19},"end":{"line":67,"column":5}},"4":{"start":{"line":11,"column":18},"end":{"line":11,"column":46}},"5":{"start":{"line":20,"column":18},"end":{"line":20,"column":49}},"6":{"start":{"line":34,"column":18},"end":{"line":34,"column":55}},"7":{"start":{"line":44,"column":18},"end":{"line":44,"column":61}},"8":{"start":{"line":69,"column":4},"end":{"line":71,"column":6}},"9":{"start":{"line":70,"column":8},"end":{"line":70,"column":82}},"10":{"start":{"line":72,"column":4},"end":{"line":72,"column":18}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":4,"column":17},"end":{"line":4,"column":18}},"loc":{"start":{"line":4,"column":43},"end":{"line":73,"column":1}},"line":4},"1":{"name":"(anonymous_1)","decl":{"start":{"line":10,"column":14},"end":{"line":10,"column":15}},"loc":{"start":{"line":10,"column":35},"end":{"line":12,"column":15}},"line":10},"2":{"name":"(anonymous_2)","decl":{"start":{"line":19,"column":14},"end":{"line":19,"column":15}},"loc":{"start":{"line":19,"column":37},"end":{"line":21,"column":15}},"line":19},"3":{"name":"(anonymous_3)","decl":{"start":{"line":33,"column":14},"end":{"line":33,"column":15}},"loc":{"start":{"line":33,"column":32},"end":{"line":35,"column":15}},"line":33},"4":{"name":"(anonymous_4)","decl":{"start":{"line":43,"column":14},"end":{"line":43,"column":15}},"loc":{"start":{"line":43,"column":32},"end":{"line":45,"column":15}},"line":43},"5":{"name":"(anonymous_5)","decl":{"start":{"line":69,"column":23},"end":{"line":69,"column":24}},"loc":{"start":{"line":69,"column":35},"end":{"line":71,"column":5}},"line":69}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":0,"5":0,"6":0,"7":0,"8":1,"9":0,"10":1},"f":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"b26e2d7296fcd806d0f45eb271aeb1e9de40ec49","contentHash":"31a0974f2074b04c3f60dce7ff9d90aa4bb30dae416d7ec902911117a3f47891"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/banner.helper.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/banner.helper.js","statementMap":{"0":{"start":{"line":1,"column":25},"end":{"line":4,"column":1}},"1":{"start":{"line":2,"column":25},"end":{"line":2,"column":42}},"2":{"start":{"line":3,"column":2},"end":{"line":3,"column":54}},"3":{"start":{"line":6,"column":32},"end":{"line":10,"column":1}},"4":{"start":{"line":7,"column":2},"end":{"line":9,"column":3}},"5":{"start":{"line":8,"column":4},"end":{"line":8,"column":40}},"6":{"start":{"line":13,"column":2},"end":{"line":16,"column":4}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":25},"end":{"line":1,"column":26}},"loc":{"start":{"line":1,"column":36},"end":{"line":4,"column":1}},"line":1},"1":{"name":"(anonymous_1)","decl":{"start":{"line":6,"column":32},"end":{"line":6,"column":33}},"loc":{"start":{"line":6,"column":43},"end":{"line":10,"column":1}},"line":6}},"branchMap":{"0":{"loc":{"start":{"line":7,"column":2},"end":{"line":9,"column":3}},"type":"if","locations":[{"start":{"line":7,"column":2},"end":{"line":9,"column":3}},{"start":{},"end":{}}],"line":7}},"s":{"0":1,"1":0,"2":0,"3":1,"4":0,"5":0,"6":1},"f":{"0":0,"1":0},"b":{"0":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"454017c8954bdafbd9dae5c0ea92820bf64f6241","contentHash":"857c0765281bd11806b8a4d53dea4b6dac95fc366cafa829c01c1a416dafd6a9"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Team.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Team.js","statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":27,"column":4}},"1":{"start":{"line":2,"column":17},"end":{"line":24,"column":5}},"2":{"start":{"line":26,"column":4},"end":{"line":26,"column":16}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":17},"end":{"line":1,"column":18}},"loc":{"start":{"line":1,"column":43},"end":{"line":27,"column":3}},"line":1}},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{"0":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"b4e17c6042850eab22ee91591836e609614362f4","contentHash":"8a32869e1d5c8c8ea68f09e613f8778dad1bc3b6a4c8ed60a6ae4dd8f185f701"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Invite.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Invite.js","statementMap":{"0":{"start":{"line":1,"column":17},"end":{"line":1,"column":49}},"1":{"start":{"line":3,"column":0},"end":{"line":42,"column":4}},"2":{"start":{"line":4,"column":19},"end":{"line":39,"column":5}},"3":{"start":{"line":41,"column":4},"end":{"line":41,"column":18}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":17},"end":{"line":3,"column":18}},"loc":{"start":{"line":3,"column":43},"end":{"line":42,"column":3}},"line":3}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1},"f":{"0":1},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"33fe4c23d0fb7493a4603860964ff3ec122e0c2a","contentHash":"cecd4bcc7b4b1abc5ac497bd5c8bbcc9c2e29a4c4f2cf18e3ee89b3e1ac7c222"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Hint.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Hint.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":61}},"1":{"start":{"line":3,"column":0},"end":{"line":118,"column":2}},"2":{"start":{"line":4,"column":15},"end":{"line":111,"column":3}},"3":{"start":{"line":54,"column":12},"end":{"line":54,"column":61}},"4":{"start":{"line":64,"column":12},"end":{"line":64,"column":51}},"5":{"start":{"line":74,"column":12},"end":{"line":74,"column":49}},"6":{"start":{"line":84,"column":12},"end":{"line":84,"column":61}},"7":{"start":{"line":94,"column":12},"end":{"line":94,"column":55}},"8":{"start":{"line":113,"column":2},"end":{"line":115,"column":4}},"9":{"start":{"line":114,"column":4},"end":{"line":114,"column":76}},"10":{"start":{"line":117,"column":2},"end":{"line":117,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":3,"column":17},"end":{"line":3,"column":18}},"loc":{"start":{"line":3,"column":43},"end":{"line":118,"column":1}},"line":3},"1":{"name":"(anonymous_1)","decl":{"start":{"line":53,"column":10},"end":{"line":53,"column":11}},"loc":{"start":{"line":53,"column":28},"end":{"line":55,"column":11}},"line":53},"2":{"name":"(anonymous_2)","decl":{"start":{"line":63,"column":10},"end":{"line":63,"column":11}},"loc":{"start":{"line":63,"column":28},"end":{"line":65,"column":11}},"line":63},"3":{"name":"(anonymous_3)","decl":{"start":{"line":73,"column":10},"end":{"line":73,"column":11}},"loc":{"start":{"line":73,"column":28},"end":{"line":75,"column":11}},"line":73},"4":{"name":"(anonymous_4)","decl":{"start":{"line":83,"column":10},"end":{"line":83,"column":11}},"loc":{"start":{"line":83,"column":28},"end":{"line":85,"column":11}},"line":83},"5":{"name":"(anonymous_5)","decl":{"start":{"line":93,"column":10},"end":{"line":93,"column":11}},"loc":{"start":{"line":93,"column":28},"end":{"line":95,"column":11}},"line":93},"6":{"name":"(anonymous_6)","decl":{"start":{"line":113,"column":19},"end":{"line":113,"column":20}},"loc":{"start":{"line":113,"column":31},"end":{"line":115,"column":3}},"line":113}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":1,"9":0,"10":1},"f":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"db697d4350e61a3df2d08d6989f166bc1917eac2","contentHash":"365611113bf943e97fecb6e60f15be1396f732c814f5472dfab2765b4a9b5919"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Tour.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Tour.js","statementMap":{"0":{"start":{"line":5,"column":4},"end":{"line":5,"column":35}},"1":{"start":{"line":7,"column":0},"end":{"line":81,"column":2}},"2":{"start":{"line":8,"column":15},"end":{"line":74,"column":3}},"3":{"start":{"line":33,"column":12},"end":{"line":35,"column":13}},"4":{"start":{"line":34,"column":14},"end":{"line":34,"column":62}},"5":{"start":{"line":44,"column":12},"end":{"line":46,"column":13}},"6":{"start":{"line":45,"column":14},"end":{"line":45,"column":53}},"7":{"start":{"line":55,"column":12},"end":{"line":57,"column":13}},"8":{"start":{"line":56,"column":14},"end":{"line":56,"column":62}},"9":{"start":{"line":76,"column":2},"end":{"line":78,"column":4}},"10":{"start":{"line":77,"column":4},"end":{"line":77,"column":76}},"11":{"start":{"line":80,"column":2},"end":{"line":80,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":7,"column":17},"end":{"line":7,"column":18}},"loc":{"start":{"line":7,"column":43},"end":{"line":81,"column":1}},"line":7},"1":{"name":"(anonymous_1)","decl":{"start":{"line":32,"column":10},"end":{"line":32,"column":11}},"loc":{"start":{"line":32,"column":33},"end":{"line":36,"column":11}},"line":32},"2":{"name":"(anonymous_2)","decl":{"start":{"line":43,"column":10},"end":{"line":43,"column":11}},"loc":{"start":{"line":43,"column":33},"end":{"line":47,"column":11}},"line":43},"3":{"name":"(anonymous_3)","decl":{"start":{"line":54,"column":10},"end":{"line":54,"column":11}},"loc":{"start":{"line":54,"column":33},"end":{"line":58,"column":11}},"line":54},"4":{"name":"(anonymous_4)","decl":{"start":{"line":76,"column":19},"end":{"line":76,"column":20}},"loc":{"start":{"line":76,"column":31},"end":{"line":78,"column":3}},"line":76}},"branchMap":{"0":{"loc":{"start":{"line":33,"column":12},"end":{"line":35,"column":13}},"type":"if","locations":[{"start":{"line":33,"column":12},"end":{"line":35,"column":13}},{"start":{},"end":{}}],"line":33},"1":{"loc":{"start":{"line":44,"column":12},"end":{"line":46,"column":13}},"type":"if","locations":[{"start":{"line":44,"column":12},"end":{"line":46,"column":13}},{"start":{},"end":{}}],"line":44},"2":{"loc":{"start":{"line":55,"column":12},"end":{"line":57,"column":13}},"type":"if","locations":[{"start":{"line":55,"column":12},"end":{"line":57,"column":13}},{"start":{},"end":{}}],"line":55}},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":1,"10":0,"11":1},"f":{"0":1,"1":0,"2":0,"3":0,"4":0},"b":{"0":[0,0],"1":[0,0],"2":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"31055314e011e1d5ae78a41ed51b690fe4ebac5c","contentHash":"d2daedf78168fa22ac889462a0ad8a075206d6328c8c1f3e92fc49c81eb563e8"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/tour.helper.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/tour.helper.js","statementMap":{"0":{"start":{"line":1,"column":36},"end":{"line":11,"column":1}},"1":{"start":{"line":2,"column":27},"end":{"line":9,"column":3}},"2":{"start":{"line":10,"column":2},"end":{"line":10,"column":56}},"3":{"start":{"line":13,"column":30},"end":{"line":16,"column":1}},"4":{"start":{"line":14,"column":35},"end":{"line":14,"column":69}},"5":{"start":{"line":15,"column":2},"end":{"line":15,"column":64}},"6":{"start":{"line":18,"column":22},"end":{"line":21,"column":1}},"7":{"start":{"line":19,"column":22},"end":{"line":19,"column":39}},"8":{"start":{"line":20,"column":2},"end":{"line":20,"column":51}},"9":{"start":{"line":23,"column":0},"end":{"line":27,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":1,"column":36},"end":{"line":1,"column":37}},"loc":{"start":{"line":1,"column":47},"end":{"line":11,"column":1}},"line":1},"1":{"name":"(anonymous_1)","decl":{"start":{"line":13,"column":30},"end":{"line":13,"column":31}},"loc":{"start":{"line":13,"column":41},"end":{"line":16,"column":1}},"line":13},"2":{"name":"(anonymous_2)","decl":{"start":{"line":18,"column":22},"end":{"line":18,"column":23}},"loc":{"start":{"line":18,"column":33},"end":{"line":21,"column":1}},"line":18}},"branchMap":{},"s":{"0":1,"1":0,"2":0,"3":1,"4":0,"5":0,"6":1,"7":0,"8":0,"9":1},"f":{"0":0,"1":0,"2":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"82311ccef8fbc1bf29f2eb478a6f21030c78af8b","contentHash":"6dcf91f97ba3ab038a2666b069ace39da4c0490a98b1d4670390280226c11942"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Link.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Link.js","statementMap":{"0":{"start":{"line":1,"column":22},"end":{"line":1,"column":53}},"1":{"start":{"line":9,"column":0},"end":{"line":67,"column":2}},"2":{"start":{"line":10,"column":15},"end":{"line":56,"column":3}},"3":{"start":{"line":30,"column":12},"end":{"line":30,"column":40}},"4":{"start":{"line":58,"column":2},"end":{"line":64,"column":4}},"5":{"start":{"line":59,"column":4},"end":{"line":63,"column":7}},"6":{"start":{"line":66,"column":2},"end":{"line":66,"column":14}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":9,"column":17},"end":{"line":9,"column":18}},"loc":{"start":{"line":9,"column":43},"end":{"line":67,"column":1}},"line":9},"1":{"name":"(anonymous_1)","decl":{"start":{"line":29,"column":10},"end":{"line":29,"column":11}},"loc":{"start":{"line":29,"column":34},"end":{"line":31,"column":11}},"line":29},"2":{"name":"(anonymous_2)","decl":{"start":{"line":58,"column":19},"end":{"line":58,"column":20}},"loc":{"start":{"line":58,"column":31},"end":{"line":64,"column":3}},"line":58}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":1,"5":0,"6":1},"f":{"0":1,"1":0,"2":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"7111f157bf595edf66be36d0b168c0363e4bfa47","contentHash":"7bd1b720074d9bb631d4f0fb4fe8f00fd026c660907d2018a8ae0c647e0bde1b"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/link.helper.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/link.helper.js","statementMap":{"0":{"start":{"line":2,"column":2},"end":{"line":2,"column":131}},"1":{"start":{"line":4,"column":27},"end":{"line":4,"column":53}},"2":{"start":{"line":6,"column":20},"end":{"line":13,"column":1}},"3":{"start":{"line":7,"column":2},"end":{"line":12,"column":3}},"4":{"start":{"line":8,"column":4},"end":{"line":8,"column":17}},"5":{"start":{"line":9,"column":4},"end":{"line":9,"column":16}},"6":{"start":{"line":11,"column":4},"end":{"line":11,"column":40}},"7":{"start":{"line":15,"column":0},"end":{"line":19,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":6,"column":20},"end":{"line":6,"column":21}},"loc":{"start":{"line":6,"column":29},"end":{"line":13,"column":1}},"line":6}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":0,"7":1},"f":{"0":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"bcb6d093639c3c6e68b968b061fa413fd99f9ff6","contentHash":"f624f46ecb5500e428352f3e9ffd70117cdebe73389858e7eec2c1ffc0b4dca7"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/HelperLink.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/HelperLink.js","statementMap":{"0":{"start":{"line":1,"column":29},"end":{"line":1,"column":61}},"1":{"start":{"line":9,"column":0},"end":{"line":78,"column":2}},"2":{"start":{"line":10,"column":21},"end":{"line":68,"column":3}},"3":{"start":{"line":31,"column":12},"end":{"line":31,"column":61}},"4":{"start":{"line":41,"column":12},"end":{"line":41,"column":53}},"5":{"start":{"line":51,"column":12},"end":{"line":51,"column":49}},"6":{"start":{"line":70,"column":2},"end":{"line":75,"column":4}},"7":{"start":{"line":71,"column":4},"end":{"line":74,"column":7}},"8":{"start":{"line":77,"column":2},"end":{"line":77,"column":20}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":9,"column":17},"end":{"line":9,"column":18}},"loc":{"start":{"line":9,"column":43},"end":{"line":78,"column":1}},"line":9},"1":{"name":"(anonymous_1)","decl":{"start":{"line":30,"column":10},"end":{"line":30,"column":11}},"loc":{"start":{"line":30,"column":28},"end":{"line":32,"column":11}},"line":30},"2":{"name":"(anonymous_2)","decl":{"start":{"line":40,"column":10},"end":{"line":40,"column":11}},"loc":{"start":{"line":40,"column":28},"end":{"line":42,"column":11}},"line":40},"3":{"name":"(anonymous_3)","decl":{"start":{"line":50,"column":10},"end":{"line":50,"column":11}},"loc":{"start":{"line":50,"column":28},"end":{"line":52,"column":11}},"line":50},"4":{"name":"(anonymous_4)","decl":{"start":{"line":70,"column":25},"end":{"line":70,"column":26}},"loc":{"start":{"line":70,"column":37},"end":{"line":75,"column":3}},"line":70}},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":0,"4":0,"5":0,"6":1,"7":0,"8":1},"f":{"0":1,"1":0,"2":0,"3":0,"4":0},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"4e7c2180f0322653c9df21a2d6f87a13292c2abc","contentHash":"3eb18679116ede6dc612b7b765c69bb18852c873dec3ec78a073b3ab28d3948d"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/errors.helper.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/errors.helper.js","statementMap":{"0":{"start":{"line":1,"column":25},"end":{"line":1,"column":40}},"1":{"start":{"line":2,"column":27},"end":{"line":2,"column":32}},"2":{"start":{"line":5,"column":18},"end":{"line":5,"column":72}},"3":{"start":{"line":6,"column":2},"end":{"line":8,"column":3}},"4":{"start":{"line":7,"column":4},"end":{"line":7,"column":30}},"5":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"6":{"start":{"line":10,"column":4},"end":{"line":10,"column":34}},"7":{"start":{"line":12,"column":2},"end":{"line":15,"column":4}},"8":{"start":{"line":19,"column":2},"end":{"line":19,"column":48}},"9":{"start":{"line":23,"column":2},"end":{"line":23,"column":48}},"10":{"start":{"line":26,"column":0},"end":{"line":30,"column":2}}},"fnMap":{"0":{"name":"errorResponse","decl":{"start":{"line":4,"column":9},"end":{"line":4,"column":22}},"loc":{"start":{"line":4,"column":62},"end":{"line":16,"column":1}},"line":4},"1":{"name":"badRequest","decl":{"start":{"line":18,"column":9},"end":{"line":18,"column":19}},"loc":{"start":{"line":18,"column":61},"end":{"line":20,"column":1}},"line":18},"2":{"name":"internalServerError","decl":{"start":{"line":22,"column":9},"end":{"line":22,"column":28}},"loc":{"start":{"line":22,"column":56},"end":{"line":24,"column":1}},"line":22}},"branchMap":{"0":{"loc":{"start":{"line":4,"column":46},"end":{"line":4,"column":60}},"type":"default-arg","locations":[{"start":{"line":4,"column":56},"end":{"line":4,"column":60}}],"line":4},"1":{"loc":{"start":{"line":5,"column":27},"end":{"line":5,"column":70}},"type":"binary-expr","locations":[{"start":{"line":5,"column":27},"end":{"line":5,"column":51}},{"start":{"line":5,"column":55},"end":{"line":5,"column":70}}],"line":5},"2":{"loc":{"start":{"line":6,"column":2},"end":{"line":8,"column":3}},"type":"if","locations":[{"start":{"line":6,"column":2},"end":{"line":8,"column":3}},{"start":{},"end":{}}],"line":6},"3":{"loc":{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},"type":"if","locations":[{"start":{"line":9,"column":2},"end":{"line":11,"column":3}},{"start":{},"end":{}}],"line":9},"4":{"loc":{"start":{"line":18,"column":29},"end":{"line":18,"column":59}},"type":"default-arg","locations":[{"start":{"line":18,"column":41},"end":{"line":18,"column":59}}],"line":18},"5":{"loc":{"start":{"line":22,"column":40},"end":{"line":22,"column":54}},"type":"default-arg","locations":[{"start":{"line":22,"column":50},"end":{"line":22,"column":54}}],"line":22}},"s":{"0":1,"1":1,"2":4,"3":4,"4":4,"5":4,"6":4,"7":4,"8":0,"9":4,"10":1},"f":{"0":4,"1":0,"2":4},"b":{"0":[0],"1":[4,0],"2":[4,0],"3":[4,0],"4":[0],"5":[0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"992fbdb66cd17ca3751d2b10c92f5e1c275ba6f4","contentHash":"4d049a998266dc375e94fe38e58647e6a4ec78a4d6210ba735688357d29e1827"},"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/test/unit/mocks/user.mock.js":{"path":"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/test/unit/mocks/user.mock.js","statementMap":{"0":{"start":{"line":1,"column":18},"end":{"line":10,"column":1}},"1":{"start":{"line":12,"column":18},"end":{"line":63,"column":1}},"2":{"start":{"line":65,"column":0},"end":{"line":68,"column":2}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"f81fdb0b7465ee5110eb80c4496a71342bf12987","contentHash":"5d5275de3711b549104ac49d4426219477ca8b8ce4e2bcd05d554bc55937291f"}} \ No newline at end of file diff --git a/backend/.nyc_output/processinfo/b72fb412-1eff-4d34-8ad6-2c522d5b610c.json b/backend/.nyc_output/processinfo/b72fb412-1eff-4d34-8ad6-2c522d5b610c.json new file mode 100644 index 00000000..3cf45ff8 --- /dev/null +++ b/backend/.nyc_output/processinfo/b72fb412-1eff-4d34-8ad6-2c522d5b610c.json @@ -0,0 +1 @@ +{"parent":null,"pid":19634,"argv":["/Users/debora/.nvm/versions/node/v23.1.0/bin/node","/Users/debora/Documents/projects/bluewave-onboarding/backend/node_modules/.bin/mocha","src/test/**/*.test.js"],"execArgv":[],"cwd":"/Users/debora/Documents/projects/bluewave-onboarding/backend","time":1731708561374,"ppid":19633,"coverageFilename":"/Users/debora/Documents/projects/bluewave-onboarding/backend/.nyc_output/b72fb412-1eff-4d34-8ad6-2c522d5b610c.json","externalId":"","uuid":"b72fb412-1eff-4d34-8ad6-2c522d5b610c","files":["/Users/debora/Documents/projects/bluewave-onboarding/backend/src/controllers/user.controller.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/config/settings.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/constants.helper.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/service/user.service.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/index.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/config/config.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/User.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Popup.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/guide.helper.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/popup.helper.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Token.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/PopupLog.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Banner.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/banner.helper.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Team.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Invite.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Hint.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Tour.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/tour.helper.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Link.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/link.helper.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/HelperLink.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/errors.helper.js","/Users/debora/Documents/projects/bluewave-onboarding/backend/src/test/unit/mocks/user.mock.js"]} \ No newline at end of file diff --git a/backend/.nyc_output/processinfo/index.json b/backend/.nyc_output/processinfo/index.json new file mode 100644 index 00000000..d56d91d9 --- /dev/null +++ b/backend/.nyc_output/processinfo/index.json @@ -0,0 +1 @@ +{"processes":{"b72fb412-1eff-4d34-8ad6-2c522d5b610c":{"parent":null,"children":[]}},"files":{"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/controllers/user.controller.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/config/settings.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/constants.helper.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/service/user.service.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/index.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/config/config.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/User.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Popup.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/guide.helper.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/popup.helper.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Token.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/PopupLog.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Banner.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/banner.helper.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Team.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Invite.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Hint.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Tour.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/tour.helper.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/Link.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/link.helper.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/models/HelperLink.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/utils/errors.helper.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"],"/Users/debora/Documents/projects/bluewave-onboarding/backend/src/test/unit/mocks/user.mock.js":["b72fb412-1eff-4d34-8ad6-2c522d5b610c"]},"externalIds":{}} \ No newline at end of file diff --git a/backend/package-lock.json b/backend/package-lock.json index f0d271f1..9e990fd2 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -27,10 +27,349 @@ "chai": "^5.1.2", "mocha": "^10.8.2", "nodemon": "^3.1.0", + "nyc": "^17.1.0", "sequelize-cli": "^6.6.2", "sinon": "^19.0.2" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/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, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/core/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/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, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -134,6 +473,176 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=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", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "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/load-nyc-config/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, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/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, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", @@ -305,6 +814,20 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, + "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, + "license": "MIT", + "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", @@ -354,12 +877,32 @@ "node": ">= 8" } }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "license": "ISC" }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "license": "MIT" + }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -507,6 +1050,39 @@ "dev": true, "license": "ISC" }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -522,6 +1098,22 @@ "node": ">= 0.8" } }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -554,6 +1146,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", + "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" + } + ], + "license": "CC-BY-4.0" + }, "node_modules/chai": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", @@ -655,6 +1268,16 @@ "node": ">=10" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/cli-color": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", @@ -723,6 +1346,13 @@ "node": ">=14" } }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -767,6 +1397,13 @@ "node": ">= 0.6" } }, + "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, + "license": "MIT" + }, "node_modules/cookie": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", @@ -856,6 +1493,22 @@ "node": ">=6" } }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -1002,6 +1655,13 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "license": "MIT" }, + "node_modules/electron-to-chromium": { + "version": "1.5.61", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.61.tgz", + "integrity": "sha512-CcRGSBCBB6L9c3PBJWYYrBo6Bzeoi+GZTKvtuRtooJGWsINk+mOInZWcssU35zDTAwreVcrMimc9aMyPpehRNw==", + "dev": true, + "license": "ISC" + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1055,6 +1715,13 @@ "node": ">=0.10" } }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT" + }, "node_modules/es6-iterator": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", @@ -1095,9 +1762,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -1139,6 +1806,20 @@ "node": ">=0.10" } }, + "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==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -1255,6 +1936,24 @@ "node": ">= 0.8" } }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -1330,6 +2029,27 @@ "node": ">= 0.6" } }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "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" + } + ], + "license": "MIT" + }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -1421,6 +2141,16 @@ "node": ">=10" } }, + "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, + "license": "MIT", + "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", @@ -1450,6 +2180,16 @@ "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, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -1484,6 +2224,16 @@ "node": ">= 6" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -1576,6 +2326,23 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "license": "ISC" }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -1606,6 +2373,13 @@ "node": ">=16.0.0" } }, + "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, + "license": "MIT" + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -1677,6 +2451,26 @@ "dev": true, "license": "ISC" }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/inflection": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", @@ -1725,108 +2519,304 @@ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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, + "license": "MIT" + }, + "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, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "license": "ISC", + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/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==", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "semver": "^7.5.3" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/istanbul-lib-report/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, "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "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, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "is-extglob": "^2.1.1" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" + "node": ">=10" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, "engines": { - "node": ">=8" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, - "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==", + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -1958,6 +2948,13 @@ "node": ">=14" } }, + "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==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1971,6 +2968,32 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "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", @@ -2062,6 +3085,13 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -2553,6 +3583,26 @@ } } }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" + }, "node_modules/nodemailer": { "version": "6.9.15", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.15.tgz", @@ -2584,74 +3634,263 @@ "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=10" + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/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, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/nyc": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", + "integrity": "sha512-U42vQ4czpKa0QdI1hu950XuNhYqgoM+ZF1HT+VuUHL9hPfDPVvNQyltmMqdE9bUHMVa+8yNbc3QKTj8zQhlVxQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^3.3.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.2", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/nyc/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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc/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, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/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, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nodemon/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "node_modules/nyc/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, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/nodemon/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/nyc/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, - "license": "MIT" - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", + "license": "MIT", "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "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==", + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, "license": "ISC", "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/object-assign": { @@ -2728,6 +3967,45 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", @@ -2902,6 +4180,13 @@ "split2": "^4.1.0" } }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", @@ -2915,6 +4200,75 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "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, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/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, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -2954,6 +4308,19 @@ "node": ">=0.10.0" } }, + "node_modules/process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -3057,6 +4424,19 @@ "node": ">=8.10.0" } }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3067,6 +4447,13 @@ "node": ">=0.10.0" } }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -3085,6 +4472,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/retry-as-promised": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", @@ -3476,6 +4873,38 @@ "node": ">=0.10.0" } }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spawn-wrap/node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -3485,6 +4914,13 @@ "node": ">= 10.x" } }, + "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, + "license": "BSD-3-Clause" + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -3559,6 +4995,16 @@ "node": ">=8" } }, + "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, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3615,6 +5061,21 @@ "node": ">=10" } }, + "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, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/timers-ext": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", @@ -3690,6 +5151,16 @@ "node": ">=4" } }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -3703,6 +5174,16 @@ "node": ">= 0.6" } }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/uglify-js": { "version": "3.19.3", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", @@ -3761,6 +5242,37 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3835,6 +5347,13 @@ "node": ">= 8" } }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -3909,6 +5428,19 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/backend/package.json b/backend/package.json index a22760f8..bab90f61 100644 --- a/backend/package.json +++ b/backend/package.json @@ -6,7 +6,7 @@ "scripts": { "start": "node index.js", "test": "mocha 'src/test/**/*.test.js' --watch", - "t:coverage": "mocha", + "t:coverage": "nyc mocha 'src/test/**/*.test.js'", "dev": "nodemon index.js", "prod": "NODE_ENV=production node index.js", "build": "echo 'No build script defined'" @@ -33,6 +33,7 @@ "chai": "^5.1.2", "mocha": "^10.8.2", "nodemon": "^3.1.0", + "nyc": "^17.1.0", "sequelize-cli": "^6.6.2", "sinon": "^19.0.2" } From 14df636d29cc4bb66c3376353b36096577ab57c5 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 15 Nov 2024 14:10:50 -0800 Subject: [PATCH 014/178] test: add tests to middlewares in user.controller --- .../src/test/unit/controllers/user.test.js | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/backend/src/test/unit/controllers/user.test.js b/backend/src/test/unit/controllers/user.test.js index b9577b5d..c5c3bde4 100644 --- a/backend/src/test/unit/controllers/user.test.js +++ b/backend/src/test/unit/controllers/user.test.js @@ -5,6 +5,7 @@ const controller = require("../../../controllers/user.controller.js"); const sinon = require("sinon"); const mocks = require("../mocks/user.mock.js"); const settings = require("../../../../config/settings.js"); +const { validationResult } = require("express-validator"); describe("Unit test user controller", () => { const req = {}; @@ -138,4 +139,56 @@ describe("Unit test user controller", () => { message: "Error", }); }); + describe("test the user middlewares", () => { + let next; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("checkAtLeastOneField - should return status 400 if all of 'name', 'surname' and 'picture' are empty", async () => { + next = sinon.stub(); + req.user = mocks.validUser; + req.body = {}; + await controller.checkAtLeastOneField(req, res); + expect(res.status.args[0][0]).to.be.equal(400); + expect(res.json.args[0][0]).to.be.deep.equal({ + updated: false, + error: "Error, no value(s) provided to update", + }); + expect(next.called).to.be.false; + }); + it("checkAtLeastOneField - should move on if one of the fields is provided", async () => { + next = sinon.stub(); + req.user = mocks.validUser; + req.body = { name: "Jane" }; + await controller.checkAtLeastOneField(req, res, next); + expect(res.status.called).to.be.false; + expect(res.json.called).to.be.false; + expect(next.called).to.be.true; + }); + it.skip("handleValidationErrors - should return status 400 if validation fails", async () => { + next = sinon.stub(); + const expValidator = sinon.spy(validationResult) + req.user = mocks.validUser; + req.body = {}; + await controller.handleValidationErrors(req, res, next); + console.log(expValidator(req)) + expect(expValidator.called).to.be.true; + expect(res.status.called).to.be.false; + expect(res.json.called).to.be.false; + expect(next.called).to.be.false; + }); + it.skip("handleValidationErrors - should move on if validator passes", async () => { + next = sinon.stub(); + const expValidator = sinon.spy(validationResult) + req.user = mocks.validUser; + req.body = {}; + await controller.handleValidationErrors(req, res, next); + expect(expValidator.called).to.be.true; + expect(res.status.called).to.be.false; + expect(res.json.called).to.be.false; + expect(next.called).to.be.true; + }); + }); }); From e51095bba7ce3d99568681ae9ba5f641906197f9 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 15 Nov 2024 14:57:06 -0800 Subject: [PATCH 015/178] chore: config environment to e2e tests --- backend/index.js | 2 + backend/package-lock.json | 454 +++++++++++++++++- backend/package.json | 11 +- backend/src/test/e2e/user.test.js | 22 +- .../src/test/{unit => }/mocks/user.mock.js | 0 .../src/test/unit/controllers/user.test.js | 2 +- backend/src/test/unit/services/user.test.js | 2 +- 7 files changed, 485 insertions(+), 8 deletions(-) rename backend/src/test/{unit => }/mocks/user.mock.js (100%) diff --git a/backend/index.js b/backend/index.js index 647f9a6d..f5381428 100644 --- a/backend/index.js +++ b/backend/index.js @@ -65,3 +65,5 @@ const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); }); + +module.exports = app; diff --git a/backend/package-lock.json b/backend/package-lock.json index 9e990fd2..6d52cce0 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -25,11 +25,13 @@ }, "devDependencies": { "chai": "^5.1.2", + "chai-http": "^5.1.1", "mocha": "^10.8.2", "nodemon": "^3.1.0", "nyc": "^17.1.0", "sequelize-cli": "^6.6.2", - "sinon": "^19.0.2" + "sinon": "^19.0.2", + "wait-on": "^8.0.1" } }, "node_modules/@ampproject/remapping": { @@ -370,6 +372,23 @@ "node": ">=6.9.0" } }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -681,6 +700,30 @@ "node": ">=14" } }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", @@ -930,6 +973,13 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "license": "MIT" }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -940,6 +990,13 @@ "node": ">=12" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -950,6 +1007,18 @@ "node": ">= 4.0.0" } }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1184,6 +1253,24 @@ "node": ">=12" } }, + "node_modules/chai-http": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai-http/-/chai-http-5.1.1.tgz", + "integrity": "sha512-h+QZNfYdlcoyIyOb26N71S7700CP4EY+CQ1X15AsX1RD2xMLAWbMniS7yUTOEC6DzC5yydGV37wu81AGNm8esA==", + "dev": true, + "license": "MIT", + "dependencies": { + "charset": "^1.0.1", + "cookiejar": "^2.1.4", + "is-ip": "^5.0.1", + "methods": "^1.1.2", + "qs": "^6.12.1", + "superagent": "^9" + }, + "engines": { + "node": ">=18.20.0" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1224,6 +1311,16 @@ "node": ">=8" } }, + "node_modules/charset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/charset/-/charset-1.0.1.tgz", + "integrity": "sha512-6dVyOOYjpfFcL1Y4qChrAoQLRHvj2ziyhcm0QJlhOcAhykL/k1kTUPbeo+87MNRTRdk2OIIsIXbuF3x2wi5EXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/check-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", @@ -1307,6 +1404,22 @@ "wrap-ansi": "^7.0.0" } }, + "node_modules/clone-regexp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-3.0.0.tgz", + "integrity": "sha512-ujdnoq2Kxb8s3ItNBtnYeXdm07FcU0u8ARAT1lQ2YdMwQC+cdiXX8KoqMVuglztILivceTtp4ivqGSmEmhBUJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-regexp": "^3.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1336,6 +1449,19 @@ "color-support": "bin.js" } }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -1353,6 +1479,16 @@ "dev": true, "license": "MIT" }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1397,6 +1533,19 @@ "node": ">= 0.6" } }, + "node_modules/convert-hrtime": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/convert-hrtime/-/convert-hrtime-5.0.0.tgz", + "integrity": "sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -1419,6 +1568,13 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, "node_modules/cors": { "version": "2.8.5", "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", @@ -1526,6 +1682,16 @@ "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -1560,6 +1726,17 @@ "node": ">=8" } }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/diff": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", @@ -1905,6 +2082,13 @@ "type": "^2.7.2" } }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -1981,6 +2165,27 @@ "flat": "cli.js" } }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", @@ -2011,6 +2216,36 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formidable": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz", + "integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==", + "dev": true, + "license": "MIT", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^2.0.0", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2120,6 +2355,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/function-timeout": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/function-timeout/-/function-timeout-0.1.1.tgz", + "integrity": "sha512-0NVVC0TaP7dSTvn1yMiy6d6Q8gifzbvQafO46RtLG/kHJUBNd+pVRGOBoK44wNBvtSPUJRfdVvkFdD3p0xvyZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -2373,6 +2621,16 @@ "node": ">=16.0.0" } }, + "node_modules/hexoid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz", + "integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -2504,6 +2762,19 @@ "dev": true, "license": "ISC" }, + "node_modules/ip-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-5.0.0.tgz", + "integrity": "sha512-fOCG6lhoKKakwv+C6KdsOnGvgXnmgfmp0myi3bcNwj3qfwPAxRKWEuFhvEFF7ceYIz6+1jRZ+yguLFAmUNPEfw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -2574,6 +2845,23 @@ "node": ">=0.10.0" } }, + "node_modules/is-ip": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-5.0.1.tgz", + "integrity": "sha512-FCsGHdlrOnZQcp0+XT5a+pYowf33itBalCl+7ovNXC/7o5BhIpG14M3OrpPPdBSIQJCm+0M5+9mO7S9VVTTCFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-regex": "^5.0.0", + "super-regex": "^0.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -2601,6 +2889,19 @@ "dev": true, "license": "MIT" }, + "node_modules/is-regexp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-3.1.0.tgz", + "integrity": "sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -2833,6 +3134,20 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, "node_modules/js-beautify": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.15.1.tgz", @@ -4341,6 +4656,13 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -4504,6 +4826,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "license": "Apache-2.0", + "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", @@ -5018,6 +5350,83 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/super-regex": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/super-regex/-/super-regex-0.2.0.tgz", + "integrity": "sha512-WZzIx3rC1CvbMDloLsVw0lkZVKJWbrkJ0k1ghKFmcnPrW1+jWbgTkTEWVtD9lMdmI4jZEz40+naBxl1dCUhXXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-regexp": "^3.0.0", + "function-timeout": "^0.1.0", + "time-span": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superagent": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz", + "integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^3.5.1", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5076,6 +5485,22 @@ "node": ">=8" } }, + "node_modules/time-span": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/time-span/-/time-span-5.1.0.tgz", + "integrity": "sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-hrtime": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/timers-ext": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", @@ -5134,6 +5559,13 @@ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", "license": "MIT" }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/type": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", @@ -5315,6 +5747,26 @@ "node": ">= 0.8" } }, + "node_modules/wait-on": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.1.tgz", + "integrity": "sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^1.7.7", + "joi": "^17.13.3", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.1" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/backend/package.json b/backend/package.json index bab90f61..c60dea85 100644 --- a/backend/package.json +++ b/backend/package.json @@ -5,8 +5,11 @@ "main": "index.js", "scripts": { "start": "node index.js", - "test": "mocha 'src/test/**/*.test.js' --watch", - "t:coverage": "nyc mocha 'src/test/**/*.test.js'", + "pretest": "NODE_ENV=test docker rm -f test-postgres || true && docker run --name test-postgres --env-file .env.test -p 5432:5432 -d postgres && npx wait-on tcp:5432 && npx sequelize-cli db:create --env test || true && npx sequelize-cli db:migrate --env test && npx sequelize-cli db:seed:all --env test", + "posttest": "docker stop test-postgres && docker rm test-postgres", + "test": "NODE_ENV=test mocha 'src/test/**/*.test.js' --watch", + "test:e2e": "NODE_ENV=test mocha 'src/test/e2e/**/*.test.js' --watch", + "test:coverage": "NODE_ENV=test nyc mocha 'src/test/**/*.test.js'", "dev": "nodemon index.js", "prod": "NODE_ENV=production node index.js", "build": "echo 'No build script defined'" @@ -31,10 +34,12 @@ }, "devDependencies": { "chai": "^5.1.2", + "chai-http": "^5.1.1", "mocha": "^10.8.2", "nodemon": "^3.1.0", "nyc": "^17.1.0", "sequelize-cli": "^6.6.2", - "sinon": "^19.0.2" + "sinon": "^19.0.2", + "wait-on": "^8.0.1" } } diff --git a/backend/src/test/e2e/user.test.js b/backend/src/test/e2e/user.test.js index 4d5ab515..f4367504 100644 --- a/backend/src/test/e2e/user.test.js +++ b/backend/src/test/e2e/user.test.js @@ -1,5 +1,23 @@ -const { describe, it } = require("mocha"); +import { use } from "chai"; +import chaiHttp from "chai-http"; +import { beforeEach, describe, it } from "mocha"; +import app from "../../../index.js"; +import mocks from "../mocks/user.mock.js"; + +const chai = use(chaiHttp); describe("E2e tests user", () => { - it.skip("todo tests", () => {}); + const api = chai.request.execute(app); + beforeEach(() => { + api.post("/register").send(mocks.validList[0]); + }); + it("GET /users-list - if everything goes right, should return a list of users with pagination and status code 200", async () => {}); + it.skip("GET /users-list - if something goes wrong, should return status code 500 and the title error code GET_USER_LIST_ERROR", async () => {}); + it.skip("GET /current-user - if everything goes right, should return the user without the password", async () => {}); + it.skip("GET /current-user - if the user is not found, should return status code 400 and the error 'User not found'", async () => {}); + it.skip("GET /current-user - if something goes wrong, should return status code 500 and the title error code GET_USER_ERROR", async () => {}); + it.skip("PUT /update - if everything goes right, should return the updated user without the password", async () => {}); + it.skip("PUT /update - if something goes wrong, should return status code 500 and the title error code UPDATE_USER_ERROR", async () => {}); + it.skip("DELETE /delete - if everything goes right, should return the message 'User deleted successfully'", async () => {}); + it.skip("DELETE /delete - if something goes wrong, should return status code 500 and the title error code DELETE_USER_ERROR", async () => {}); }); diff --git a/backend/src/test/unit/mocks/user.mock.js b/backend/src/test/mocks/user.mock.js similarity index 100% rename from backend/src/test/unit/mocks/user.mock.js rename to backend/src/test/mocks/user.mock.js diff --git a/backend/src/test/unit/controllers/user.test.js b/backend/src/test/unit/controllers/user.test.js index c5c3bde4..8d378121 100644 --- a/backend/src/test/unit/controllers/user.test.js +++ b/backend/src/test/unit/controllers/user.test.js @@ -3,7 +3,7 @@ const { expect } = require("chai"); const { userService } = require("../../../controllers/user.controller.js"); const controller = require("../../../controllers/user.controller.js"); const sinon = require("sinon"); -const mocks = require("../mocks/user.mock.js"); +const mocks = require("../../mocks/user.mock.js"); const settings = require("../../../../config/settings.js"); const { validationResult } = require("express-validator"); diff --git a/backend/src/test/unit/services/user.test.js b/backend/src/test/unit/services/user.test.js index cfcfe529..5a52eb51 100644 --- a/backend/src/test/unit/services/user.test.js +++ b/backend/src/test/unit/services/user.test.js @@ -3,7 +3,7 @@ const { expect } = require("chai"); const sinon = require("sinon"); const db = require("../../../models/index.js"); const UserService = require("../../../service/user.service.js"); -const mocks = require("../mocks/user.mock.js"); +const mocks = require("../../mocks/user.mock.js"); const service = new UserService(); From 221d7b87758fce50c0c33a3bad312a11f4e6e107 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 15 Nov 2024 16:25:27 -0800 Subject: [PATCH 016/178] test: start adding e2e tests for user routes --- backend/.env.test | 10 +- backend/package.json | 6 +- backend/src/test/e2e/user.test.js | 115 +++++++++++++++--- .../src/test/unit/controllers/user.test.js | 1 - backend/src/test/unit/services/user.test.js | 1 - 5 files changed, 111 insertions(+), 22 deletions(-) diff --git a/backend/.env.test b/backend/.env.test index 1939b4f4..eff65d0c 100644 --- a/backend/.env.test +++ b/backend/.env.test @@ -1,11 +1,15 @@ # Test Environment Configuration # Database Configuration -TEST_DB_USERNAME=test_user -TEST_DB_PASSWORD=test_password -TEST_DB_NAME=test_db +TEST_DB_USERNAME=user123 +TEST_DB_PASSWORD=password123 +TEST_DB_NAME=onboarding_db TEST_DB_HOST=localhost TEST_DB_PORT=5432 +POSTGRES_USER=user123 +POSTGRES_PASSWORD=password123 +POSTGRES_DB=onboarding_db + # JWT Secret Key JWT_SECRET=your_test_jwt_secret_key_here diff --git a/backend/package.json b/backend/package.json index c60dea85..813bc8e2 100644 --- a/backend/package.json +++ b/backend/package.json @@ -5,11 +5,11 @@ "main": "index.js", "scripts": { "start": "node index.js", - "pretest": "NODE_ENV=test docker rm -f test-postgres || true && docker run --name test-postgres --env-file .env.test -p 5432:5432 -d postgres && npx wait-on tcp:5432 && npx sequelize-cli db:create --env test || true && npx sequelize-cli db:migrate --env test && npx sequelize-cli db:seed:all --env test", + "pretest": "NODE_ENV=test docker rm -f test-postgres || true && docker run --name test-postgres --env-file .env.test -p 5432:5432 -d postgres && npx wait-on tcp:5432 && npx sequelize-cli db:create --env test || true && npx sequelize-cli db:migrate --env test", "posttest": "docker stop test-postgres && docker rm test-postgres", "test": "NODE_ENV=test mocha 'src/test/**/*.test.js' --watch", - "test:e2e": "NODE_ENV=test mocha 'src/test/e2e/**/*.test.js' --watch", - "test:coverage": "NODE_ENV=test nyc mocha 'src/test/**/*.test.js'", + "test:e2e": "npm run pretest && NODE_ENV=test mocha 'src/test/e2e/**/*.test.js'", + "test:coverage": "npm run pretest && NODE_ENV=test nyc mocha 'src/test/**/*.test.js'", "dev": "nodemon index.js", "prod": "NODE_ENV=production node index.js", "build": "echo 'No build script defined'" diff --git a/backend/src/test/e2e/user.test.js b/backend/src/test/e2e/user.test.js index f4367504..a9290844 100644 --- a/backend/src/test/e2e/user.test.js +++ b/backend/src/test/e2e/user.test.js @@ -1,23 +1,110 @@ -import { use } from "chai"; +import { expect, use } from "chai"; import chaiHttp from "chai-http"; -import { beforeEach, describe, it } from "mocha"; +import { before, describe, it } from "mocha"; import app from "../../../index.js"; import mocks from "../mocks/user.mock.js"; const chai = use(chaiHttp); describe("E2e tests user", () => { - const api = chai.request.execute(app); - beforeEach(() => { - api.post("/register").send(mocks.validList[0]); + let token; + before(async () => { + const login = await chai.request + .execute(app) + .post("/api/auth/register") + .send(mocks.validUser); + token = login.body.token; + }); + describe("GET /api/users/users-list", () => { + it("should return a list of users with pagination and status code 200 if everything goes right", async () => { + const result = await chai.request + .execute(app) + .get("/api/users/users-list "); + expect(result.status).to.be.equal(200); + expect(result.body).to.be.deep.equal({ + currentPage: 1, + totalPages: 1, + totalUsers: 1, + users: [ + { + email: "jane.doe@email.com", + name: "Jane", + role: "admin", + surname: "Doe", + }, + ], + }); + }); + }); + describe("GET /api/users/current-user", () => { + it("should fail if the user is not logged", async () => { + const result = await chai.request + .execute(app) + .get("/api/users/current-user"); + expect(result.status).to.be.equal(401); + expect(result.body).to.be.deep.equal({ + error: "No token provided", + }); + }); + it("should return the user without the password if everything goes right", async () => { + const { + password, + picture: p, + createdAt: c, + ...expected + } = mocks.validUser; + const result = await chai.request + .execute(app) + .get("/api/users/current-user") + .set("Authorization", `Bearer ${token}`); + expect(result.status).to.be.equal(200); + const { picture, createdAt, ...body } = result.body.user; + expect(body).to.be.deep.equal({ ...expected, role: "admin" }); + }); + }); + describe("PUT /api/users/update", () => { + it("should fail if the user is not logged", async () => { + const result = await chai.request.execute(app).put("/api/users/update"); + expect(result.status).to.be.equal(401); + expect(result.body).to.deep.equal({ error: "No token provided" }); + }); + it("should fail if the request body is empty", async () => { + const result = await chai.request + .execute(app) + .put("/api/users/update") + .set("Authorization", `Bearer ${token}`); + + expect(result.status).to.be.equal(500); + expect(result.body).to.deep.equal({ error: "Internal Server Error" }); + }); + it("should fail if fails the validations", async () => { + const result = await chai.request + .execute(app) + .put("/api/users/update") + .set("Authorization", `Bearer ${token}`) + .send({ picture: "string" }); + + expect(result.status).to.be.equal(500); + expect(result.body).to.be.deep.equal({ error: "Internal Server Error" }); + }); + it("if everything goes right, should return the updated user without the password", async () => { + const { password, createdAt: c, ...expected } = mocks.validUser; + const result = await chai.request + .execute(app) + .put("/api/users/update") + .set("Authorization", `Bearer ${token}`) + .send({ photo: "https://picsum.photos/200/300" }); + expect(result.status).to.be.equal(200); + const { createdAt, ...body } = result.body.user; + expect(body).to.be.deep.equal({ + ...expected, + role: "admin", + picture: "https://picsum.photos/200/300", + }); + }); + }); + describe("DELETE /api/users/delete", () => { + it.skip("should return the message 'User deleted successfully' if everything goes right", async () => {}); + it.skip("should return status code 500 and the title error code DELETE_USER_ERROR if something goes wrong", async () => {}); }); - it("GET /users-list - if everything goes right, should return a list of users with pagination and status code 200", async () => {}); - it.skip("GET /users-list - if something goes wrong, should return status code 500 and the title error code GET_USER_LIST_ERROR", async () => {}); - it.skip("GET /current-user - if everything goes right, should return the user without the password", async () => {}); - it.skip("GET /current-user - if the user is not found, should return status code 400 and the error 'User not found'", async () => {}); - it.skip("GET /current-user - if something goes wrong, should return status code 500 and the title error code GET_USER_ERROR", async () => {}); - it.skip("PUT /update - if everything goes right, should return the updated user without the password", async () => {}); - it.skip("PUT /update - if something goes wrong, should return status code 500 and the title error code UPDATE_USER_ERROR", async () => {}); - it.skip("DELETE /delete - if everything goes right, should return the message 'User deleted successfully'", async () => {}); - it.skip("DELETE /delete - if something goes wrong, should return status code 500 and the title error code DELETE_USER_ERROR", async () => {}); }); diff --git a/backend/src/test/unit/controllers/user.test.js b/backend/src/test/unit/controllers/user.test.js index 8d378121..36663da4 100644 --- a/backend/src/test/unit/controllers/user.test.js +++ b/backend/src/test/unit/controllers/user.test.js @@ -173,7 +173,6 @@ describe("Unit test user controller", () => { req.user = mocks.validUser; req.body = {}; await controller.handleValidationErrors(req, res, next); - console.log(expValidator(req)) expect(expValidator.called).to.be.true; expect(res.status.called).to.be.false; expect(res.json.called).to.be.false; diff --git a/backend/src/test/unit/services/user.test.js b/backend/src/test/unit/services/user.test.js index 5a52eb51..25aa82d4 100644 --- a/backend/src/test/unit/services/user.test.js +++ b/backend/src/test/unit/services/user.test.js @@ -238,7 +238,6 @@ describe("Unit test user service", () => { Invite = sinon.stub(db.Invite, "destroy"); const result = await service.deleteUser(1); - console.log(result); expect(User.called).to.be.true; expect(Invite.called).to.be.true; expect(Token.called).to.be.true; From 1bf67a72e5b095f3469ce1f1e3f50987018ce3bd Mon Sep 17 00:00:00 2001 From: thomastepi Date: Sat, 16 Nov 2024 01:29:12 -0500 Subject: [PATCH 017/178] fix editor content initialization --- frontend/package-lock.json | 1093 ++++++++++++++++- frontend/package.json | 2 + .../ColorTextField/ColorTextField.module.scss | 3 + .../HintLeftAppearance/HintLeftAppearance.css | 3 + .../HintLeftContent/HintLeftContent.jsx | 6 +- .../RichTextEditor/RichTextEditor.css | 4 +- .../RichTextEditor/RichTextEditor.jsx | 25 +- .../RichTextEditor/Toolbar/EditorToolbar.css | 8 +- .../CustomTextField/CustomTextFieldStyles.css | 5 +- frontend/src/products/Hint/HintComponent.jsx | 34 +- frontend/src/products/Hint/hintComponent.css | 13 +- .../src/products/Popup/PopupComponent.jsx | 14 +- .../products/Popup/PopupComponent.module.css | 3 + frontend/src/scenes/hints/CreateHintPage.jsx | 62 +- frontend/src/scenes/hints/HintDefaultPage.jsx | 48 +- frontend/src/scenes/popup/CreatePopupPage.jsx | 29 +- .../src/scenes/popup/PopupDefaultPage.jsx | 47 +- .../PopupAppearance.module.scss | 4 + .../DefaultPageTemplate.jsx | 6 +- 19 files changed, 1292 insertions(+), 117 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a7df719f..2cfe8b02 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -33,10 +33,12 @@ "react-dom": "^18.2.0", "react-dropzone": "^14.2.9", "react-icons": "^5.3.0", + "react-markdown": "^9.0.1", "react-redux": "^9.1.2", "react-router": "^6.27.0", "react-router-dom": "^6.27.0", "redux": "^5.0.1", + "turndown": "^7.2.0", "vite-plugin-svgr": "^4.2.0", "web-vitals": "^2.1.4", "yup": "^1.4.0" @@ -1114,6 +1116,11 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mixmark-io/domino": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@mixmark-io/domino/-/domino-2.2.0.tgz", + "integrity": "sha512-Y28PR25bHXUg88kCV7nivXrP2Nj2RueZ3/l/jdx6J9f8J4nsEGcgX0Qe6lt7Pa+J79+kPiJU3LguR6O/6zrLOw==" + }, "node_modules/@mui/base": { "version": "5.0.0-beta.60", "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.60.tgz", @@ -3020,6 +3027,14 @@ "@types/node": "*" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/doctrine": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", @@ -3037,6 +3052,14 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/@types/express": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", @@ -3079,6 +3102,14 @@ "@types/node": "*" } }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/http-errors": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", @@ -3106,6 +3137,14 @@ "@types/mdurl": "^2" } }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", @@ -3124,6 +3163,11 @@ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, "node_modules/@types/node": { "version": "22.8.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.8.1.tgz", @@ -3218,6 +3262,11 @@ "@types/send": "*" } }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" + }, "node_modules/@types/use-sync-external-store": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", @@ -3348,8 +3397,7 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@vitejs/plugin-react-swc": { "version": "3.7.1", @@ -4014,6 +4062,15 @@ "npm": ">=6" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4218,6 +4275,15 @@ } ] }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chai": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", @@ -4252,6 +4318,42 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", @@ -4321,6 +4423,15 @@ "node": ">= 0.8" } }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -4532,6 +4643,18 @@ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-eql": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", @@ -4615,7 +4738,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, "engines": { "node": ">=6" } @@ -4630,6 +4752,18 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -5303,6 +5437,15 @@ "node": ">=4.0" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -5415,6 +5558,11 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5993,6 +6141,44 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz", + "integrity": "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -6030,6 +6216,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -6149,6 +6344,11 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/inline-style-parser": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -6172,6 +6372,28 @@ "node": ">= 0.10" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -6309,6 +6531,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -6373,6 +6604,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -6430,6 +6670,17 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -6893,6 +7144,15 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -6987,6 +7247,151 @@ "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", + "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", @@ -7034,6 +7439,427 @@ "node": ">= 0.6" } }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -7490,6 +8316,30 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -7787,6 +8637,15 @@ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/prosemirror-changeset": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz", @@ -8182,6 +9041,31 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, + "node_modules/react-markdown": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz", + "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==", + "dependencies": { + "@types/hast": "^3.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } + }, "node_modules/react-redux": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", @@ -8330,6 +9214,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", + "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/requireindex": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", @@ -9161,6 +10076,15 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -9286,6 +10210,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -9364,6 +10301,14 @@ "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", "dev": true }, + "node_modules/style-to-object": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", + "dependencies": { + "inline-style-parser": "0.2.4" + } + }, "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", @@ -9588,6 +10533,24 @@ "node": ">=18" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", @@ -9637,6 +10600,14 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/turndown": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.2.0.tgz", + "integrity": "sha512-eCZGBN4nNNqM9Owkv9HAtWRYfLA4h909E/WGAWWBpmB275ehNhZyk87/Tpvjbp0jjNl9XwCsbe6bm6CqFsgD+A==", + "dependencies": { + "@mixmark-io/domino": "^2.2.0" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9801,6 +10772,87 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "devOptional": true }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -9952,6 +11004,32 @@ "node": ">= 0.8" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vite": { "version": "5.4.10", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.10.tgz", @@ -10906,6 +11984,15 @@ "toposort": "^2.0.2", "type-fest": "^2.19.0" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/frontend/package.json b/frontend/package.json index 61b6976f..ac8ffbfc 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -29,10 +29,12 @@ "react-dom": "^18.2.0", "react-dropzone": "^14.2.9", "react-icons": "^5.3.0", + "react-markdown": "^9.0.1", "react-redux": "^9.1.2", "react-router": "^6.27.0", "react-router-dom": "^6.27.0", "redux": "^5.0.1", + "turndown": "^7.2.0", "vite-plugin-svgr": "^4.2.0", "web-vitals": "^2.1.4", "yup": "^1.4.0" diff --git a/frontend/src/components/ColorTextField/ColorTextField.module.scss b/frontend/src/components/ColorTextField/ColorTextField.module.scss index 525676c5..05932322 100644 --- a/frontend/src/components/ColorTextField/ColorTextField.module.scss +++ b/frontend/src/components/ColorTextField/ColorTextField.module.scss @@ -13,6 +13,9 @@ } } + .MuiOutlinedInput-root { + border-radius: 8px; + } } input { diff --git a/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css b/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css index 37d3a6f9..bd113af6 100644 --- a/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css +++ b/frontend/src/components/HintPageComponents/HintLeftAppearance/HintLeftAppearance.css @@ -17,4 +17,7 @@ display: flex; align-items: center; width: 241px; + > div { + width: 100%; + } } diff --git a/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.jsx b/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.jsx index b3e7115c..ab0eb0db 100644 --- a/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.jsx +++ b/frontend/src/components/HintPageComponents/HintLeftContent/HintLeftContent.jsx @@ -58,7 +58,11 @@ const HintLeftContent = ({ actionButtonText, setActionButtonText, actionButtonUr helperText="Page element to attach tooltip to" />

Tooltip Placement

- +
); }; diff --git a/frontend/src/components/RichTextEditor/RichTextEditor.css b/frontend/src/components/RichTextEditor/RichTextEditor.css index 723272b7..f2aa6ab4 100644 --- a/frontend/src/components/RichTextEditor/RichTextEditor.css +++ b/frontend/src/components/RichTextEditor/RichTextEditor.css @@ -5,12 +5,12 @@ border-radius: 8px; padding-top: 1rem; margin-top: 1rem; - width: 466px; + width: 400px; } .ProseMirror { height: 7.5rem; - padding: 0 25px; + padding: 0 14px; overflow-y: auto; } diff --git a/frontend/src/components/RichTextEditor/RichTextEditor.jsx b/frontend/src/components/RichTextEditor/RichTextEditor.jsx index 51cf8cd0..041410f3 100644 --- a/frontend/src/components/RichTextEditor/RichTextEditor.jsx +++ b/frontend/src/components/RichTextEditor/RichTextEditor.jsx @@ -1,4 +1,4 @@ -import React, { useState } from "react"; +import React, { useState, useEffect } from "react"; import PropTypes from "prop-types"; import "./RichTextEditor.css"; import { useEditor, EditorContent } from "@tiptap/react"; @@ -17,6 +17,7 @@ const RichTextEditor = ({ header, setHeader, setContent, + content, }) => { const [mode, setMode] = useState("editor"); @@ -38,13 +39,25 @@ const RichTextEditor = ({ BulletList, OrderedList, ], + content, onUpdate: ({ editor }) => { setContent(editor.getHTML()); }, + onDestroy: () => { + setContent(""); + setHeader(""); + }, }); - + + // Set initial content of the editor to the content prop during editing + useEffect(() => { + if (editor?.isEmpty && content !== "

") { + editor.commands.setContent(content); + } + }, [content]); + return ( -
+
{mode === "editor" ? ( <> Content
- +
) : ( @@ -81,6 +94,10 @@ const RichTextEditor = ({ RichTextEditor.propTypes = { sx: PropTypes.object, previewComponent: PropTypes.elementType.isRequired, + header: PropTypes.string, + setHeader: PropTypes.func, + setContent: PropTypes.func, + content: PropTypes.string, }; export default RichTextEditor; diff --git a/frontend/src/components/RichTextEditor/Toolbar/EditorToolbar.css b/frontend/src/components/RichTextEditor/Toolbar/EditorToolbar.css index 10dddd63..5a527f59 100644 --- a/frontend/src/components/RichTextEditor/Toolbar/EditorToolbar.css +++ b/frontend/src/components/RichTextEditor/Toolbar/EditorToolbar.css @@ -1,8 +1,10 @@ .toolbar-container { display: flex; - gap: 16px; + gap: 1px; align-items: center; width: 70%; + flex-wrap: wrap; + justify-content: space-between; } .toolbar-container button { @@ -12,3 +14,7 @@ .toolbar-container button[disabled] { color: var(--light-border-color); } + +.toolbar-container .MuiButtonBase-root { + min-width: 0!important; +} diff --git a/frontend/src/components/TextFieldComponents/CustomTextField/CustomTextFieldStyles.css b/frontend/src/components/TextFieldComponents/CustomTextField/CustomTextFieldStyles.css index ebaf1d9b..f1458a3c 100644 --- a/frontend/src/components/TextFieldComponents/CustomTextField/CustomTextFieldStyles.css +++ b/frontend/src/components/TextFieldComponents/CustomTextField/CustomTextFieldStyles.css @@ -22,6 +22,7 @@ &.Mui-focused fieldset { border-color: var(--main-purple); } + border-radius: 8px !important; } @@ -34,7 +35,3 @@ font-size: var(--font-regular); color: var(--second-text-color); } - -.css-1d3z3hw-MuiOutlinedInput-notchedOutline { - border-radius: 8px !important; -} diff --git a/frontend/src/products/Hint/HintComponent.jsx b/frontend/src/products/Hint/HintComponent.jsx index c08c0cb4..1738a262 100644 --- a/frontend/src/products/Hint/HintComponent.jsx +++ b/frontend/src/products/Hint/HintComponent.jsx @@ -1,5 +1,5 @@ import React from "react"; -import DOMPurify from "dompurify"; +import ReactMarkdown from "react-markdown"; import "./hintComponent.css"; import Button from "../../components/Button/Button"; @@ -27,22 +27,22 @@ const HintComponent = ({

{header}

)} -
-
- {previewBtnText && ( - - )} +
+
+ {content} +
+
+ {previewBtnText && ( + + )} +
diff --git a/frontend/src/products/Hint/hintComponent.css b/frontend/src/products/Hint/hintComponent.css index 5d710d1a..d67353be 100644 --- a/frontend/src/products/Hint/hintComponent.css +++ b/frontend/src/products/Hint/hintComponent.css @@ -1,7 +1,6 @@ .preview-container { width: 100%; - max-width: 400px; - max-height: 250px; + height: 250px; border: 1px solid var(--light-border-color); margin-top: 1rem; overflow: auto; @@ -20,10 +19,15 @@ padding: 0 2rem; } -.preview-content { +.preview-content-container { color: var(--second-text-color); - font-size: 13px; + justify-content: space-between; + display: flex; + flex-direction: column; + box-sizing: border-box; + height: calc(100% - 20px); padding: 0 2rem; + font-size: 13px; } .preview-content p { @@ -33,7 +37,6 @@ .preview-button-container { margin-top: 0.5rem; - padding: 0 2rem; display: flex; justify-content: flex-end; } diff --git a/frontend/src/products/Popup/PopupComponent.jsx b/frontend/src/products/Popup/PopupComponent.jsx index dcb85bd6..4cbb4e84 100644 --- a/frontend/src/products/Popup/PopupComponent.jsx +++ b/frontend/src/products/Popup/PopupComponent.jsx @@ -1,7 +1,7 @@ import React, { useState } from "react"; -import DOMPurify from "dompurify"; +import ReactMarkdown from "react-markdown"; import styles from "./PopupComponent.module.css"; // Use your module CSS file -import CloseOutlinedIcon from '@mui/icons-material/CloseOutlined'; +import CloseOutlinedIcon from "@mui/icons-material/CloseOutlined"; import Button from "@components/Button/Button"; const PopupComponent = ({ @@ -63,12 +63,10 @@ const PopupComponent = ({ />
)} -
-
+
+
+ {content} +
{previewBtnText && (
From 911b7be27a30b339179d8cc09464748839578efd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A9bora=20Rodrigues=20Serra?= <94383038+DeboraSerra@users.noreply.github.com> Date: Thu, 5 Dec 2024 10:23:08 -0800 Subject: [PATCH 092/178] Update node.js.yml Change test to only unit tests --- .github/workflows/node.js.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 55b18c03..5202156a 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -89,11 +89,11 @@ jobs: - name: Run tests for backend working-directory: ./backend - run: npm test + run: npm run test:unit - name: Run tests for frontend working-directory: ./frontend run: npm test - name: Run Docker container - run: docker compose up --build -d \ No newline at end of file + run: docker compose up --build -d From fa70b3f5c99bb579baeeae9094cb8e0013e49000 Mon Sep 17 00:00:00 2001 From: tunckiral Date: Thu, 5 Dec 2024 22:08:57 -0500 Subject: [PATCH 093/178] changing and refactor codes --- jsAgent/banner.js | 1 + jsAgent/links.js | 1 + jsAgent/main.js | 154 +++++++++++++++++++++++++++++++++++++++++ jsAgent/popup.js | 88 +++++++++++++++++++++++ jsAgent/popupRender.js | 52 ++++++++++++++ jsAgent/tour.js | 1 + 6 files changed, 297 insertions(+) create mode 100644 jsAgent/banner.js create mode 100644 jsAgent/links.js create mode 100644 jsAgent/main.js create mode 100644 jsAgent/popup.js create mode 100644 jsAgent/popupRender.js create mode 100644 jsAgent/tour.js diff --git a/jsAgent/banner.js b/jsAgent/banner.js new file mode 100644 index 00000000..80ce9d76 --- /dev/null +++ b/jsAgent/banner.js @@ -0,0 +1 @@ +console.log('banner.js is here!'); \ No newline at end of file diff --git a/jsAgent/links.js b/jsAgent/links.js new file mode 100644 index 00000000..bd636406 --- /dev/null +++ b/jsAgent/links.js @@ -0,0 +1 @@ +console.log('link.js is here!'); \ No newline at end of file diff --git a/jsAgent/main.js b/jsAgent/main.js new file mode 100644 index 00000000..86d64c08 --- /dev/null +++ b/jsAgent/main.js @@ -0,0 +1,154 @@ +//CONSTANTS + +const BW_SERVER_ENDPOINT_BASE = 'localhost:3000/api/'; +const BW_POPUP_JS_URL ='popup/get_popup/1'; +const BW_BANNER_JS_URL =''; +const BW_TOUR_JS_URL =''; +const BW_LINKS_JS_URL =''; +const BW_USER_KEY = 'BW_USER_KEY'; + +//GLOBALS +window.BW_USER = ''; + +if (window.bw === undefined) { window.bw = {} } +if (bw.util === undefined) { bw.util = {} } + + + +bw.util = { + isScriptLoaded : function (src) { + var scripts = document.getElementsByTagName("script"); + for (var i = 0; i < scripts.length; i++) + if (scripts[i].getAttribute('src') == src) return true; + return false; + }, + loadScriptAsync : function (url, cb, errcb) { + try { + if (bw.util.isScriptLoaded(url)) { + cb && cb(); + } else { + var script = document.createElement("script"); + script.type = "text/javascript"; + script.async = false; + if (script.readyState) { + script.onreadystatechange = function () { + if (script.readyState == "loaded" || script.readyState == "complete") { + script.onreadystatechange = null; + cb && cb(); + } + }; + } else { + script.onload = function () { + cb && cb(); + }; + } + script.onerror = function () { + errcb && errcb(); + }; + script.src = url; + (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(script); + } + } catch (e) { + console.log(e); + } + }, + bindLive: function (selector, event, cb, cnx) { + bw.util.addEvent(cnx || document, event, function (e) { + var qs = (cnx || document).querySelectorAll(selector); + if (qs) { + var el = e.target || e.srcElement, index = -1; + while (el && ((index = Array.prototype.indexOf.call(qs, el)) === -1)) el = el.parentElement; + if (index > -1) cb.call(el, e); + } + }); + }, + addEvent: function (el, type, fn) { + if (el.attachEvent) el.attachEvent('on' + type, fn); else el.addEventListener(type, fn); + }, + generateGUID :function () { + var guid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (o) { + var n = Math.random() * 16 | 0, + g = o == "x" ? n : (n & 3 | 8); + return g.toString(16) + }); + return guid; + } +} + +bw.data={ + getData: async function (userId) { + const myHeaders = new Headers(); + myHeaders.append("Content-Type", "application/json"); + + const requestOptions = { + method: "POST", + headers: myHeaders, + body: JSON.stringify({ userId }), + redirect: "follow" + }; + + const response = await fetch(`${BW_SERVER_ENDPOINT_BASE}/mock/onboard`, requestOptions); + const data = await response.json(); + return data; + } +} + +bw.store = { + insert: function (key, value) { + localStorage.setItem(key, value); + }, + remove: function (key) { + localStorage.removeItem(key); + }, + get: function (key) { + return localStorage.getItem(key); + } +} + +bw.user = { + createUser: function () { + const generated_userId = bw.util.generateGUID(); + bw.store.insert(BW_USER_KEY, generated_userId); + window.BW_USER = generated_userId; + }, + checkIfBwUserCreated: function () { + let result = false; + let userID = bw.store.get(BW_USER_KEY); + if (userID != null) { + result = true; + } + return result; + }, + getUserID : function(){ + return bw.store.get(BW_USER_KEY); + }, + removeUser: function(){ + bw.store.remove(BW_USER_KEY); + } +} +bw.init = (cb) => { + if(!bw.user.checkIfBwUserCreated()){ + bw.user.createUser(); + } + window.BW_USER = bw.user.getUserID(); + cb && cb(); +}; + +( + function () { + + bw.init(async function (){ + const onBoardConfig = await bw.data.getData(window.BW_USER); + debugger; + if (onBoardConfig.popupData) { + bw.util.loadScriptAsync(BW_POPUP_JS_URL); + } else if (onBoardConfig.tourData) { + bw.util.loadScriptAsync(BW_TOUR_JS_URL); + } else if(onBoardConfig.bannerData){ + bw.util.loadScriptAsync(BW_BANNER_JS_URL); + } else if(onBoardConfig.linkData){ + bw.util.loadScriptAsync(BW_LINKS_JS_URL); + } + }); + } +)(); \ No newline at end of file diff --git a/jsAgent/popup.js b/jsAgent/popup.js new file mode 100644 index 00000000..82ac7f39 --- /dev/null +++ b/jsAgent/popup.js @@ -0,0 +1,88 @@ +const defaultOptions = { + padding: 16, + hasFooter: true, + + + closeButtonAction: "no action", + popupSize: "small", + url: "https://", + actionButtonText: "Take me to subscription page", + headerBackgroundColor: "#F8F9F8", + headerColor: "#101828", + textColor: "#344054", + buttonBackgroundColor: "#7F56D9", + buttonTextColor: "#FFFFFF", + header: "default", + content: "", +} + +bw.popup = { + + init: function () { + bw.popup.addOverlay(); + bw.popup.addModal(()=>{ + bw.popup.bindEvents(); + }); + }, + + addOverlay: function () { + document.body.insertAdjacentHTML('afterbegin', `
`); + }, + addModal: function (cb) { + const options = window + let overlay = document.getElementById('bw-overlay'); + for (let i = 0; i < options.length; i++) { + let option = { + ...defaultOptions, + ...options[i] + }; + let temp_html = ` +
+ +
` + overlay.insertAdjacentHTML('afterbegin', temp_html); + } + cb && cb(); + }, + addHeader: function(headerTitle, bgColor, textColor, padding){ + let headerHtml = ``; + return headerHtml; + }, + addButton: function(footerHtml_, color, padding, btnId, btnEvent){ + let footerHtml = ``; + + if(btnEvent == 'close'){ + bw.util.bindLive(`#${btnId}`, 'click', function(){ + bw.popup.hideModal(); + }); + } + return footerHtml; + }, + bindEvents: function(){ + bw.util.bindLive(`#bw-modal-close`, 'click', function(){ + bw.popup.hideModal(); + }); + }, + showModal: function () { + document.getElementById('bw-overlay').style.display = 'block'; + }, + hideModal: function(){ + document.getElementById('bw-overlay').style.display = 'none'; + } +}; + + +(async function () { + bw.popup.init(); +})(); \ No newline at end of file diff --git a/jsAgent/popupRender.js b/jsAgent/popupRender.js new file mode 100644 index 00000000..6c8cb366 --- /dev/null +++ b/jsAgent/popupRender.js @@ -0,0 +1,52 @@ +const showPopup = (popupData) => { + if (!popupData || popupData.length === 0) { + console.warn('No popup data available'); + return; + } + + popupData.forEach(popup => { + // Create popup container + const popupContainer = document.createElement('div'); + Object.assign(popupContainer.style, { + position: 'fixed', + bottom: '20px', + right: '20px', + backgroundColor: popup.headerBg || '#FFFFFF', + padding: '20px', + border: '1px solid #000', + zIndex: 1000, + }); + + // Create header + const header = document.createElement('h2'); + header.textContent = popup.headerText; + header.style.color = popup.headerTextColor || '#000'; + popupContainer.appendChild(header); + + // Create content + const content = document.createElement('div'); + content.innerHTML = popup.contentHtml; + Object.assign(content.style, { + color: popup.fontColor || '#000', + fontSize: popup.font || '14px', + }); + popupContainer.appendChild(content); + + // Create action button + const actionButton = document.createElement('button'); + actionButton.textContent = popup.actionButtonText || 'Close'; + Object.assign(actionButton.style, { + backgroundColor: popup.actionButtonColor || '#CCC', + }); + actionButton.addEventListener('click', () => { + document.body.removeChild(popupContainer); // Remove popup when button is clicked + }); + popupContainer.appendChild(actionButton); + + // Append the popup to the document body + document.body.appendChild(popupContainer); + }); + }; + + export default showPopup; + \ No newline at end of file diff --git a/jsAgent/tour.js b/jsAgent/tour.js new file mode 100644 index 00000000..3e96f605 --- /dev/null +++ b/jsAgent/tour.js @@ -0,0 +1 @@ +console.log('tour.js is here'); \ No newline at end of file From 454b3acf5b0c6ee3e98fdc5bd2a745af0813aedd Mon Sep 17 00:00:00 2001 From: tunckiral Date: Thu, 5 Dec 2024 22:44:47 -0500 Subject: [PATCH 094/178] line changed for building frontend Dockerfile --- frontend/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 3e0d24fc..68f72bcc 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -4,7 +4,7 @@ WORKDIR /app COPY package*.json ./ -RUN npm install +RUN npm install --platform=linux --arch=x64 --include=optional COPY . . From a53a6714b50a6575886cf6a5d41e91b5c33adf23 Mon Sep 17 00:00:00 2001 From: tunckiral Date: Thu, 5 Dec 2024 22:48:19 -0500 Subject: [PATCH 095/178] changing node version --- frontend/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 68f72bcc..bee24f9d 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22 +FROM node:20 WORKDIR /app From 793ea9c02c594428bd62e03741674f483fcf1ff9 Mon Sep 17 00:00:00 2001 From: tunckiral Date: Fri, 6 Dec 2024 00:24:04 -0500 Subject: [PATCH 096/178] fix for LuTriangleAlert --- backend/.env | 2 +- frontend/src/scenes/settings/PasswordTab/PasswordTab.jsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/.env b/backend/.env index ee68d278..20aa10b7 100644 --- a/backend/.env +++ b/backend/.env @@ -5,7 +5,7 @@ NODE_ENV=development DEV_DB_USERNAME=user123 DEV_DB_PASSWORD=password123 DEV_DB_NAME=onboarding_db -DEV_DB_HOST=db +DEV_DB_HOST=localhost DEV_DB_PORT=5432 EMAIL_ENABLE=false diff --git a/frontend/src/scenes/settings/PasswordTab/PasswordTab.jsx b/frontend/src/scenes/settings/PasswordTab/PasswordTab.jsx index 6fa3c6b1..194b043f 100644 --- a/frontend/src/scenes/settings/PasswordTab/PasswordTab.jsx +++ b/frontend/src/scenes/settings/PasswordTab/PasswordTab.jsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { LuAlertTriangle } from "react-icons/lu"; +import { LuTriangleAlert } from "react-icons/lu"; import styles from "./PasswordTab.module.css"; import CustomTextField from "@components/TextFieldComponents/CustomTextField/CustomTextField"; import Button from "@components/Button/Button"; @@ -70,7 +70,7 @@ const PasswordTab = () => {

- + New password must contain at least 8 characters and must have at least one uppercase letter, one number, and one symbol.

From 55e4e7626a42f047370229988c163910b29e08a1 Mon Sep 17 00:00:00 2001 From: tunckiral Date: Fri, 6 Dec 2024 13:11:44 -0500 Subject: [PATCH 097/178] check for popup frontend component --- backend/index.js | 2 +- backend/package-lock.json | 251 +- frontend/Dockerfile | 2 +- frontend/package-lock.json | 5962 +++++++++++------ .../RichTextEditor/RichTextEditor.jsx | 21 +- 5 files changed, 4026 insertions(+), 2212 deletions(-) diff --git a/backend/index.js b/backend/index.js index 4a7ac522..7fe4c16d 100644 --- a/backend/index.js +++ b/backend/index.js @@ -39,7 +39,7 @@ sequelize .catch((err) => console.log('Error: ' + err)); sequelize - .sync({ force: true }) + .sync({ force: false }) .then(() => console.log("Models synced with the database...")) .catch((err) => console.log("Error syncing models: " + err)); diff --git a/backend/package-lock.json b/backend/package-lock.json index 178862c7..da4ae7f2 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -47,9 +47,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "dev": true, "license": "MIT", "engines": { @@ -185,18 +185,18 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", - "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", + "version": "22.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", + "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", "license": "MIT", "dependencies": { - "undici-types": "~6.13.0" + "undici-types": "~6.20.0" } }, "node_modules/@types/validator": { - "version": "13.12.0", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", - "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==", + "version": "13.12.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", + "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==", "license": "MIT" }, "node_modules/abbrev": { @@ -231,12 +231,12 @@ } }, "node_modules/agent-base/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -248,9 +248,9 @@ } }, "node_modules/agent-base/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/ansi-regex": { @@ -437,16 +437,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -455,6 +454,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.0.tgz", + "integrity": "sha512-CCKAP2tkPau7D3GE8+V8R6sQubA9R5foIzGp+85EXCVSCivuxBNAWqcpn72PKYiIcqoViv/kcUDpaEIMBVi1lQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -630,9 +642,9 @@ } }, "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==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -719,9 +731,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -896,9 +908,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { @@ -948,9 +960,9 @@ } }, "node_modules/express": { - "version": "4.21.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", - "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -972,7 +984,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -987,12 +999,16 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express-validator": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.1.0.tgz", - "integrity": "sha512-ePn6NXjHRZiZkwTiU1Rl2hy6aUqmi6Cb4/s8sfUsKH7j2yYl9azSpl8xEHcOj1grzzQ+UBEoLWtE1s6FDxW++g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.2.0.tgz", + "integrity": "sha512-I2ByKD8panjtr8Y05l21Wph9xk7kk64UMyvJCl/fFM/3CTJq8isXYPLeKW/aZBCdb/LYNv63PwhY8khw8VWocA==", "license": "MIT", "dependencies": { "lodash": "^4.17.21", @@ -1246,12 +1262,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1308,10 +1324,13 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", + "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, "engines": { "node": ">= 0.4" }, @@ -1320,9 +1339,9 @@ } }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -1359,9 +1378,9 @@ } }, "node_modules/helmet": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", - "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.2.0.tgz", + "integrity": "sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw==", "license": "MIT", "engines": { "node": ">=16.0.0" @@ -1397,12 +1416,12 @@ } }, "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -1414,9 +1433,9 @@ } }, "node_modules/https-proxy-agent/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/iconv-lite": { @@ -1494,9 +1513,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2004,9 +2023,9 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.45", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", - "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", + "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", "license": "MIT", "dependencies": { "moment": "^2.29.4" @@ -2070,18 +2089,18 @@ } }, "node_modules/nodemailer": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.15.tgz", - "integrity": "sha512-AHf04ySLC6CIfuRtRiEYtGEXgRfa6INgWGluDhnxTZhHSKvrBu7lc1VVchQ0d8nPc4cFaZoPq8vkyNoZr0TpGQ==", + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", + "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", "license": "MIT-0", "engines": { "node": ">=6.0.0" } }, "node_modules/nodemon": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", - "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", + "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2108,13 +2127,13 @@ } }, "node_modules/nodemon/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2126,9 +2145,9 @@ } }, "node_modules/nodemon/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, @@ -2180,9 +2199,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2213,9 +2232,9 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, "license": "BlueOak-1.0.0" }, @@ -2272,20 +2291,20 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "license": "MIT" }, "node_modules/pg": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", - "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", + "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.6.4", - "pg-pool": "^3.6.2", - "pg-protocol": "^1.6.1", + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.0", + "pg-protocol": "^1.7.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -2312,9 +2331,9 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", - "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", "license": "MIT" }, "node_modules/pg-int8": { @@ -2327,18 +2346,18 @@ } }, "node_modules/pg-pool": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", - "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", + "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", - "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==", "license": "MIT" }, "node_modules/pg-types": { @@ -2639,9 +2658,9 @@ "license": "MIT" }, "node_modules/sequelize": { - "version": "6.37.3", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.3.tgz", - "integrity": "sha512-V2FTqYpdZjPy3VQrZvjTPnOoLm0KudCRXfGWp48QwhyPPp2yW8z0p0sCYZd/em847Tl2dVxJJ1DR+hF+O77T7A==", + "version": "6.37.5", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.5.tgz", + "integrity": "sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==", "funding": [ { "type": "opencollective", @@ -2733,12 +2752,12 @@ } }, "node_modules/sequelize/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -2750,9 +2769,9 @@ } }, "node_modules/sequelize/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==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/serve-static": { @@ -3106,9 +3125,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", - "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "license": "MIT" }, "node_modules/universalify": { diff --git a/frontend/Dockerfile b/frontend/Dockerfile index bee24f9d..68f72bcc 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20 +FROM node:22 WORKDIR /app diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 0fd965d3..b2e86769 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -60,6 +60,8 @@ }, "node_modules/@ampproject/remapping": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -70,10 +72,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.7", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "license": "MIT", "dependencies": { - "@babel/highlight": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -81,26 +86,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.8", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.8", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.8", - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.8", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -117,20 +126,18 @@ }, "node_modules/@babel/core/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==", "license": "MIT" }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.25.7", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.7", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -140,11 +147,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -153,32 +162,28 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.7", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -187,67 +192,53 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.7", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.7", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.8", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.25.8" + "@babel/types": "^7.26.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -257,7 +248,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.25.7", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -267,26 +260,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.7", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.7", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -295,43 +292,45 @@ } }, "node_modules/@babel/types": { - "version": "7.25.8", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@base2/pretty-print-object": { - "version": "1.0.1", - "dev": true, - "license": "BSD-2-Clause" - }, "node_modules/@bufbuild/protobuf": { - "version": "2.2.0", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.2.tgz", + "integrity": "sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A==", "devOptional": true, "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@ctrl/tinycolor": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.1.0.tgz", + "integrity": "sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==", "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/@emotion/babel-plugin": { - "version": "11.12.0", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.2.0", + "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -341,22 +340,28 @@ } }, "node_modules/@emotion/cache": { - "version": "11.13.1", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.5.tgz", + "integrity": "sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g==", "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.0", + "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "node_modules/@emotion/hash": { "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0" @@ -364,18 +369,22 @@ }, "node_modules/@emotion/memoize": { "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.13.3", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", + "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", - "@emotion/cache": "^11.13.0", - "@emotion/serialize": "^1.3.1", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0", + "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, @@ -389,30 +398,36 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.3.2", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.1", + "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", "license": "MIT" }, "node_modules/@emotion/styled": { - "version": "11.13.0", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", + "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", + "@emotion/babel-plugin": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.0", + "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0" + "@emotion/utils": "^1.4.2" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -426,423 +441,748 @@ }, "node_modules/@emotion/unitless": { "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.4.1", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", "license": "MIT" }, "node_modules/@emotion/weak-memoize": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", "license": "MIT" }, - "node_modules/@esbuild/win32-x64": { - "version": "0.23.1", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", + "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "win32" + "aix" ], "peer": true, "engines": { "node": ">=18" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "node_modules/@esbuild/android-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", + "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=18" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", + "node_modules/@esbuild/android-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", + "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", + "node_modules/@esbuild/android-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", + "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "android" + ], + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", + "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", + "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/@eslint/js": { - "version": "8.57.1", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", + "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@floating-ui/core": { - "version": "1.6.8", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", + "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.8" + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@floating-ui/dom": { - "version": "1.6.11", + "node_modules/@esbuild/linux-arm": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", + "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.8" + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", + "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@floating-ui/utils": { - "version": "0.2.8", - "license": "MIT" + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", + "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", + "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "cpu": [ + "loong64" + ], "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=10.10.0" + "node": ">=18" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", + "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", + "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "BSD-3-Clause" + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" + } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", + "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=18" } }, - "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { - "version": "0.3.0", + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", + "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "glob": "^7.2.0", - "glob-promise": "^4.2.0", - "magic-string": "^0.27.0", - "react-docgen-typescript": "^2.2.2" - }, - "peerDependencies": { - "typescript": ">= 4.3.x", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": { - "version": "0.27.0", + "node_modules/@esbuild/linux-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", + "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, + "optional": true, + "os": [ + "linux" + ], + "peer": true, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", + "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, + "optional": true, + "os": [ + "netbsd" + ], + "peer": true, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", + "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", + "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "peer": true, "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "devOptional": true, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", + "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "optional": true, + "os": [ + "sunos" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "license": "MIT" + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", + "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", + "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "cpu": [ + "ia32" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" } }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.59", + "node_modules/@esbuild/win32-x64": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", + "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "@floating-ui/react-dom": "^2.1.1", - "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.4", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.1", - "prop-types": "^15.8.1" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "url": "https://opencollective.com/eslint" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@mui/core-downloads-tracker": { - "version": "6.1.5", + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@mui/icons-material": { - "version": "6.1.5", + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=14.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@mui/material": "^6.1.5", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "url": "https://opencollective.com/eslint" } }, - "node_modules/@mui/lab": { - "version": "6.0.0-beta.12", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/base": "5.0.0-beta.59", - "@mui/system": "^6.1.4", - "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.4", - "clsx": "^2.1.1", - "prop-types": "^15.8.1" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material": "^6.1.4", - "@mui/material-pigment-css": "^6.1.4", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@mui/material-pigment-css": { - "optional": true - }, - "@types/react": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@mui/material": { - "version": "6.1.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/core-downloads-tracker": "^6.1.5", - "@mui/system": "^6.1.5", - "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.5", - "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.11", - "clsx": "^2.1.1", - "csstype": "^3.1.3", - "prop-types": "^15.8.1", - "react-is": "^18.3.1", - "react-transition-group": "^4.4.5" - }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=14.0.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.1.5", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@mui/material-pigment-css": { - "optional": true - }, - "@types/react": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", + "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.12", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", + "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", + "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", + "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.4.2.tgz", + "integrity": "sha512-feQ+ntr+8hbVudnsTUapiMN9q8T90XA1d5jn9QzY09sNoj4iD9wi0PY1vsBFTda4ZjEaxRK9S81oarR2nj7TFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.27.0", + "react-docgen-typescript": "^2.2.2" + }, + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "typescript": { "optional": true } } }, - "node_modules/@mui/private-theming": { - "version": "6.1.5", + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/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, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^6.1.5", + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.64", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.64.tgz", + "integrity": "sha512-nu663PoZs/Pee0fkPYkjUADfT+AAi2QWvvHghDhLeSx8sa3i+GGaOoUsFmB4CPlyYqWfq9hRGA7H1T3d6VrGgw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@floating-ui/react-dom": "^2.1.1", + "@mui/types": "^7.2.19", + "@mui/utils": "^6.1.10", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.1", "prop-types": "^15.8.1" }, "engines": { @@ -853,8 +1193,9 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -862,16 +1203,23 @@ } } }, - "node_modules/@mui/styled-engine": { - "version": "6.1.5", + "node_modules/@mui/core-downloads-tracker": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.10.tgz", + "integrity": "sha512-LY5wdiLCBDY7u+Od8UmFINZFGN/5ZU90fhAslf/ZtfP+5RhuY45f679pqYIxe0y54l6Gkv9PFOc8Cs10LDTBYg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.10.tgz", + "integrity": "sha512-G6P1BCSt6EQDcKca47KwvKjlqgOXFbp2I3oWiOlFgKYTANBH89yk7ttMQ5ysqNxSYAB+4TdM37MlPYp4+FkVrQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "@emotion/cache": "^11.13.1", - "@emotion/serialize": "^1.3.2", - "@emotion/sheet": "^1.4.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" + "@babel/runtime": "^7.26.0" }, "engines": { "node": ">=14.0.0" @@ -881,30 +1229,28 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", + "@mui/material": "^6.1.10", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { + "@types/react": { "optional": true } } }, - "node_modules/@mui/system": { - "version": "6.1.5", + "node_modules/@mui/lab": { + "version": "6.0.0-beta.18", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-6.0.0-beta.18.tgz", + "integrity": "sha512-O7jNn36Jb0530NOZeFLj33RGB57x3kfyiYOaj5sL/j/Pmq9T0tonKMkoW/AUCucmBa7RuEzEYMyqBpfqminebA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/private-theming": "^6.1.5", - "@mui/styled-engine": "^6.1.5", - "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.5", + "@babel/runtime": "^7.26.0", + "@mui/base": "5.0.0-beta.64", + "@mui/system": "^6.1.10", + "@mui/types": "^7.2.19", + "@mui/utils": "^6.1.10", "clsx": "^2.1.1", - "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -917,8 +1263,11 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", + "@mui/material": "^6.1.10", + "@mui/material-pigment-css": "^6.1.10", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -927,33 +1276,72 @@ "@emotion/styled": { "optional": true }, + "@mui/material-pigment-css": { + "optional": true + }, "@types/react": { "optional": true } } }, - "node_modules/@mui/types": { - "version": "7.2.18", + "node_modules/@mui/material": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.10.tgz", + "integrity": "sha512-txnwYObY4N9ugv5T2n5h1KcbISegZ6l65w1/7tpSU5OB6MQCU94YkP8n/3slDw2KcEfRk4+4D8EUGfhSPMODEQ==", "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/core-downloads-tracker": "^6.1.10", + "@mui/system": "^6.1.10", + "@mui/types": "^7.2.19", + "@mui/utils": "^6.1.10", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^6.1.10", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, "@types/react": { "optional": true } } }, - "node_modules/@mui/utils": { - "version": "6.1.5", + "node_modules/@mui/private-theming": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.10.tgz", + "integrity": "sha512-DqgsH0XFEweeG3rQfVkqTkeXcj/E76PGYWag8flbPdV8IYdMo+DfVdFlZK8JEjsaIVD2Eu1kJg972XnH5pfnBQ==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/types": "^7.2.18", - "@types/prop-types": "^15.7.13", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" + "@babel/runtime": "^7.26.0", + "@mui/utils": "^6.1.10", + "prop-types": "^15.8.1" }, "engines": { "node": ">=14.0.0" @@ -972,17 +1360,18 @@ } } }, - "node_modules/@mui/x-date-pickers": { - "version": "7.21.0", + "node_modules/@mui/styled-engine": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.10.tgz", + "integrity": "sha512-+NV9adKZYhslJ270iPjf2yzdVJwav7CIaXcMlPSi1Xy1S/zRe5xFgZ6BEoMdmGRpr34lIahE8H1acXP2myrvRw==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0", - "@mui/x-internals": "7.21.0", - "@types/react-transition-group": "^4.4.11", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" + "@babel/runtime": "^7.26.0", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" }, "engines": { "node": ">=14.0.0" @@ -992,19 +1381,138 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14 || ^6.0.0", - "@mui/system": "^5.15.14 || ^6.0.0", - "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.10.tgz", + "integrity": "sha512-5YNIqxETR23SIkyP7MY2fFnXmplX/M4wNi2R+10AVRd3Ub+NLctWY/Vs5vq1oAMF0eSDLhRTGUjaUe+IGSfWqg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/private-theming": "^6.1.10", + "@mui/styled-engine": "^6.1.10", + "@mui/types": "^7.2.19", + "@mui/utils": "^6.1.10", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.19", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.19.tgz", + "integrity": "sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.10.tgz", + "integrity": "sha512-1ETuwswGjUiAf2dP9TkBy8p49qrw2wXa+RuAjNTRE5+91vtXJ1HKrs7H9s8CZd1zDlQVzUcUAPm9lpQwF5ogTw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/types": "^7.2.19", + "@types/prop-types": "^15.7.13", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers": { + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.23.1.tgz", + "integrity": "sha512-Jr4beZ7r2lvWBaFnkIAg9BgiNFcfeJy4AUe3MbG10BBSZyB++odGqhOUAIGqkP7MpUzEGlTv4NUaaD7gYTAQPg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0", + "@mui/x-internals": "7.23.0", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.15.14 || ^6.0.0", + "@mui/system": "^5.15.14 || ^6.0.0", + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", "dayjs": "^1.10.7", "luxon": "^3.0.2", "moment": "^2.29.4", - "moment-hijri": "^2.1.2", + "moment-hijri": "^2.1.2 || ^3.0.0", "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1037,14 +1545,16 @@ } }, "node_modules/@mui/x-date-pickers-pro": { - "version": "7.21.0", + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers-pro/-/x-date-pickers-pro-7.23.1.tgz", + "integrity": "sha512-3+8pgxJ3NwGBRIZoG+tcXO76p/NrQTJrb490dacPztdNShRhV/h8Xgo4PLdLKJ8lsVcfUiUD7OlK09sgpWXcgw==", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "^7.25.7", "@mui/utils": "^5.16.6 || ^6.0.0", - "@mui/x-date-pickers": "7.21.0", - "@mui/x-internals": "7.21.0", - "@mui/x-license": "7.21.0", + "@mui/x-date-pickers": "7.23.1", + "@mui/x-internals": "7.23.0", + "@mui/x-license": "7.23.0", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" @@ -1062,10 +1572,10 @@ "dayjs": "^1.10.7", "luxon": "^3.0.2", "moment": "^2.29.4", - "moment-hijri": "^2.1.2", + "moment-hijri": "^2.1.2 || ^3.0.0", "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1098,7 +1608,9 @@ } }, "node_modules/@mui/x-internals": { - "version": "7.21.0", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.23.0.tgz", + "integrity": "sha512-bPclKpqUiJYIHqmTxSzMVZi6MH51cQsn5U+8jskaTlo3J4QiMeCYJn/gn7YbeR9GOZFp8hetyHjoQoVHKRXCig==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", @@ -1112,11 +1624,13 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@mui/x-license": { - "version": "7.21.0", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@mui/x-license/-/x-license-7.23.0.tgz", + "integrity": "sha512-fIWODBg7qZDKD9R/gmZNywa7O4amyt4fczeLul9G37ahj3zOvdJ6B/RPaMlv9ZzFsuxKYRKMbhkz1+9Gks56QQ==", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "^7.25.7", @@ -1126,11 +1640,13 @@ "node": ">=14.0.0" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -1143,6 +1659,8 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -1151,6 +1669,8 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -1163,6 +1683,8 @@ }, "node_modules/@popperjs/core": { "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", "funding": { "type": "opencollective", @@ -1171,22 +1693,28 @@ }, "node_modules/@remirror/core-constants": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", + "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", "license": "MIT" }, "node_modules/@remix-run/router": { - "version": "1.20.0", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz", + "integrity": "sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.2", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", + "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" @@ -1200,8 +1728,244 @@ } } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", + "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", + "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", + "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", + "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", + "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", + "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", + "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", + "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", + "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", + "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", + "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", + "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", + "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", + "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", + "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", + "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", + "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", + "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", + "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", "cpu": [ "x64" ], @@ -1213,22 +1977,20 @@ }, "node_modules/@sinclair/typebox": { "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true, "license": "MIT" }, "node_modules/@storybook/builder-vite": { - "version": "8.3.6", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.4.7.tgz", + "integrity": "sha512-LovyXG5VM0w7CovI/k56ZZyWCveQFVDl0m7WwetpmMh2mmFJ+uPQ35BBsgTvTfc8RHi+9Q3F58qP1MQSByXi9g==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "8.3.6", - "@types/find-cache-dir": "^3.2.1", + "@storybook/csf-plugin": "8.4.7", "browser-assert": "^1.2.1", - "es-module-lexer": "^1.5.0", - "express": "^4.19.2", - "find-cache-dir": "^3.0.0", - "fs-extra": "^11.1.0", - "magic-string": "^0.30.0", "ts-dedent": "^2.0.0" }, "funding": { @@ -1236,26 +1998,14 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@preact/preset-vite": "*", - "storybook": "^8.3.6", - "typescript": ">= 4.3.x", - "vite": "^4.0.0 || ^5.0.0", - "vite-plugin-glimmerx": "*" - }, - "peerDependenciesMeta": { - "@preact/preset-vite": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vite-plugin-glimmerx": { - "optional": true - } + "storybook": "^8.4.7", + "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/@storybook/components": { - "version": "8.3.6", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.4.7.tgz", + "integrity": "sha512-uyJIcoyeMWKAvjrG9tJBUCKxr2WZk+PomgrgrUwejkIfXMO76i6jw9BwLa0NZjYdlthDv30r9FfbYZyeNPmF0g==", "dev": true, "license": "MIT", "funding": { @@ -1263,22 +2013,22 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.3.6" + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "node_modules/@storybook/core": { - "version": "8.3.6", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.4.7.tgz", + "integrity": "sha512-7Z8Z0A+1YnhrrSXoKKwFFI4gnsLbWzr8fnDCU6+6HlDukFYh8GHRcZ9zKfqmy6U3hw2h8H5DrHsxWfyaYUUOoA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@storybook/csf": "^0.1.11", - "@types/express": "^4.17.21", "better-opn": "^3.0.2", "browser-assert": "^1.2.1", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0", "esbuild-register": "^3.5.0", - "express": "^4.19.2", "jsdoc-type-pratt-parser": "^4.0.0", "process": "^0.11.10", "recast": "^0.23.5", @@ -1289,10 +2039,20 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } } }, "node_modules/@storybook/core/node_modules/@storybook/csf": { - "version": "0.1.11", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.12.tgz", + "integrity": "sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==", "dev": true, "license": "MIT", "peer": true, @@ -1300,8 +2060,24 @@ "type-fest": "^2.19.0" } }, + "node_modules/@storybook/core/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@storybook/csf": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", + "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", "dev": true, "license": "MIT", "dependencies": { @@ -1309,7 +2085,9 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "8.3.6", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.4.7.tgz", + "integrity": "sha512-Fgogplu4HImgC+AYDcdGm1rmL6OR1rVdNX1Be9C/NEXwOCpbbBwi0BxTf/2ZxHRk9fCeaPEcOdP5S8QHfltc1g==", "dev": true, "license": "MIT", "dependencies": { @@ -1320,16 +2098,20 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.3.6" + "storybook": "^8.4.7" } }, "node_modules/@storybook/global": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", + "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", "dev": true, "license": "MIT" }, "node_modules/@storybook/manager-api": { - "version": "8.3.6", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.4.7.tgz", + "integrity": "sha512-ELqemTviCxAsZ5tqUz39sDmQkvhVAvAgiplYy9Uf15kO0SP2+HKsCMzlrm2ue2FfkUNyqbDayCPPCB0Cdn/mpQ==", "dev": true, "license": "MIT", "funding": { @@ -1337,11 +2119,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.3.6" + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "node_modules/@storybook/preview-api": { - "version": "8.3.6", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.4.7.tgz", + "integrity": "sha512-0QVQwHw+OyZGHAJEXo6Knx+6/4er7n2rTDE5RYJ9F2E2Lg42E19pfdLlq2Jhoods2Xrclo3wj6GWR//Ahi39Eg==", "dev": true, "license": "MIT", "funding": { @@ -1349,34 +2133,22 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.3.6" + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "node_modules/@storybook/react": { - "version": "8.3.6", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.4.7.tgz", + "integrity": "sha512-nQ0/7i2DkaCb7dy0NaT95llRVNYWQiPIVuhNfjr1mVhEP7XD090p0g7eqUmsx8vfdHh2BzWEo6CoBFRd3+EXxw==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/components": "^8.3.6", + "@storybook/components": "8.4.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "^8.3.6", - "@storybook/preview-api": "^8.3.6", - "@storybook/react-dom-shim": "8.3.6", - "@storybook/theming": "^8.3.6", - "@types/escodegen": "^0.0.6", - "@types/estree": "^0.0.51", - "@types/node": "^22.0.0", - "acorn": "^7.4.1", - "acorn-jsx": "^5.3.1", - "acorn-walk": "^7.2.0", - "escodegen": "^2.1.0", - "html-tags": "^3.1.0", - "prop-types": "^15.7.2", - "react-element-to-jsx-string": "^15.0.0", - "semver": "^7.3.7", - "ts-dedent": "^2.0.0", - "type-fest": "~2.19", - "util-deprecate": "^1.0.2" + "@storybook/manager-api": "8.4.7", + "@storybook/preview-api": "8.4.7", + "@storybook/react-dom-shim": "8.4.7", + "@storybook/theming": "8.4.7" }, "engines": { "node": ">=18.0.0" @@ -1386,10 +2158,10 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/test": "8.3.6", + "@storybook/test": "8.4.7", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.3.6", + "storybook": "^8.4.7", "typescript": ">= 4.2.x" }, "peerDependenciesMeta": { @@ -1402,7 +2174,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "8.3.6", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.4.7.tgz", + "integrity": "sha512-6bkG2jvKTmWrmVzCgwpTxwIugd7Lu+2btsLAqhQSzDyIj2/uhMNp8xIMr/NBDtLgq3nomt9gefNa9xxLwk/OMg==", "dev": true, "license": "MIT", "funding": { @@ -1412,18 +2186,20 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.3.6" + "storybook": "^8.4.7" } }, "node_modules/@storybook/react-vite": { - "version": "8.3.6", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.4.7.tgz", + "integrity": "sha512-iiY9iLdMXhDnilCEVxU6vQsN72pW3miaf0WSenOZRyZv3HdbpgOxI0qapOS0KCyRUnX9vTlmrSPTMchY4cAeOg==", "dev": true, "license": "MIT", "dependencies": { - "@joshwooding/vite-plugin-react-docgen-typescript": "0.3.0", + "@joshwooding/vite-plugin-react-docgen-typescript": "0.4.2", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "8.3.6", - "@storybook/react": "8.3.6", + "@storybook/builder-vite": "8.4.7", + "@storybook/react": "8.4.7", "find-up": "^5.0.0", "magic-string": "^0.30.0", "react-docgen": "^7.0.0", @@ -1440,17 +2216,14 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.3.6", - "vite": "^4.0.0 || ^5.0.0" + "storybook": "^8.4.7", + "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" } }, - "node_modules/@storybook/react/node_modules/@types/estree": { - "version": "0.0.51", - "dev": true, - "license": "MIT" - }, "node_modules/@storybook/theming": { - "version": "8.3.6", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.4.7.tgz", + "integrity": "sha512-99rgLEjf7iwfSEmdqlHkSG3AyLcK0sfExcr0jnc6rLiAkBhzuIsvcHjjUwkR210SOCgXqBPW0ZA6uhnuyppHLw==", "dev": true, "license": "MIT", "funding": { @@ -1458,11 +2231,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.3.6" + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "license": "MIT", "engines": { "node": ">=14" @@ -1477,6 +2252,8 @@ }, "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", "license": "MIT", "engines": { "node": ">=14" @@ -1491,6 +2268,8 @@ }, "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "license": "MIT", "engines": { "node": ">=14" @@ -1505,6 +2284,8 @@ }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "license": "MIT", "engines": { "node": ">=14" @@ -1519,6 +2300,8 @@ }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "license": "MIT", "engines": { "node": ">=14" @@ -1533,6 +2316,8 @@ }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "license": "MIT", "engines": { "node": ">=14" @@ -1547,6 +2332,8 @@ }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "license": "MIT", "engines": { "node": ">=14" @@ -1561,6 +2348,8 @@ }, "node_modules/@svgr/babel-plugin-transform-svg-component": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "license": "MIT", "engines": { "node": ">=12" @@ -1575,6 +2364,8 @@ }, "node_modules/@svgr/babel-preset": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "license": "MIT", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", @@ -1599,6 +2390,8 @@ }, "node_modules/@svgr/core": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", @@ -1617,6 +2410,8 @@ }, "node_modules/@svgr/core/node_modules/cosmiconfig": { "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", @@ -1641,6 +2436,8 @@ }, "node_modules/@svgr/hast-util-to-babel-ast": { "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "license": "MIT", "dependencies": { "@babel/types": "^7.21.3", @@ -1656,6 +2453,8 @@ }, "node_modules/@svgr/plugin-jsx": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", @@ -1675,12 +2474,14 @@ } }, "node_modules/@swc/core": { - "version": "1.7.36", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.0.tgz", + "integrity": "sha512-+CuuTCmQFfzaNGg1JmcZvdUVITQXJk9sMnl1C2TiDLzOSVOJRwVD4dNo5dljX/qxpMAN+2BIYlwjlSkoGi6grg==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.13" + "@swc/types": "^0.1.17" }, "engines": { "node": ">=10" @@ -1690,16 +2491,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.36", - "@swc/core-darwin-x64": "1.7.36", - "@swc/core-linux-arm-gnueabihf": "1.7.36", - "@swc/core-linux-arm64-gnu": "1.7.36", - "@swc/core-linux-arm64-musl": "1.7.36", - "@swc/core-linux-x64-gnu": "1.7.36", - "@swc/core-linux-x64-musl": "1.7.36", - "@swc/core-win32-arm64-msvc": "1.7.36", - "@swc/core-win32-ia32-msvc": "1.7.36", - "@swc/core-win32-x64-msvc": "1.7.36" + "@swc/core-darwin-arm64": "1.10.0", + "@swc/core-darwin-x64": "1.10.0", + "@swc/core-linux-arm-gnueabihf": "1.10.0", + "@swc/core-linux-arm64-gnu": "1.10.0", + "@swc/core-linux-arm64-musl": "1.10.0", + "@swc/core-linux-x64-gnu": "1.10.0", + "@swc/core-linux-x64-musl": "1.10.0", + "@swc/core-win32-arm64-msvc": "1.10.0", + "@swc/core-win32-ia32-msvc": "1.10.0", + "@swc/core-win32-x64-msvc": "1.10.0" }, "peerDependencies": { "@swc/helpers": "*" @@ -1710,8 +2511,154 @@ } } }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.0.tgz", + "integrity": "sha512-wCeUpanqZyzvgqWRtXIyhcFK3CqukAlYyP+fJpY2gWc/+ekdrenNIfZMwY7tyTFDkXDYEKzvn3BN/zDYNJFowQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.0.tgz", + "integrity": "sha512-0CZPzqTynUBO+SHEl/qKsFSahp2Jv/P2ZRjFG0gwZY5qIcr1+B/v+o74/GyNMBGz9rft+F2WpU31gz2sJwyF4A==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.0.tgz", + "integrity": "sha512-oq+DdMu5uJOFPtRkeiITc4kxmd+QSmK+v+OBzlhdGkSgoH3yRWZP+H2ao0cBXo93ZgCr2LfjiER0CqSKhjGuNA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.0.tgz", + "integrity": "sha512-Y6+PC8knchEViRxiCUj3j8wsGXaIhuvU+WqrFqV834eiItEMEI9+Vh3FovqJMBE3L7d4E4ZQtgImHCXjrHfxbw==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.0.tgz", + "integrity": "sha512-EbrX9A5U4cECCQQfky7945AW9GYnTXtCUXElWTkTYmmyQK87yCyFfY8hmZ9qMFIwxPOH6I3I2JwMhzdi8Qoz7g==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.0.tgz", + "integrity": "sha512-TaxpO6snTjjfLXFYh5EjZ78se69j2gDcqEM8yB9gguPYwkCHi2Ylfmh7iVaNADnDJFtjoAQp0L41bTV/Pfq9Cg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.0.tgz", + "integrity": "sha512-IEGvDd6aEEKEyZFZ8oCKuik05G5BS7qwG5hO5PEMzdGeh8JyFZXxsfFXbfeAqjue4UaUUrhnoX+Ze3M2jBVMHw==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.0.tgz", + "integrity": "sha512-UkQ952GSpY+Z6XONj9GSW8xGSkF53jrCsuLj0nrcuw7Dvr1a816U/9WYZmmcYS8tnG2vHylhpm6csQkyS8lpCw==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.0.tgz", + "integrity": "sha512-a2QpIZmTiT885u/mUInpeN2W9ClCnqrV2LnMqJR1/Fgx1Afw/hAtiDZPtQ0SqS8yDJ2VR5gfNZo3gpxWMrqdVA==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.36", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.0.tgz", + "integrity": "sha512-tZcCmMwf483nwsEBfUk5w9e046kMa1iSik4bP9Kwi2FGtOfHuDfIcwW4jek3hdcgF5SaBW1ktnK/lgQLDi5AtA==", "cpu": [ "x64" ], @@ -1726,10 +2673,14 @@ }, "node_modules/@swc/counter": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", "license": "Apache-2.0" }, "node_modules/@swc/types": { - "version": "0.1.13", + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz", + "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==", "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3" @@ -1737,6 +2688,8 @@ }, "node_modules/@testing-library/dom": { "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1753,72 +2706,10 @@ "node": ">=18" } }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/dom/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@testing-library/react": { "version": "15.0.7", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.7.tgz", + "integrity": "sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -1855,7 +2746,9 @@ } }, "node_modules/@tiptap/core": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.10.3.tgz", + "integrity": "sha512-wAG/0/UsLeZLmshWb6rtWNXKJftcmnned91/HLccHVQAuQZ1UWH+wXeQKu/mtodxEO7JcU2mVPR9mLGQkK0McQ==", "license": "MIT", "funding": { "type": "github", @@ -1866,7 +2759,9 @@ } }, "node_modules/@tiptap/extension-blockquote": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.10.3.tgz", + "integrity": "sha512-u9Mq4r8KzoeGVT8ms6FQDIMN95dTh3TYcT7fZpwcVM96mIl2Oyt+Bk66mL8z4zuFptfRI57Cu9QdnHEeILd//w==", "license": "MIT", "funding": { "type": "github", @@ -1877,7 +2772,9 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.10.3.tgz", + "integrity": "sha512-xnF1tS2BsORenr11qyybW120gHaeHKiKq+ZOP14cGA0MsriKvWDnaCSocXP/xMEYHy7+2uUhJ0MsKkHVj4bPzQ==", "license": "MIT", "funding": { "type": "github", @@ -1888,7 +2785,9 @@ } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.10.3.tgz", + "integrity": "sha512-e9a4yMjQezuKy0rtyyzxbV2IAE1bm1PY3yoZEFrcaY0o47g1CMUn2Hwe+9As2HdntEjQpWR7NO1mZeKxHlBPYA==", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -1903,20 +2802,22 @@ } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.10.3.tgz", + "integrity": "sha512-PTkwJOVlHi4RR4Wrs044tKMceweXwNmWA6EoQ93hPUVtQcwQL990Es5Izp+i88twTPLuGD9dH+o9QDyH9SkWdA==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/extension-list-item": "^2.7.0", - "@tiptap/extension-text-style": "^2.7.0" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-code": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.10.3.tgz", + "integrity": "sha512-JyLbfyY3cPctq9sVdpcRWTcoUOoq3/MnGE1eP6eBNyMTHyBPcM9TPhOkgj+xkD1zW/884jfelB+wa70RT/AMxQ==", "license": "MIT", "funding": { "type": "github", @@ -1927,7 +2828,9 @@ } }, "node_modules/@tiptap/extension-code-block": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.10.3.tgz", + "integrity": "sha512-yiDVNg22fYkzsFk5kBlDSHcjwVJgajvO/M5fDXA+Hfxwo2oNcG6aJyyHXFe+UaXTVjdkPej0J6kcMKrTMCiFug==", "license": "MIT", "funding": { "type": "github", @@ -1939,7 +2842,9 @@ } }, "node_modules/@tiptap/extension-document": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.10.3.tgz", + "integrity": "sha512-6i8+xbS2zB6t8iFzli1O/QB01MmwyI5Hqiiv4m5lOxqavmJwLss2sRhoMC2hB3CyFg5UmeODy/f/RnI6q5Vixg==", "license": "MIT", "funding": { "type": "github", @@ -1950,7 +2855,9 @@ } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.10.3.tgz", + "integrity": "sha512-wzWf82ixWzZQr0hxcf/A0ul8NNxgy1N63O+c56st6OomoLuKUJWOXF+cs9O7V+/5rZKWdbdYYoRB5QLvnDBAlQ==", "license": "MIT", "funding": { "type": "github", @@ -1962,7 +2869,9 @@ } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.10.3.tgz", + "integrity": "sha512-Prg8rYLxeyzHxfzVu1mDkkUWMnD9ZN3y370O/1qy55e+XKVw9jFkTSuz0y0+OhMJG6bulYpDUMtb+N3+2xOWlQ==", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -1977,7 +2886,9 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.10.3.tgz", + "integrity": "sha512-FskZi2DqDSTH1WkgLF2OLy0xU7qj3AgHsKhVsryeAtld4jAK5EsonneWgaipbz0e/MxuIvc1oyacfZKABpLaNg==", "license": "MIT", "funding": { "type": "github", @@ -1989,7 +2900,9 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.10.3.tgz", + "integrity": "sha512-2rFlimUKAgKDwT6nqAMtPBjkrknQY8S7oBNyIcDOUGyFkvbDUl3Jd0PiC929S5F3XStJRppnMqhpNDAlWmvBLA==", "license": "MIT", "funding": { "type": "github", @@ -2000,7 +2913,9 @@ } }, "node_modules/@tiptap/extension-heading": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.10.3.tgz", + "integrity": "sha512-AlxXXPCWIvw8hQUDFRskasj32iMNB8Sb19VgyFWqwvntGs2/UffNu8VdsVqxD2HpZ0g5rLYCYtSW4wigs9R3og==", "license": "MIT", "funding": { "type": "github", @@ -2011,7 +2926,9 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.10.3.tgz", + "integrity": "sha512-HaSiMdx9Im9Pb9qGlVud7W8bweRDRMez33Uzs5a2x0n1RWkelfH7TwYs41Y3wus8Ujs7kw6qh7jyhvPpQBKaSA==", "license": "MIT", "funding": { "type": "github", @@ -2023,7 +2940,9 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.10.3.tgz", + "integrity": "sha512-1a2IWhD00tgUNg/91RLnBvfENL7DLCui5L245+smcaLu+OXOOEpoBHawx59/M4hEpsjqvRRM79TzO9YXfopsPw==", "license": "MIT", "funding": { "type": "github", @@ -2035,7 +2954,9 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.10.3.tgz", + "integrity": "sha512-wAiO6ZxoHx2H90phnKttLWGPjPZXrfKxhOCsqYrK8BpRByhr48godOFRuGwYnKaiwoVjpxc63t+kDJDWvqmgMw==", "license": "MIT", "funding": { "type": "github", @@ -2046,7 +2967,9 @@ } }, "node_modules/@tiptap/extension-link": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.10.3.tgz", + "integrity": "sha512-8esKlkZBzEiNcpt7I8Cd6l1mWmCc/66pPbUq9LfnIniDXE3U+ahBf4m3TJltYFBGbiiTR/xqMtJyVHOpuLDtAw==", "license": "MIT", "dependencies": { "linkifyjs": "^4.1.0" @@ -2061,7 +2984,9 @@ } }, "node_modules/@tiptap/extension-list-item": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.10.3.tgz", + "integrity": "sha512-9sok81gvZfSta2K1Dwrq5/HSz1jk4zHBpFqCx0oydzodGslx6X1bNxdca+eXJpXZmQIWALK7zEr4X8kg3WZsgw==", "license": "MIT", "funding": { "type": "github", @@ -2072,20 +2997,22 @@ } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.10.3.tgz", + "integrity": "sha512-/SFuEDnbJxy3jvi72LeyiPHWkV+uFc0LUHTUHSh20vwyy+tLrzncJfXohGbTIv5YxYhzExQYZDRD4VbSghKdlw==", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/extension-list-item": "^2.7.0", - "@tiptap/extension-text-style": "^2.7.0" + "@tiptap/core": "^2.7.0" } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.10.3.tgz", + "integrity": "sha512-sNkTX/iN+YoleDiTJsrWSBw9D7c4vsYwnW5y/G5ydfuJMIRQMF78pWSIWZFDRNOMkgK5UHkhu9anrbCFYgBfaA==", "license": "MIT", "funding": { "type": "github", @@ -2096,7 +3023,9 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.10.3.tgz", + "integrity": "sha512-jYoPy6F6njYp3txF3u23bgdRy/S5ATcWDO9LPZLHSeikwQfJ47nqb+EUNo5M8jIOgFBTn4MEbhuZ6OGyhnxopA==", "license": "MIT", "funding": { "type": "github", @@ -2107,7 +3036,9 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.10.3.tgz", + "integrity": "sha512-7p9XiRprsRZm8y9jvF/sS929FCELJ5N9FQnbzikOiyGNUx5mdI+exVZlfvBr9xOD5s7fBLg6jj9Vs0fXPNRkPg==", "license": "MIT", "funding": { "type": "github", @@ -2118,9 +3049,10 @@ } }, "node_modules/@tiptap/extension-text-style": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.10.3.tgz", + "integrity": "sha512-TalYIdlF7vBA4afFhmido7AORdBbu3sV+HCByda0FiNbM6cjng3Nr9oxHOCVJy+ChqrcgF4m54zDfLmamdyu5Q==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -2130,27 +3062,29 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.10.3.tgz", + "integrity": "sha512-771p53aU0KFvujvKpngvq2uAxThlEsjYaXcVVmwrhf0vxSSg+psKQEvqvWvHv/3BwkPVCGwmEKNVJZjaXFKu4g==", "license": "MIT", "dependencies": { "prosemirror-changeset": "^2.2.1", "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.6.0", + "prosemirror-commands": "^1.6.2", "prosemirror-dropcursor": "^1.8.1", "prosemirror-gapcursor": "^1.3.2", "prosemirror-history": "^1.4.1", "prosemirror-inputrules": "^1.4.0", "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.13.0", + "prosemirror-markdown": "^1.13.1", "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.22.3", + "prosemirror-model": "^1.23.0", "prosemirror-schema-basic": "^1.2.3", "prosemirror-schema-list": "^1.4.1", "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.4.0", + "prosemirror-tables": "^1.6.1", "prosemirror-trailing-node": "^3.0.0", - "prosemirror-transform": "^1.10.0", - "prosemirror-view": "^1.33.10" + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.37.0" }, "funding": { "type": "github", @@ -2158,14 +3092,16 @@ } }, "node_modules/@tiptap/react": { - "version": "2.8.0", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.10.3.tgz", + "integrity": "sha512-5GBL3arWai8WZuCl1MMA7bT5aWwqDi5AOQhX+hovKjwHvttpKDogRoUBL5k6Eds/eQMBMGTpsfmZlGNiFxSv1g==", "license": "MIT", "dependencies": { - "@tiptap/extension-bubble-menu": "^2.8.0", - "@tiptap/extension-floating-menu": "^2.8.0", + "@tiptap/extension-bubble-menu": "^2.10.3", + "@tiptap/extension-floating-menu": "^2.10.3", "@types/use-sync-external-store": "^0.0.6", "fast-deep-equal": "^3", - "use-sync-external-store": "^1.2.2" + "use-sync-external-store": "^1" }, "funding": { "type": "github", @@ -2174,34 +3110,37 @@ "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/@tiptap/starter-kit": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "@tiptap/core": "^2.8.0", - "@tiptap/extension-blockquote": "^2.8.0", - "@tiptap/extension-bold": "^2.8.0", - "@tiptap/extension-bullet-list": "^2.8.0", - "@tiptap/extension-code": "^2.8.0", - "@tiptap/extension-code-block": "^2.8.0", - "@tiptap/extension-document": "^2.8.0", - "@tiptap/extension-dropcursor": "^2.8.0", - "@tiptap/extension-gapcursor": "^2.8.0", - "@tiptap/extension-hard-break": "^2.8.0", - "@tiptap/extension-heading": "^2.8.0", - "@tiptap/extension-history": "^2.8.0", - "@tiptap/extension-horizontal-rule": "^2.8.0", - "@tiptap/extension-italic": "^2.8.0", - "@tiptap/extension-list-item": "^2.8.0", - "@tiptap/extension-ordered-list": "^2.8.0", - "@tiptap/extension-paragraph": "^2.8.0", - "@tiptap/extension-strike": "^2.8.0", - "@tiptap/extension-text": "^2.8.0", - "@tiptap/pm": "^2.8.0" + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.10.3.tgz", + "integrity": "sha512-oq8xdVIMqohSs91ofHSr7i5dCp2F56Lb9aYIAI25lZmwNwQJL2geGOYjMSfL0IC4cQHPylIuSKYCg7vRFdZmAA==", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^2.10.3", + "@tiptap/extension-blockquote": "^2.10.3", + "@tiptap/extension-bold": "^2.10.3", + "@tiptap/extension-bullet-list": "^2.10.3", + "@tiptap/extension-code": "^2.10.3", + "@tiptap/extension-code-block": "^2.10.3", + "@tiptap/extension-document": "^2.10.3", + "@tiptap/extension-dropcursor": "^2.10.3", + "@tiptap/extension-gapcursor": "^2.10.3", + "@tiptap/extension-hard-break": "^2.10.3", + "@tiptap/extension-heading": "^2.10.3", + "@tiptap/extension-history": "^2.10.3", + "@tiptap/extension-horizontal-rule": "^2.10.3", + "@tiptap/extension-italic": "^2.10.3", + "@tiptap/extension-list-item": "^2.10.3", + "@tiptap/extension-ordered-list": "^2.10.3", + "@tiptap/extension-paragraph": "^2.10.3", + "@tiptap/extension-strike": "^2.10.3", + "@tiptap/extension-text": "^2.10.3", + "@tiptap/extension-text-style": "^2.10.3", + "@tiptap/pm": "^2.10.3" }, "funding": { "type": "github", @@ -2210,11 +3149,15 @@ }, "node_modules/@types/aria-query": { "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -2227,6 +3170,8 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "license": "MIT", "dependencies": { @@ -2235,6 +3180,8 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -2244,110 +3191,76 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/doctrine": { "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", + "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", "dev": true, "license": "MIT" }, - "node_modules/@types/escodegen": { - "version": "0.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.21", + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" + "@types/estree": "*", + "@types/json-schema": "*" } }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "@types/eslint": "*", + "@types/estree": "*" } }, - "node_modules/@types/find-cache-dir": { - "version": "3.2.1", - "dev": true, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "license": "MIT" }, - "node_modules/@types/glob": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", + "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", "license": "MIT", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" } }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/@types/json-schema": { "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/linkify-it": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "license": "MIT" }, "node_modules/@types/markdown-it": { "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "license": "MIT", "dependencies": { "@types/linkify-it": "^5", @@ -2356,49 +3269,36 @@ }, "node_modules/@types/mdurl": { "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "dev": true, + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", "license": "MIT" }, "node_modules/@types/node": { - "version": "22.7.6", + "version": "22.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", + "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", "devOptional": true, "license": "MIT", "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.20.0" } }, "node_modules/@types/parse-json": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.13", + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", "license": "MIT" }, - "node_modules/@types/qs": { - "version": "6.9.16", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/@types/react": { - "version": "18.3.11", + "version": "18.3.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.14.tgz", + "integrity": "sha512-NzahNKvjNhVjuPBQ+2G7WlxstQ+47kXZNHlUvFakDViuIEfGY926GqhMueQFZ7woG+sPiQKlF36XfrIUVSUfFg==", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -2406,15 +3306,19 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.1", + "version": "18.3.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.2.tgz", + "integrity": "sha512-Fqp+rcvem9wEnGr3RY8dYNvSQ8PoLqjZ9HLgaPUOjJJD120uDyOxOjc/39M4Kddp9JQCxpGQbnhVQF0C0ncYVg==", "dev": true, "license": "MIT", "dependencies": { - "@types/react": "*" + "@types/react": "^18" } }, "node_modules/@types/react-transition-group": { "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", "license": "MIT", "dependencies": { "@types/react": "*" @@ -2422,41 +3326,35 @@ }, "node_modules/@types/resolve": { "version": "1.20.6", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", + "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", "dev": true, "license": "MIT" }, "node_modules/@types/semver": { "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true, "license": "MIT" }, - "node_modules/@types/send": { - "version": "0.17.4", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "dev": true, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "license": "MIT", - "peer": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } + "optional": true }, "node_modules/@types/use-sync-external-store": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "license": "MIT", "dependencies": { @@ -2473,6 +3371,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "license": "MIT", "engines": { @@ -2485,6 +3385,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2509,8 +3411,23 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2536,6 +3453,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -2548,14 +3467,31 @@ }, "node_modules/@typescript-eslint/utils/node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "license": "MIT", "dependencies": { @@ -2572,21 +3508,27 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true, "license": "ISC" }, "node_modules/@vitejs/plugin-react-swc": { - "version": "3.7.1", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.2.tgz", + "integrity": "sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==", "license": "MIT", "dependencies": { "@swc/core": "^1.7.26" }, "peerDependencies": { - "vite": "^4 || ^5" + "vite": "^4 || ^5 || ^6" } }, "node_modules/@vitest/expect": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2600,6 +3542,8 @@ }, "node_modules/@vitest/runner": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", + "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", "dev": true, "license": "MIT", "dependencies": { @@ -2613,6 +3557,8 @@ }, "node_modules/@vitest/runner/node_modules/p-limit": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2627,6 +3573,8 @@ }, "node_modules/@vitest/runner/node_modules/yocto-queue": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "license": "MIT", "engines": { @@ -2638,6 +3586,8 @@ }, "node_modules/@vitest/snapshot": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", + "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2651,6 +3601,8 @@ }, "node_modules/@vitest/snapshot/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, "license": "MIT", "engines": { @@ -2662,6 +3614,8 @@ }, "node_modules/@vitest/snapshot/node_modules/pretty-format": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2675,6 +3629,8 @@ }, "node_modules/@vitest/spy": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", "dev": true, "license": "MIT", "dependencies": { @@ -2686,6 +3642,8 @@ }, "node_modules/@vitest/utils": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", "dev": true, "license": "MIT", "dependencies": { @@ -2700,6 +3658,8 @@ }, "node_modules/@vitest/utils/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, "license": "MIT", "engines": { @@ -2711,6 +3671,8 @@ }, "node_modules/@vitest/utils/node_modules/estree-walker": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { @@ -2719,6 +3681,8 @@ }, "node_modules/@vitest/utils/node_modules/pretty-format": { "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2731,57 +3695,73 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "license": "MIT", "dependencies": { @@ -2789,7 +3769,9 @@ } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2797,95 +3779,101 @@ } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, "license": "Apache-2.0" }, - "node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/acorn": { - "version": "7.4.1", - "dev": true, + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "devOptional": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -2896,6 +3884,8 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2903,15 +3893,22 @@ } }, "node_modules/acorn-walk": { - "version": "7.2.0", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } }, "node_modules/agent-base": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "license": "MIT", "dependencies": { @@ -2923,6 +3920,8 @@ }, "node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -2938,6 +3937,8 @@ }, "node_modules/ajv-keywords": { "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2946,6 +3947,8 @@ }, "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, "license": "MIT", "engines": { @@ -2953,21 +3956,31 @@ } }, "node_modules/ansi-styles": { - "version": "3.2.1", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/argparse": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2976,6 +3989,8 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "license": "MIT", "dependencies": { @@ -2989,13 +4004,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/array-includes": { "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3015,6 +4027,8 @@ }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", "engines": { @@ -3023,6 +4037,8 @@ }, "node_modules/array.prototype.findlast": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3042,6 +4058,8 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "license": "MIT", "dependencies": { @@ -3059,6 +4077,8 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3076,6 +4096,8 @@ }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "license": "MIT", "dependencies": { @@ -3091,6 +4113,8 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "license": "MIT", "dependencies": { @@ -3112,6 +4136,8 @@ }, "node_modules/assertion-error": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, "license": "MIT", "engines": { @@ -3120,6 +4146,8 @@ }, "node_modules/ast-types": { "version": "0.16.1", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", + "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", "dev": true, "license": "MIT", "peer": true, @@ -3132,10 +4160,14 @@ }, "node_modules/asynckit": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/attr-accept": { - "version": "2.2.4", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", + "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", "license": "MIT", "engines": { "node": ">=4" @@ -3143,6 +4175,8 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3156,7 +4190,9 @@ } }, "node_modules/axios": { - "version": "1.7.7", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -3166,6 +4202,8 @@ }, "node_modules/babel-plugin-macros": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -3179,11 +4217,15 @@ }, "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, "license": "MIT" }, "node_modules/better-opn": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", + "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", "peer": true, @@ -3194,44 +4236,10 @@ "node": ">=12.0.0" } }, - "node_modules/body-parser": { - "version": "1.20.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "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, "license": "MIT", "dependencies": { @@ -3241,6 +4249,8 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -3252,10 +4262,14 @@ }, "node_modules/browser-assert": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", + "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", "dev": true }, "node_modules/browserslist": { - "version": "4.24.0", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "funding": [ { "type": "opencollective", @@ -3272,10 +4286,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -3286,24 +4300,22 @@ }, "node_modules/buffer-builder": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", "devOptional": true, "license": "MIT/X11" }, "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==", "devOptional": true, "license": "MIT" }, - "node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/cac": { "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", "engines": { @@ -3311,15 +4323,16 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -3328,8 +4341,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.0.tgz", + "integrity": "sha512-CCKAP2tkPau7D3GE8+V8R6sQubA9R5foIzGp+85EXCVSCivuxBNAWqcpn72PKYiIcqoViv/kcUDpaEIMBVi1lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" @@ -3337,6 +4366,8 @@ }, "node_modules/camelcase": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "license": "MIT", "engines": { "node": ">=10" @@ -3346,7 +4377,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001669", + "version": "1.0.30001687", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", + "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", "funding": [ { "type": "opencollective", @@ -3365,6 +4398,8 @@ }, "node_modules/chai": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, "license": "MIT", "dependencies": { @@ -3381,26 +4416,26 @@ } }, "node_modules/chalk": { - "version": "2.4.2", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/check-error": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, "license": "MIT", "dependencies": { @@ -3412,6 +4447,8 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", "engines": { @@ -3420,33 +4457,50 @@ }, "node_modules/classnames": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, "node_modules/clsx": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/color-convert": { - "version": "1.9.3", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/colorjs.io": { "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", "devOptional": true, "license": "MIT" }, "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==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -3457,62 +4511,35 @@ }, "node_modules/commander": { "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "devOptional": true, "license": "MIT" }, - "node_modules/commondir": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "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, "license": "MIT" }, "node_modules/confbox": { "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", "dev": true, "license": "MIT" }, - "node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/convert-source-map": { "version": "1.9.0", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "license": "MIT" }, "node_modules/cosmiconfig": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", @@ -3527,10 +4554,14 @@ }, "node_modules/crelt": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -3544,6 +4575,8 @@ }, "node_modules/cssstyle": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", + "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", "dev": true, "license": "MIT", "dependencies": { @@ -3555,10 +4588,14 @@ }, "node_modules/csstype": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, "node_modules/data-urls": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "license": "MIT", "dependencies": { @@ -3571,6 +4608,8 @@ }, "node_modules/data-view-buffer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "license": "MIT", "dependencies": { @@ -3587,6 +4626,8 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3603,6 +4644,8 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, "license": "MIT", "dependencies": { @@ -3619,6 +4662,8 @@ }, "node_modules/date-fns": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", "license": "MIT", "funding": { "type": "github", @@ -3626,7 +4671,9 @@ } }, "node_modules/debug": { - "version": "4.3.7", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3642,11 +4689,15 @@ }, "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==", "dev": true, "license": "MIT" }, "node_modules/deep-eql": { "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, "license": "MIT", "dependencies": { @@ -3658,6 +4709,8 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -3672,6 +4725,8 @@ }, "node_modules/define-data-property": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { @@ -3688,6 +4743,8 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, "license": "MIT", "peer": true, @@ -3697,6 +4754,8 @@ }, "node_modules/define-properties": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -3713,38 +4772,27 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { "node": ">=0.4.0" } }, - "node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/dequal": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/diff-sequences": { "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", "engines": { @@ -3753,6 +4801,8 @@ }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", "dependencies": { @@ -3764,6 +4814,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3775,11 +4827,15 @@ }, "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, "license": "MIT" }, "node_modules/dom-helpers": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", @@ -3787,36 +4843,34 @@ } }, "node_modules/dompurify": { - "version": "3.1.7", - "license": "(MPL-2.0 OR Apache-2.0)" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.2.tgz", + "integrity": "sha512-YMM+erhdZ2nkZ4fTNRTSI94mb7VG7uVF5vj5Zde7tImgnhZE3R6YW/IACGIHb2ux+QkEXMhe591N+5jWOmL4Zw==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } }, "node_modules/dot-case": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, - "node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, "node_modules/electron-to-chromium": { - "version": "1.5.41", + "version": "1.5.71", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.71.tgz", + "integrity": "sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==", "license": "ISC" }, - "node_modules/encodeurl": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/enhanced-resolve": { "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "license": "MIT", "dependencies": { @@ -3829,6 +4883,8 @@ }, "node_modules/entities": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -3839,13 +4895,17 @@ }, "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==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.23.3", + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3864,7 +4924,7 @@ "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", @@ -3880,10 +4940,10 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", + "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", @@ -3905,6 +4965,8 @@ }, "node_modules/es-define-property": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3916,6 +4978,8 @@ }, "node_modules/es-errors": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { @@ -3923,7 +4987,9 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.1.0", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", + "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -3935,6 +5001,7 @@ "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "globalthis": "^1.0.4", + "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", @@ -3948,11 +5015,15 @@ }, "node_modules/es-module-lexer": { "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, "license": "MIT", "dependencies": { @@ -3964,6 +5035,8 @@ }, "node_modules/es-set-tostringtag": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3977,6 +5050,8 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "license": "MIT", "dependencies": { @@ -3984,13 +5059,15 @@ } }, "node_modules/es-to-primitive": { - "version": "1.2.1", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -4000,7 +5077,9 @@ } }, "node_modules/esbuild": { - "version": "0.23.1", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", + "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4012,34 +5091,36 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" + "@esbuild/aix-ppc64": "0.24.0", + "@esbuild/android-arm": "0.24.0", + "@esbuild/android-arm64": "0.24.0", + "@esbuild/android-x64": "0.24.0", + "@esbuild/darwin-arm64": "0.24.0", + "@esbuild/darwin-x64": "0.24.0", + "@esbuild/freebsd-arm64": "0.24.0", + "@esbuild/freebsd-x64": "0.24.0", + "@esbuild/linux-arm": "0.24.0", + "@esbuild/linux-arm64": "0.24.0", + "@esbuild/linux-ia32": "0.24.0", + "@esbuild/linux-loong64": "0.24.0", + "@esbuild/linux-mips64el": "0.24.0", + "@esbuild/linux-ppc64": "0.24.0", + "@esbuild/linux-riscv64": "0.24.0", + "@esbuild/linux-s390x": "0.24.0", + "@esbuild/linux-x64": "0.24.0", + "@esbuild/netbsd-x64": "0.24.0", + "@esbuild/openbsd-arm64": "0.24.0", + "@esbuild/openbsd-x64": "0.24.0", + "@esbuild/sunos-x64": "0.24.0", + "@esbuild/win32-arm64": "0.24.0", + "@esbuild/win32-ia32": "0.24.0", + "@esbuild/win32-x64": "0.24.0" } }, "node_modules/esbuild-register": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", + "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", "dev": true, "license": "MIT", "peer": true, @@ -4052,18 +5133,17 @@ }, "node_modules/escalade": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", "engines": { "node": ">=10" @@ -4072,37 +5152,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/escodegen": { - "version": "2.1.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint": { "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { @@ -4156,7 +5210,9 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.1", + "version": "7.37.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", + "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", "dev": true, "license": "MIT", "dependencies": { @@ -4165,7 +5221,7 @@ "array.prototype.flatmap": "^1.3.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", + "es-iterator-helpers": "^1.1.0", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", @@ -4188,6 +5244,8 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "license": "MIT", "engines": { @@ -4199,6 +5257,8 @@ }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4210,6 +5270,8 @@ }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "license": "MIT", "dependencies": { @@ -4224,16 +5286,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-storybook": { "version": "0.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.8.0.tgz", + "integrity": "sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==", "dev": true, "license": "MIT", "dependencies": { @@ -4251,6 +5307,8 @@ }, "node_modules/eslint-scope": { "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4266,6 +5324,8 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4275,97 +5335,39 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4380,21 +5382,13 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/acorn": { - "version": "8.13.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "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==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -4405,6 +5399,8 @@ }, "node_modules/esquery": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -4416,6 +5412,8 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -4427,6 +5425,8 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -4435,26 +5435,24 @@ }, "node_modules/estree-walker": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/events": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", "engines": { @@ -4463,6 +5461,8 @@ }, "node_modules/execa": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "license": "MIT", "dependencies": { @@ -4483,66 +5483,16 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/express": { - "version": "4.21.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/fast-deep-equal": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "license": "MIT", "dependencies": { @@ -4558,6 +5508,8 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -4569,16 +5521,22 @@ }, "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, "license": "MIT" }, "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==", "dev": true, "license": "MIT" }, "node_modules/fastq": { "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "license": "ISC", "dependencies": { @@ -4587,6 +5545,8 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { @@ -4597,10 +5557,12 @@ } }, "node_modules/file-selector": { - "version": "0.6.0", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", + "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", "license": "MIT", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.7.0" }, "engines": { "node": ">= 12" @@ -4608,6 +5570,8 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -4617,58 +5581,16 @@ "node": ">=8" } }, - "node_modules/finalhandler": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, "node_modules/find-root": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -4684,6 +5606,8 @@ }, "node_modules/flat-cache": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { @@ -4696,12 +5620,16 @@ } }, "node_modules/flatted": { - "version": "3.3.1", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true, "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -4720,6 +5648,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, "license": "MIT", "dependencies": { @@ -4728,6 +5658,8 @@ }, "node_modules/form-data": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -4763,42 +5695,31 @@ "react": ">=16.8.0" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", + "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, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "license": "ISC" }, - "node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=14.14" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/function-bind": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4806,6 +5727,8 @@ }, "node_modules/function.prototype.name": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "license": "MIT", "dependencies": { @@ -4823,6 +5746,8 @@ }, "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, "license": "MIT", "funding": { @@ -4831,6 +5756,8 @@ }, "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==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -4838,6 +5765,8 @@ }, "node_modules/get-func-name": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "license": "MIT", "engines": { @@ -4846,6 +5775,8 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4864,6 +5795,8 @@ }, "node_modules/get-stream": { "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "license": "MIT", "engines": { @@ -4875,6 +5808,8 @@ }, "node_modules/get-symbol-description": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "license": "MIT", "dependencies": { @@ -4891,6 +5826,9 @@ }, "node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -4910,6 +5848,8 @@ }, "node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -4919,31 +5859,17 @@ "node": ">=10.13.0" } }, - "node_modules/glob-promise": { - "version": "4.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/glob": "^7.1.3" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/ahmadnassri" - }, - "peerDependencies": { - "glob": "^7.1.6" - } - }, "node_modules/glob-to-regexp": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, "license": "BSD-2-Clause" }, "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==", "license": "MIT", "engines": { "node": ">=4" @@ -4951,6 +5877,8 @@ }, "node_modules/globalthis": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4966,6 +5894,8 @@ }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { @@ -4984,11 +5914,13 @@ } }, "node_modules/gopd": { - "version": "1.0.1", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4996,16 +5928,22 @@ }, "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==", "dev": true, "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "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, "license": "MIT", "funding": { @@ -5013,14 +5951,19 @@ } }, "node_modules/has-flag": { - "version": "3.0.0", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "devOptional": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { @@ -5031,9 +5974,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", + "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", "dev": true, "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, "engines": { "node": ">= 0.4" }, @@ -5042,7 +5990,9 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { @@ -5054,6 +6004,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { @@ -5068,6 +6020,8 @@ }, "node_modules/hasown": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -5078,6 +6032,8 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" @@ -5085,10 +6041,14 @@ }, "node_modules/hoist-non-react-statics/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==", "license": "MIT" }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5098,34 +6058,10 @@ "node": ">=18" } }, - "node_modules/html-tags": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/http-proxy-agent": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { @@ -5138,6 +6074,8 @@ }, "node_modules/https-proxy-agent": { "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "license": "MIT", "dependencies": { @@ -5150,6 +6088,8 @@ }, "node_modules/human-signals": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5157,11 +6097,13 @@ } }, "node_modules/iconv-lite": { - "version": "0.4.24", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" @@ -5169,6 +6111,8 @@ }, "node_modules/ignore": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -5176,12 +6120,16 @@ } }, "node_modules/immutable": { - "version": "4.3.7", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", "devOptional": true, "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -5196,6 +6144,8 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -5204,6 +6154,9 @@ }, "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==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -5213,11 +6166,15 @@ }, "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, "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "license": "MIT", "dependencies": { @@ -5229,16 +6186,10 @@ "node": ">= 0.4" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "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, "license": "MIT", "peer": true, @@ -5255,6 +6206,8 @@ }, "node_modules/is-array-buffer": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "license": "MIT", "dependencies": { @@ -5270,10 +6223,14 @@ }, "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==", "license": "MIT" }, "node_modules/is-async-function": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "license": "MIT", "dependencies": { @@ -5287,23 +6244,30 @@ } }, "node_modules/is-bigint": { - "version": "1.0.4", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.1.2", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", + "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5314,6 +6278,8 @@ }, "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, "license": "MIT", "engines": { @@ -5325,6 +6291,8 @@ }, "node_modules/is-core-module": { "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -5338,6 +6306,8 @@ }, "node_modules/is-data-view": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "license": "MIT", "dependencies": { @@ -5352,6 +6322,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -5366,6 +6338,8 @@ }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", "peer": true, @@ -5381,6 +6355,8 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -5388,11 +6364,16 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5400,6 +6381,8 @@ }, "node_modules/is-generator-function": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, "license": "MIT", "dependencies": { @@ -5414,6 +6397,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -5425,6 +6410,8 @@ }, "node_modules/is-map": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { @@ -5436,6 +6423,8 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", "engines": { @@ -5447,6 +6436,8 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -5454,11 +6445,14 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", + "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5469,32 +6463,32 @@ }, "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, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "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==", "dev": true, "license": "MIT" }, "node_modules/is-regex": { - "version": "1.1.4", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", + "integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "gopd": "^1.1.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -5505,6 +6499,8 @@ }, "node_modules/is-set": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { @@ -5516,6 +6512,8 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "license": "MIT", "dependencies": { @@ -5530,6 +6528,8 @@ }, "node_modules/is-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { @@ -5540,11 +6540,14 @@ } }, "node_modules/is-string": { - "version": "1.0.7", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", + "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", "dev": true, "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5554,11 +6557,15 @@ } }, "node_modules/is-symbol": { - "version": "1.0.4", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", + "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bind": "^1.0.7", + "has-symbols": "^1.0.3", + "safe-regex-test": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5569,6 +6576,8 @@ }, "node_modules/is-typed-array": { "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "license": "MIT", "dependencies": { @@ -5583,6 +6592,8 @@ }, "node_modules/is-weakmap": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { @@ -5594,6 +6605,8 @@ }, "node_modules/is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5605,6 +6618,8 @@ }, "node_modules/is-weakset": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5620,6 +6635,8 @@ }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "peer": true, @@ -5632,16 +6649,22 @@ }, "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, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/iterator.prototype": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", + "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5657,6 +6680,8 @@ }, "node_modules/jest-worker": { "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", "dependencies": { @@ -5668,16 +6693,10 @@ "node": ">= 10.13.0" } }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "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, "license": "MIT", "dependencies": { @@ -5692,6 +6711,8 @@ }, "node_modules/js-cookie": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", "license": "MIT", "engines": { "node": ">=14" @@ -5699,10 +6720,14 @@ }, "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==", "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -5713,6 +6738,8 @@ }, "node_modules/jsdoc-type-pratt-parser": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true, "license": "MIT", "peer": true, @@ -5722,6 +6749,8 @@ }, "node_modules/jsdom": { "version": "24.1.3", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.3.tgz", + "integrity": "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5761,6 +6790,8 @@ }, "node_modules/jsesc": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -5771,25 +6802,35 @@ }, "node_modules/json-buffer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "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==", "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -5798,19 +6839,10 @@ "node": ">=6" } }, - "node_modules/jsonfile": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5825,6 +6857,8 @@ }, "node_modules/keyv": { "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -5833,6 +6867,8 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5845,21 +6881,29 @@ }, "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==", "license": "MIT" }, "node_modules/linkify-it": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } }, "node_modules/linkifyjs": { - "version": "4.1.3", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.2.0.tgz", + "integrity": "sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==", "license": "MIT" }, "node_modules/loader-runner": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "license": "MIT", "engines": { @@ -5867,12 +6911,14 @@ } }, "node_modules/local-pkg": { - "version": "0.5.0", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", "dev": true, "license": "MIT", "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" }, "engines": { "node": ">=14" @@ -5883,6 +6929,8 @@ }, "node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -5897,6 +6945,8 @@ }, "node_modules/lodash": { "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash-es": { @@ -5907,11 +6957,15 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "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==", "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -5922,6 +6976,8 @@ }, "node_modules/loupe": { "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "license": "MIT", "dependencies": { @@ -5930,6 +6986,8 @@ }, "node_modules/lower-case": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -5937,6 +6995,8 @@ }, "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==", "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -5944,6 +7004,8 @@ }, "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, "license": "MIT", "bin": { @@ -5951,37 +7013,19 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", + "version": "0.30.14", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", + "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/markdown-it": { "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "license": "MIT", "dependencies": { "argparse": "^2.0.1", @@ -5997,47 +7041,31 @@ }, "node_modules/mdurl": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "license": "MIT" }, - "node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "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, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromatch": { "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -6048,19 +7076,23 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" - }, "engines": { - "node": ">=4" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, "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==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -6068,6 +7100,8 @@ }, "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==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -6078,6 +7112,8 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "license": "MIT", "engines": { @@ -6089,6 +7125,8 @@ }, "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, "license": "MIT", "engines": { @@ -6097,6 +7135,8 @@ }, "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, "license": "ISC", "dependencies": { @@ -6108,6 +7148,8 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", "funding": { @@ -6115,33 +7157,28 @@ } }, "node_modules/mlly": { - "version": "1.7.2", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz", + "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.12.1", + "acorn": "^8.14.0", "pathe": "^1.1.2", - "pkg-types": "^1.2.0", + "pkg-types": "^1.2.1", "ufo": "^1.5.4" } }, - "node_modules/mlly/node_modules/acorn": { - "version": "8.13.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/ms": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/mui-color-input": { - "version": "4.0.1", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/mui-color-input/-/mui-color-input-4.0.2.tgz", + "integrity": "sha512-TXbdtgBqyeUFXmmT2PW4LZfr/j14J24wtjp0GhQxmskwRl7NF54UmBFs1/Qsx9jev3V67weAs0GyYUT+Nkw9Tg==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -6162,7 +7199,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", @@ -6179,24 +7218,22 @@ }, "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, "license": "MIT" }, - "node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT" }, "node_modules/no-case": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "license": "MIT", "dependencies": { "lower-case": "^2.0.2", @@ -6205,10 +7242,14 @@ }, "node_modules/node-releases": { "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, "node_modules/npm-run-path": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6223,6 +7264,8 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", "engines": { @@ -6233,19 +7276,25 @@ } }, "node_modules/nwsapi": { - "version": "2.2.13", + "version": "2.2.16", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", + "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", "dev": true, "license": "MIT" }, "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==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.2", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true, "license": "MIT", "engines": { @@ -6257,6 +7306,8 @@ }, "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, "license": "MIT", "engines": { @@ -6265,6 +7316,8 @@ }, "node_modules/object.assign": { "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6282,6 +7335,8 @@ }, "node_modules/object.entries": { "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6295,6 +7350,8 @@ }, "node_modules/object.fromentries": { "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6312,6 +7369,8 @@ }, "node_modules/object.values": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6326,19 +7385,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "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, "license": "ISC", "dependencies": { @@ -6347,6 +7397,8 @@ }, "node_modules/onetime": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6361,6 +7413,8 @@ }, "node_modules/open": { "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "license": "MIT", "peer": true, @@ -6378,6 +7432,8 @@ }, "node_modules/optionator": { "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -6394,10 +7450,14 @@ }, "node_modules/orderedmap": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", "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, "license": "MIT", "dependencies": { @@ -6412,6 +7472,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -6424,16 +7486,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -6444,6 +7500,8 @@ }, "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==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -6459,7 +7517,9 @@ } }, "node_modules/parse5": { - "version": "7.2.0", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6469,16 +7529,10 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "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, "license": "MIT", "engines": { @@ -6487,6 +7541,8 @@ }, "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, "license": "MIT", "engines": { @@ -6495,6 +7551,8 @@ }, "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, "license": "MIT", "engines": { @@ -6503,15 +7561,14 @@ }, "node_modules/path-parse": { "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "0.1.10", - "dev": true, + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" @@ -6519,11 +7576,15 @@ }, "node_modules/pathe": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, "license": "MIT", "engines": { @@ -6532,79 +7593,26 @@ }, "node_modules/picocolors": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/pkg-types": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz", + "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", "dev": true, "license": "MIT", "dependencies": { @@ -6615,6 +7623,8 @@ }, "node_modules/possible-typed-array-names": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, "license": "MIT", "engines": { @@ -6622,7 +7632,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "funding": [ { "type": "opencollective", @@ -6640,7 +7652,7 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -6649,6 +7661,8 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -6657,6 +7671,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -6670,6 +7686,8 @@ }, "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, "license": "MIT", "engines": { @@ -6681,11 +7699,15 @@ }, "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, "license": "MIT" }, "node_modules/process": { "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, "license": "MIT", "peer": true, @@ -6695,6 +7717,8 @@ }, "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==", "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -6704,14 +7728,20 @@ }, "node_modules/prop-types/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==", "license": "MIT" }, "node_modules/property-expr": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", "license": "MIT" }, "node_modules/prosemirror-changeset": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz", + "integrity": "sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==", "license": "MIT", "dependencies": { "prosemirror-transform": "^1.0.0" @@ -6719,13 +7749,17 @@ }, "node_modules/prosemirror-collab": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", + "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0" } }, "node_modules/prosemirror-commands": { - "version": "1.6.1", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.2.tgz", + "integrity": "sha512-0nDHH++qcf/BuPLYvmqZTUUsPJUCPBUXt0J1ErTcDIS369CTp773itzLGIgIXG4LJXOlwYCr44+Mh4ii6MP1QA==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", @@ -6735,6 +7769,8 @@ }, "node_modules/prosemirror-dropcursor": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz", + "integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", @@ -6744,6 +7780,8 @@ }, "node_modules/prosemirror-gapcursor": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", + "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", "license": "MIT", "dependencies": { "prosemirror-keymap": "^1.0.0", @@ -6754,6 +7792,8 @@ }, "node_modules/prosemirror-history": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz", + "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.2.2", @@ -6764,6 +7804,8 @@ }, "node_modules/prosemirror-inputrules": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz", + "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", @@ -6772,6 +7814,8 @@ }, "node_modules/prosemirror-keymap": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", + "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", @@ -6780,6 +7824,8 @@ }, "node_modules/prosemirror-markdown": { "version": "1.13.1", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.1.tgz", + "integrity": "sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==", "license": "MIT", "dependencies": { "@types/markdown-it": "^14.0.0", @@ -6789,6 +7835,8 @@ }, "node_modules/prosemirror-menu": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz", + "integrity": "sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==", "license": "MIT", "dependencies": { "crelt": "^1.0.0", @@ -6798,7 +7846,9 @@ } }, "node_modules/prosemirror-model": { - "version": "1.23.0", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.24.0.tgz", + "integrity": "sha512-Ft7epNnycoQSM+2ObF35SBbBX+5WY39v8amVlrtlAcpglhlHs2tCTnWl7RX5tbp/PsMKcRcWV9cXPuoBWq0AIQ==", "license": "MIT", "dependencies": { "orderedmap": "^2.0.0" @@ -6806,13 +7856,17 @@ }, "node_modules/prosemirror-schema-basic": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.3.tgz", + "integrity": "sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.19.0" } }, "node_modules/prosemirror-schema-list": { - "version": "1.4.1", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.0.tgz", + "integrity": "sha512-gg1tAfH1sqpECdhIHOA/aLg2VH3ROKBWQ4m8Qp9mBKrOxQRW61zc+gMCI8nh22gnBzd1t2u1/NPLmO3nAa3ssg==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", @@ -6822,6 +7876,8 @@ }, "node_modules/prosemirror-state": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", + "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", @@ -6830,7 +7886,9 @@ } }, "node_modules/prosemirror-tables": { - "version": "1.5.0", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.6.1.tgz", + "integrity": "sha512-p8WRJNA96jaNQjhJolmbxTzd6M4huRE5xQ8OxjvMhQUP0Nzpo4zz6TztEiwk6aoqGBhz9lxRWR1yRZLlpQN98w==", "license": "MIT", "dependencies": { "prosemirror-keymap": "^1.1.2", @@ -6842,6 +7900,8 @@ }, "node_modules/prosemirror-trailing-node": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", + "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", "license": "MIT", "dependencies": { "@remirror/core-constants": "3.0.0", @@ -6855,13 +7915,17 @@ }, "node_modules/prosemirror-transform": { "version": "1.10.2", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz", + "integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.21.0" } }, "node_modules/prosemirror-view": { - "version": "1.34.3", + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.37.0.tgz", + "integrity": "sha512-z2nkKI1sJzyi7T47Ji/ewBPuIma1RNvQCCYVdV+MqWBV7o4Sa1n94UJCJJ1aQRF/xRkFfyqLGlGFWitIcCOtbg==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.20.0", @@ -6869,29 +7933,29 @@ "prosemirror-transform": "^1.1.0" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/proxy-from-env": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, "node_modules/psl": { - "version": "1.9.0", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } }, "node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -6900,32 +7964,24 @@ }, "node_modules/punycode.js": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/qs": { - "version": "6.13.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "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", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true, "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -6945,36 +8001,18 @@ }, "node_modules/randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, - "node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/react": { "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -6984,7 +8022,9 @@ } }, "node_modules/react-docgen": { - "version": "7.0.3", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.1.0.tgz", + "integrity": "sha512-APPU8HB2uZnpl6Vt/+0AFoVYgSRtfiP6FLrZgPPTDmqSb2R4qZRbgd0A3VzIFxDt5e+Fozjx79WjLWnF69DK8g==", "dev": true, "license": "MIT", "dependencies": { @@ -7005,6 +8045,8 @@ }, "node_modules/react-docgen-typescript": { "version": "2.2.2", + "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", + "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -7013,6 +8055,8 @@ }, "node_modules/react-dom": { "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -7023,11 +8067,13 @@ } }, "node_modules/react-dropzone": { - "version": "14.2.9", + "version": "14.3.5", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz", + "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==", "license": "MIT", "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", + "attr-accept": "^2.2.4", + "file-selector": "^2.1.0", "prop-types": "^15.8.1" }, "engines": { @@ -7037,25 +8083,6 @@ "react": ">= 16.8 || 18.0.0" } }, - "node_modules/react-element-to-jsx-string": { - "version": "15.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@base2/pretty-print-object": "1.0.1", - "is-plain-object": "5.0.0", - "react-is": "18.1.0" - }, - "peerDependencies": { - "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", - "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" - } - }, - "node_modules/react-element-to-jsx-string/node_modules/react-is": { - "version": "18.1.0", - "dev": true, - "license": "MIT" - }, "node_modules/react-fast-compare": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", @@ -7063,7 +8090,9 @@ "license": "MIT" }, "node_modules/react-icons": { - "version": "5.3.0", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.4.0.tgz", + "integrity": "sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==", "license": "MIT", "peerDependencies": { "react": "*" @@ -7071,10 +8100,14 @@ }, "node_modules/react-is": { "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, "node_modules/react-redux": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.3", @@ -7096,13 +8129,17 @@ }, "node_modules/react-redux/node_modules/@types/use-sync-external-store": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", "license": "MIT" }, "node_modules/react-router": { - "version": "6.27.0", + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.0.tgz", + "integrity": "sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.20.0" + "@remix-run/router": "1.21.0" }, "engines": { "node": ">=14.0.0" @@ -7112,11 +8149,13 @@ } }, "node_modules/react-router-dom": { - "version": "6.27.0", + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.0.tgz", + "integrity": "sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==", "license": "MIT", "dependencies": { - "@remix-run/router": "1.20.0", - "react-router": "6.27.0" + "@remix-run/router": "1.21.0", + "react-router": "6.28.0" }, "engines": { "node": ">=14.0.0" @@ -7128,6 +8167,8 @@ }, "node_modules/react-transition-group": { "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", @@ -7142,6 +8183,8 @@ }, "node_modules/recast": { "version": "0.23.9", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", + "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", "dev": true, "license": "MIT", "peer": true, @@ -7158,6 +8201,8 @@ }, "node_modules/recast/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==", "dev": true, "license": "BSD-3-Clause", "peer": true, @@ -7167,20 +8212,24 @@ }, "node_modules/redux": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT" }, "node_modules/reflect.getprototypeof": { - "version": "1.0.6", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", + "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", + "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" + "gopd": "^1.0.1", + "which-builtin-type": "^1.1.4" }, "engines": { "node": ">= 0.4" @@ -7191,10 +8240,14 @@ }, "node_modules/regenerator-runtime": { "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "license": "MIT" }, "node_modules/regexp.prototype.flags": { "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7212,6 +8265,8 @@ }, "node_modules/requireindex": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true, "license": "MIT", "engines": { @@ -7220,11 +8275,15 @@ }, "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==", "dev": true, "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -7240,6 +8299,8 @@ }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -7247,6 +8308,8 @@ }, "node_modules/reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "license": "MIT", "engines": { @@ -7256,6 +8319,9 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -7269,7 +8335,9 @@ } }, "node_modules/rollup": { - "version": "4.24.0", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", + "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", "license": "MIT", "dependencies": { "@types/estree": "1.0.6" @@ -7282,36 +8350,45 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", + "@rollup/rollup-android-arm-eabi": "4.28.1", + "@rollup/rollup-android-arm64": "4.28.1", + "@rollup/rollup-darwin-arm64": "4.28.1", + "@rollup/rollup-darwin-x64": "4.28.1", + "@rollup/rollup-freebsd-arm64": "4.28.1", + "@rollup/rollup-freebsd-x64": "4.28.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", + "@rollup/rollup-linux-arm-musleabihf": "4.28.1", + "@rollup/rollup-linux-arm64-gnu": "4.28.1", + "@rollup/rollup-linux-arm64-musl": "4.28.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", + "@rollup/rollup-linux-riscv64-gnu": "4.28.1", + "@rollup/rollup-linux-s390x-gnu": "4.28.1", + "@rollup/rollup-linux-x64-gnu": "4.28.1", + "@rollup/rollup-linux-x64-musl": "4.28.1", + "@rollup/rollup-win32-arm64-msvc": "4.28.1", + "@rollup/rollup-win32-ia32-msvc": "4.28.1", + "@rollup/rollup-win32-x64-msvc": "4.28.1", "fsevents": "~2.3.2" } }, "node_modules/rope-sequence": { "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", "license": "MIT" }, "node_modules/rrweb-cssom": { "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "dev": true, "license": "MIT" }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -7334,6 +8411,8 @@ }, "node_modules/rxjs": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -7342,6 +8421,8 @@ }, "node_modules/safe-array-concat": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -7359,6 +8440,8 @@ }, "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": [ { @@ -7378,6 +8461,8 @@ }, "node_modules/safe-regex-test": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "license": "MIT", "dependencies": { @@ -7394,20 +8479,25 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "license": "MIT" }, "node_modules/sass-embedded": { - "version": "1.80.2", + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.82.0.tgz", + "integrity": "sha512-v13sRVVZtWAQLpAGTz5D8hy+oyNKRHao5tKVc/P6AMqSP+jDM8X6GkEpL0jfbu3MaN2/hAQsd4Qx14GG1u0prQ==", "devOptional": true, "license": "MIT", "dependencies": { "@bufbuild/protobuf": "^2.0.0", "buffer-builder": "^0.2.0", "colorjs.io": "^0.5.0", - "immutable": "^4.0.0", + "immutable": "^5.0.2", "rxjs": "^7.4.0", "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", "varint": "^6.0.0" }, "bin": { @@ -7417,69 +8507,371 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.80.2", - "sass-embedded-android-arm64": "1.80.2", - "sass-embedded-android-ia32": "1.80.2", - "sass-embedded-android-riscv64": "1.80.2", - "sass-embedded-android-x64": "1.80.2", - "sass-embedded-darwin-arm64": "1.80.2", - "sass-embedded-darwin-x64": "1.80.2", - "sass-embedded-linux-arm": "1.80.2", - "sass-embedded-linux-arm64": "1.80.2", - "sass-embedded-linux-ia32": "1.80.2", - "sass-embedded-linux-musl-arm": "1.80.2", - "sass-embedded-linux-musl-arm64": "1.80.2", - "sass-embedded-linux-musl-ia32": "1.80.2", - "sass-embedded-linux-musl-riscv64": "1.80.2", - "sass-embedded-linux-musl-x64": "1.80.2", - "sass-embedded-linux-riscv64": "1.80.2", - "sass-embedded-linux-x64": "1.80.2", - "sass-embedded-win32-arm64": "1.80.2", - "sass-embedded-win32-ia32": "1.80.2", - "sass-embedded-win32-x64": "1.80.2" + "sass-embedded-android-arm": "1.82.0", + "sass-embedded-android-arm64": "1.82.0", + "sass-embedded-android-ia32": "1.82.0", + "sass-embedded-android-riscv64": "1.82.0", + "sass-embedded-android-x64": "1.82.0", + "sass-embedded-darwin-arm64": "1.82.0", + "sass-embedded-darwin-x64": "1.82.0", + "sass-embedded-linux-arm": "1.82.0", + "sass-embedded-linux-arm64": "1.82.0", + "sass-embedded-linux-ia32": "1.82.0", + "sass-embedded-linux-musl-arm": "1.82.0", + "sass-embedded-linux-musl-arm64": "1.82.0", + "sass-embedded-linux-musl-ia32": "1.82.0", + "sass-embedded-linux-musl-riscv64": "1.82.0", + "sass-embedded-linux-musl-x64": "1.82.0", + "sass-embedded-linux-riscv64": "1.82.0", + "sass-embedded-linux-x64": "1.82.0", + "sass-embedded-win32-arm64": "1.82.0", + "sass-embedded-win32-ia32": "1.82.0", + "sass-embedded-win32-x64": "1.82.0" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.82.0.tgz", + "integrity": "sha512-ttGMvWnA/5TYdZTjr5fWHDbb9nZgKipHKCc9zZQRF5HjUydOYWKNqmAJHQtbFWaq35kd5qn6yiE73IJN6eJ6wA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" } }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.80.2", + "node_modules/sass-embedded-android-arm64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.82.0.tgz", + "integrity": "sha512-bldHMs02QQWXsgHUZRgolNnZdMjN6XHvmUYoRkzmFq7lsvtLU6SJg2S1Wa9IZJs9jRWdTmOgA6YibSf3pROyFQ==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "android" ], "engines": { "node": ">=14.0.0" } }, - "node_modules/sass-embedded/node_modules/has-flag": { - "version": "4.0.0", - "devOptional": true, + "node_modules/sass-embedded-android-ia32": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.82.0.tgz", + "integrity": "sha512-FUJOnxw8IYKuYuxxiOkk6QXle8/yQFtKjnuSAJuZ5ZpLVMcSZzLc3SWOtuEXYx5iSAfJCO075o2ZoG/pPrJ9aw==", + "cpu": [ + "ia32" + ], "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/sass-embedded/node_modules/supports-color": { - "version": "8.1.1", - "devOptional": true, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.82.0.tgz", + "integrity": "sha512-rd+vc+sxJxNnbhaubiIJmnb1b3FvC9wxCIq8spstopbO7o1uufvBBDeRoFSJaN+7oNhamzjlYGdu6aQoQNs3+A==", + "cpu": [ + "riscv64" + ], "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=14.0.0" } }, - "node_modules/saxes": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { + "node_modules/sass-embedded-android-x64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.82.0.tgz", + "integrity": "sha512-EVlybGTgJ8wNLyWj8RUatPXSnmIcvCsx3EfsRfBfhGihLbn4NNpavYO9QsvZzI2XWbJqHLBCd+CvkTcDw/TaSQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.82.0.tgz", + "integrity": "sha512-LvdJPojjKlNGYOB0nSUR/ZtMDuAF4puspHlwK42aA/qK292bfSkMUKZPPapB2aSRwccc/ieBq5fI7n/WHrOCVw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.82.0.tgz", + "integrity": "sha512-6LfnD6YmG1aBfd3ReqMOJDb6Pg2Z/hmlJB7nU+Lb3E+hCNjAZAgeUHQxU/Pm1eIqJJTU/h4ib5QP0Pt9O8yVnw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.82.0.tgz", + "integrity": "sha512-ozjdC5rWzyi5Vo300I4tVZzneXOTQUiaxOr7DjtN26HuFaGAGCGmvThh2BRV4RvySg++5H9rdFu+VgyUQ5iukw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.82.0.tgz", + "integrity": "sha512-590/y0HJr/JiyxaqgR7Xf9P20BIhJ+zhB/afAnVuZe/4lEfCpTyM5xMe2+sKLsqtrVyzs9Zm/M4S4ASUOPCggA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-ia32": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.82.0.tgz", + "integrity": "sha512-hpc4acZ3UTjjJ3Q/GUXqQOCSml6AFKaku0HMawra9bKyRmOpxn8V5hqgXeOWVjK2oQzCmCnJvwKoQUP+S/SIYQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.82.0.tgz", + "integrity": "sha512-R5PQmY/I+GSoMtfLo8GgHkvF/q6x6y8VNM7yu/Ac1mJj86n48VFi29W1HfY2496+Q6cpAq7toobDj7YfldIdVA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.82.0.tgz", + "integrity": "sha512-bc2MUSMv/jabnNGEyKP2jQAYZoEzTT/c633W6QoeSEWETGCuTNjaHvWWE6qSI6/UfRg1EpuV1LQA2jPMzZfv/w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-ia32": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.82.0.tgz", + "integrity": "sha512-ZQKCFKm5TBcJ19UG6uUQmIKfVCJIWMb7e1a93lGeujSb9gyKF5Fb6MN3tuExoT7iFK8zU0Z9iyHqh93F58lcCw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.82.0.tgz", + "integrity": "sha512-5meSU8BHFeaT09RWfkuUrikRlC+WZcYb9To7MpfV1d9nlD7CZ2xydPExK+mj3DqRuQvTbvhMPcr7f+pHlgHINQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.82.0.tgz", + "integrity": "sha512-ASLAMfjWv7YEPBvEOVlb3zzHq8l4Y9Eh4x3m7B1dNauGVbO11Yng5cPCX/XbwGVf30BtE75pwqvV7oXxBtN15w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.82.0.tgz", + "integrity": "sha512-qWvRDXCXH3GzD8OcP0ntd8gBTK3kZyUeyXmxQDZyEtMAM4STC2Tn7+5+2JYYHlppzqWnZPFBNESvpKeOtHaBBw==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.82.0.tgz", + "integrity": "sha512-AmRaHqShztwfep+M4NagdGaY7fTyWGSOM3k4Z/dd7q4nZclXbALLqNJtKx8xOM7A41LHYJ9zDpIBVRkrh0PzTA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.82.0.tgz", + "integrity": "sha512-zL9JDQZHXHSGAZe5DqSrR86wMHbm9QPziU4/3hoIG+99StuS74CuV42+hw/+FXXBkXMWbjKWsyF/HZt+I/wJuw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-ia32": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.82.0.tgz", + "integrity": "sha512-xE+AzLquCkFPnnpo0NHjQdLRIhG1bVs42xIKx42aUbVLYKkBDvbBGpw6EtTscRMyvcjoOqGH5saRvSFComUQcw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.82.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.82.0.tgz", + "integrity": "sha512-cEgfOQG5womOzzk16ReTv2dxPq5BG16LgLUold/LH9IZH86u4E/MN7Fspf4RWeEJ2EcLdew9QYSC2YWs1l98dQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded/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==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { "xmlchars": "^2.2.0" }, "engines": { @@ -7488,6 +8880,8 @@ }, "node_modules/scheduler": { "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -7495,6 +8889,8 @@ }, "node_modules/schema-utils": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "license": "MIT", "dependencies": { @@ -7511,84 +8907,28 @@ } }, "node_modules/semver": { - "version": "7.6.3", - "dev": true, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" } }, "node_modules/serialize-javascript": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, - "node_modules/serve-static": { - "version": "1.16.2", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/set-function-length": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { @@ -7605,6 +8945,8 @@ }, "node_modules/set-function-name": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7617,13 +8959,10 @@ "node": ">= 0.4" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, "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, "license": "MIT", "dependencies": { @@ -7635,6 +8974,8 @@ }, "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, "license": "MIT", "engines": { @@ -7643,6 +8984,8 @@ }, "node_modules/side-channel": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "license": "MIT", "dependencies": { @@ -7660,11 +9003,15 @@ }, "node_modules/siginfo": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -7676,6 +9023,8 @@ }, "node_modules/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { @@ -7684,6 +9033,8 @@ }, "node_modules/snake-case": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "license": "MIT", "dependencies": { "dot-case": "^3.0.4", @@ -7692,6 +9043,8 @@ }, "node_modules/source-map": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -7699,6 +9052,8 @@ }, "node_modules/source-map-js": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -7706,6 +9061,8 @@ }, "node_modules/source-map-support": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7715,6 +9072,8 @@ }, "node_modules/source-map-support/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, "license": "BSD-3-Clause", "engines": { @@ -7723,29 +9082,27 @@ }, "node_modules/stackback": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, - "node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/std-env": { - "version": "3.7.0", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", "dev": true, "license": "MIT" }, "node_modules/storybook": { - "version": "8.3.6", + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.4.7.tgz", + "integrity": "sha512-RP/nMJxiWyFc8EVMH5gp20ID032Wvk+Yr3lmKidoegto5Iy+2dVQnUoElZb2zpbVXNHWakGuAkfI0dY1Hfp/vw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@storybook/core": "8.3.6" + "@storybook/core": "8.4.7" }, "bin": { "getstorybook": "bin/index.cjs", @@ -7755,10 +9112,20 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } } }, "node_modules/string.prototype.matchall": { "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "license": "MIT", "dependencies": { @@ -7784,6 +9151,8 @@ }, "node_modules/string.prototype.repeat": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, "license": "MIT", "dependencies": { @@ -7793,6 +9162,8 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "license": "MIT", "dependencies": { @@ -7810,6 +9181,8 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7823,6 +9196,8 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { @@ -7839,6 +9214,8 @@ }, "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, "license": "MIT", "dependencies": { @@ -7850,6 +9227,8 @@ }, "node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -7858,6 +9237,8 @@ }, "node_modules/strip-final-newline": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "license": "MIT", "engines": { @@ -7869,6 +9250,8 @@ }, "node_modules/strip-indent": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, "license": "MIT", "dependencies": { @@ -7883,6 +9266,8 @@ }, "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, "license": "MIT", "engines": { @@ -7893,37 +9278,48 @@ } }, "node_modules/strip-literal": { - "version": "2.1.0", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", "dev": true, "license": "MIT", "dependencies": { - "js-tokens": "^9.0.0" + "js-tokens": "^9.0.1" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.0", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "dev": true, "license": "MIT" }, "node_modules/stylis": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", "license": "MIT" }, "node_modules/supports-color": { - "version": "5.5.0", + "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, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "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==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -7934,23 +9330,54 @@ }, "node_modules/svg-parser": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", "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==", "dev": true, "license": "MIT" }, - "node_modules/tapable": { - "version": "2.2.1", - "dev": true, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.36.0", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "devOptional": true, "license": "BSD-2-Clause", "dependencies": { @@ -7968,6 +9395,8 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "license": "MIT", "dependencies": { @@ -7999,28 +9428,23 @@ } } }, - "node_modules/terser/node_modules/acorn": { - "version": "8.13.0", - "devOptional": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "license": "MIT" }, "node_modules/tiny-case": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==", "license": "MIT" }, "node_modules/tiny-invariant": { "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "dev": true, "license": "MIT", "peer": true @@ -8033,11 +9457,15 @@ }, "node_modules/tinybench": { "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinypool": { "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", "dev": true, "license": "MIT", "engines": { @@ -8046,6 +9474,8 @@ }, "node_modules/tinyspy": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true, "license": "MIT", "engines": { @@ -8054,20 +9484,17 @@ }, "node_modules/tippy.js": { "version": "6.3.7", + "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", + "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", "license": "MIT", "dependencies": { "@popperjs/core": "^2.9.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -8077,20 +9504,16 @@ "node": ">=8.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, "node_modules/toposort": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", "license": "MIT" }, "node_modules/tough-cookie": { "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8103,16 +9526,10 @@ "node": ">=6" } }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/tr46": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "dev": true, "license": "MIT", "dependencies": { @@ -8124,6 +9541,8 @@ }, "node_modules/ts-dedent": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", "dev": true, "license": "MIT", "engines": { @@ -8132,6 +9551,8 @@ }, "node_modules/tsconfig-paths": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", "dependencies": { @@ -8144,11 +9565,15 @@ } }, "node_modules/tslib": { - "version": "2.8.0", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", "dependencies": { @@ -8163,11 +9588,15 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -8179,6 +9608,8 @@ }, "node_modules/type-detect": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, "license": "MIT", "engines": { @@ -8187,6 +9618,8 @@ }, "node_modules/type-fest": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" @@ -8195,20 +9628,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8222,6 +9645,8 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "license": "MIT", "dependencies": { @@ -8239,7 +9664,9 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", "dev": true, "license": "MIT", "dependencies": { @@ -8248,7 +9675,8 @@ "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.13", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -8258,16 +9686,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -8277,7 +9707,9 @@ } }, "node_modules/typescript": { - "version": "5.6.3", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "devOptional": true, "license": "Apache-2.0", "peer": true, @@ -8291,15 +9723,21 @@ }, "node_modules/uc.micro": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "license": "MIT" }, "node_modules/ufo": { "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", + "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", "dev": true, "license": "MIT" }, "node_modules/unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "license": "MIT", "dependencies": { @@ -8313,59 +9751,40 @@ } }, "node_modules/undici-types": { - "version": "6.19.8", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "devOptional": true, "license": "MIT" }, "node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 4.0.0" } }, "node_modules/unplugin": { - "version": "1.14.1", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.0.tgz", + "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.12.1", + "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" }, "engines": { "node": ">=14.0.0" - }, - "peerDependencies": { - "webpack-sources": "^3" - }, - "peerDependenciesMeta": { - "webpack-sources": { - "optional": true - } - } - }, - "node_modules/unplugin/node_modules/acorn": { - "version": "8.13.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" } }, "node_modules/update-browserslist-db": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -8392,161 +9811,510 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", + "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-svgr": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz", + "integrity": "sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.3", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": ">=2.6.0" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "dev": true, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/util": { - "version": "0.12.5", - "dev": true, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4.0" + "node": ">=12" } }, - "node_modules/varint": { - "version": "6.0.0", - "devOptional": true, - "license": "MIT" + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/vary": { - "version": "1.1.2", - "dev": true, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/vite": { - "version": "5.4.10", + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=12" } }, - "node_modules/vite-node": { - "version": "1.6.0", - "dev": true, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node": ">=12" } }, - "node_modules/vite-plugin-svgr": { - "version": "4.2.0", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.5", - "@svgr/core": "^8.1.0", - "@svgr/plugin-jsx": "^8.1.0" - }, - "peerDependencies": { - "vite": "^2.6.0 || 3 || 4 || 5" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -8561,6 +10329,8 @@ }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -8597,6 +10367,8 @@ }, "node_modules/vitest": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", + "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", "dev": true, "license": "MIT", "dependencies": { @@ -8659,34 +10431,16 @@ } } }, - "node_modules/vitest/node_modules/acorn": { - "version": "8.13.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/vitest/node_modules/acorn-walk": { - "version": "8.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/w3c-keyname": { "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, "license": "MIT", "dependencies": { @@ -8698,6 +10452,8 @@ }, "node_modules/watchpack": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "license": "MIT", "dependencies": { @@ -8710,10 +10466,14 @@ }, "node_modules/web-vitals": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", + "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", "license": "Apache-2.0" }, "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==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -8721,17 +10481,19 @@ } }, "node_modules/webpack": { - "version": "5.95.0", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", @@ -8767,6 +10529,8 @@ }, "node_modules/webpack-sources": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, "license": "MIT", "engines": { @@ -8775,30 +10539,15 @@ }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "dev": true, "license": "MIT" }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.13.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/acorn-import-attributes": { - "version": "1.9.5", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -8811,6 +10560,8 @@ }, "node_modules/webpack/node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -8819,6 +10570,8 @@ }, "node_modules/whatwg-encoding": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8828,19 +10581,10 @@ "node": ">=18" } }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/whatwg-mimetype": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "license": "MIT", "engines": { @@ -8848,7 +10592,9 @@ } }, "node_modules/whatwg-url": { - "version": "14.0.0", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", + "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", "dev": true, "license": "MIT", "dependencies": { @@ -8861,6 +10607,8 @@ }, "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, "license": "ISC", "dependencies": { @@ -8874,30 +10622,38 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.0.2", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", + "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", "dev": true, "license": "MIT", "dependencies": { - "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" + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.0", + "is-number-object": "^1.1.0", + "is-string": "^1.1.0", + "is-symbol": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { - "version": "1.1.4", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", + "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", "dev": true, "license": "MIT", "dependencies": { + "call-bind": "^1.0.7", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", + "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.1.4", "is-weakref": "^1.0.2", @@ -8915,6 +10671,8 @@ }, "node_modules/which-collection": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { @@ -8931,7 +10689,9 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8950,6 +10710,8 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -8965,6 +10727,8 @@ }, "node_modules/word-wrap": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -8973,11 +10737,15 @@ }, "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, "license": "ISC" }, "node_modules/ws": { "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "license": "MIT", "engines": { @@ -8998,6 +10766,8 @@ }, "node_modules/xml-name-validator": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -9006,15 +10776,21 @@ }, "node_modules/xmlchars": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true, "license": "MIT" }, "node_modules/yallist": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "license": "ISC", "engines": { "node": ">= 6" @@ -9022,6 +10798,8 @@ }, "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, "license": "MIT", "engines": { @@ -9032,7 +10810,9 @@ } }, "node_modules/yup": { - "version": "1.4.0", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.5.0.tgz", + "integrity": "sha512-NJfBIHnp1QbqZwxcgl6irnDMIsb/7d1prNhFx02f1kp8h+orpi4xs3w90szNpOh68a/iHPdMsYvhZWoDmUvXBQ==", "license": "MIT", "dependencies": { "property-expr": "^2.0.5", diff --git a/frontend/src/components/RichTextEditor/RichTextEditor.jsx b/frontend/src/components/RichTextEditor/RichTextEditor.jsx index 082b3be7..40565e2d 100644 --- a/frontend/src/components/RichTextEditor/RichTextEditor.jsx +++ b/frontend/src/components/RichTextEditor/RichTextEditor.jsx @@ -31,13 +31,25 @@ const RichTextEditor = ({ const [header, setHeader] = useState(initialHeader ?? ""); useEffect(() => { - if (initialSetContent) initialSetContent(content); + if (initialSetContent) { + initialSetContent(content); + setContent(content); + } + + if(initialHeader){ + initialSetHeader(header); + setHeader(header); + } + + }, [content]); const handleHeaderChange = (e) => { const newHeader = e.target.value; setHeader(newHeader); - if (initialSetHeader) initialSetHeader(newHeader); + if (initialSetHeader) { + initialSetHeader(newHeader); + } console.log(header); }; @@ -54,7 +66,10 @@ const RichTextEditor = ({ OrderedList, ], onUpdate: ({ editor }) => { - setHtmlContent(editor.getHTML()); + let html = editor.getHTML(); + setHtmlContent(html); + setContent(html); + console.log(html); }, }); From 513b75f497202a7e7653b32f7cef35f36e30d4c1 Mon Sep 17 00:00:00 2001 From: tunckiral Date: Fri, 6 Dec 2024 13:14:17 -0500 Subject: [PATCH 098/178] remove extra flags --- frontend/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 68f72bcc..3e0d24fc 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -4,7 +4,7 @@ WORKDIR /app COPY package*.json ./ -RUN npm install --platform=linux --arch=x64 --include=optional +RUN npm install COPY . . From 1378979c617f36612d8be5d747e2339bffd49750 Mon Sep 17 00:00:00 2001 From: tunckiral Date: Fri, 6 Dec 2024 13:18:18 -0500 Subject: [PATCH 099/178] GET package-lock from develop branch --- frontend/package-lock.json | 5876 +++++++++++++----------------------- 1 file changed, 2048 insertions(+), 3828 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b2e86769..0fd965d3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -60,8 +60,6 @@ }, "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -72,13 +70,10 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.25.7", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", + "@babel/highlight": "^7.25.7", "picocolors": "^1.0.0" }, "engines": { @@ -86,30 +81,26 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.25.8", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "version": "7.25.8", "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -126,18 +117,20 @@ }, "node_modules/@babel/core/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==", "license": "MIT" }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.25.7", "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/types": "^7.25.7", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -147,13 +140,11 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.25.7", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -162,28 +153,32 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "version": "7.25.7", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "version": "7.25.7", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" }, "engines": { "node": ">=6.9.0" @@ -192,53 +187,67 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "version": "7.25.7", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.25.7", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "version": "7.25.7", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.7", "license": "MIT", "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.25.8", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.25.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -248,9 +257,7 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "version": "7.25.7", "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -260,30 +267,26 @@ } }, "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "version": "7.25.7", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.25.7", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -292,45 +295,43 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.25.8", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@base2/pretty-print-object": { + "version": "1.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/@bufbuild/protobuf": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.2.tgz", - "integrity": "sha512-UNtPCbrwrenpmrXuRwn9jYpPoweNXj8X5sMvYgsqYyaH8jQ6LfUJSk3dJLnBK+6sfYPrF4iAIo5sd5HQ+tg75A==", + "version": "2.2.0", "devOptional": true, "license": "(Apache-2.0 AND BSD-3-Clause)" }, "node_modules/@ctrl/tinycolor": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.1.0.tgz", - "integrity": "sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==", "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/@emotion/babel-plugin": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", - "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "version": "11.12.0", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.3.3", + "@emotion/serialize": "^1.2.0", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -340,28 +341,22 @@ } }, "node_modules/@emotion/cache": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.5.tgz", - "integrity": "sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g==", + "version": "11.13.1", "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.2", + "@emotion/utils": "^1.4.0", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, "node_modules/@emotion/hash": { "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", "license": "MIT" }, "node_modules/@emotion/is-prop-valid": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", - "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0" @@ -369,22 +364,18 @@ }, "node_modules/@emotion/memoize": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", - "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", + "version": "11.13.3", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.13.5", - "@emotion/serialize": "^1.3.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.1", "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.2", + "@emotion/utils": "^1.4.0", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, @@ -398,36 +389,30 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", - "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "version": "1.3.2", "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.2", + "@emotion/utils": "^1.4.1", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", "license": "MIT" }, "node_modules/@emotion/styled": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", - "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", + "version": "11.13.0", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", + "@emotion/babel-plugin": "^11.12.0", "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.3", + "@emotion/serialize": "^1.3.0", "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.2" + "@emotion/utils": "^1.4.0" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -441,860 +426,379 @@ }, "node_modules/@emotion/unitless": { "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", "license": "MIT" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", - "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", "license": "MIT", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", - "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "version": "1.4.1", "license": "MIT" }, "node_modules/@emotion/weak-memoize": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", "license": "MIT" }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", "cpu": [ - "ppc64" + "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ - "aix" + "win32" ], "peer": true, "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", - "cpu": [ - "arm" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, "engines": { - "node": ">=18" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=18" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=18" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/js": { + "version": "8.57.1", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@floating-ui/core": { + "version": "1.6.8", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true, - "engines": { - "node": ">=18" + "dependencies": { + "@floating-ui/utils": "^0.2.8" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@floating-ui/dom": { + "version": "1.6.11", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "license": "MIT" }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", - "cpu": [ - "loong64" - ], + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, "engines": { - "node": ">=18" + "node": ">=10.10.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", - "cpu": [ - "mips64el" - ], + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } + "license": "BSD-3-Clause" }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", - "cpu": [ - "riscv64" - ], + "node_modules/@jest/schemas": { + "version": "29.6.3", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, "engines": { - "node": ">=18" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", - "cpu": [ - "s390x" - ], + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.3.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=18" + "dependencies": { + "glob": "^7.2.0", + "glob-promise": "^4.2.0", + "magic-string": "^0.27.0", + "react-docgen-typescript": "^2.2.2" + }, + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", - "cpu": [ - "x64" - ], + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": { + "version": "0.27.0", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "peer": true, "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "peer": true, "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "devOptional": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "license": "MIT" }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, + "node_modules/@mui/base": { + "version": "5.0.0-beta.59", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "@babel/runtime": "^7.25.7", + "@floating-ui/react-dom": "^2.1.1", + "@mui/types": "^7.2.18", + "@mui/utils": "^6.1.4", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.1", + "prop-types": "^15.8.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, + "node_modules/@mui/core-downloads-tracker": { + "version": "6.1.5", "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, + "node_modules/@mui/icons-material": { + "version": "6.1.5", "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@babel/runtime": "^7.25.7" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^6.1.5", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, + "node_modules/@mui/lab": { + "version": "6.0.0-beta.12", "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "@babel/runtime": "^7.25.7", + "@mui/base": "5.0.0-beta.59", + "@mui/system": "^6.1.4", + "@mui/types": "^7.2.18", + "@mui/utils": "^6.1.4", + "clsx": "^2.1.1", + "prop-types": "^15.8.1" }, "engines": { - "node": ">=8" + "node": ">=14.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" + "type": "opencollective", + "url": "https://opencollective.com/mui-org" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", - "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.8" + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": "^6.1.4", + "@mui/material-pigment-css": "^6.1.4", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } } }, - "node_modules/@floating-ui/dom": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", - "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", + "node_modules/@mui/material": { + "version": "6.1.5", "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.8" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz", - "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==", - "license": "MIT" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@joshwooding/vite-plugin-react-docgen-typescript/-/vite-plugin-react-docgen-typescript-0.4.2.tgz", - "integrity": "sha512-feQ+ntr+8hbVudnsTUapiMN9q8T90XA1d5jn9QzY09sNoj4iD9wi0PY1vsBFTda4ZjEaxRK9S81oarR2nj7TFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.27.0", - "react-docgen-typescript": "^2.2.2" - }, - "peerDependencies": { - "typescript": ">= 4.3.x", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/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, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.64", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.64.tgz", - "integrity": "sha512-nu663PoZs/Pee0fkPYkjUADfT+AAi2QWvvHghDhLeSx8sa3i+GGaOoUsFmB4CPlyYqWfq9hRGA7H1T3d6VrGgw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@floating-ui/react-dom": "^2.1.1", - "@mui/types": "^7.2.19", - "@mui/utils": "^6.1.10", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/core-downloads-tracker": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.10.tgz", - "integrity": "sha512-LY5wdiLCBDY7u+Od8UmFINZFGN/5ZU90fhAslf/ZtfP+5RhuY45f679pqYIxe0y54l6Gkv9PFOc8Cs10LDTBYg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - } - }, - "node_modules/@mui/icons-material": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.10.tgz", - "integrity": "sha512-G6P1BCSt6EQDcKca47KwvKjlqgOXFbp2I3oWiOlFgKYTANBH89yk7ttMQ5ysqNxSYAB+4TdM37MlPYp4+FkVrQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@mui/material": "^6.1.10", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/lab": { - "version": "6.0.0-beta.18", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-6.0.0-beta.18.tgz", - "integrity": "sha512-O7jNn36Jb0530NOZeFLj33RGB57x3kfyiYOaj5sL/j/Pmq9T0tonKMkoW/AUCucmBa7RuEzEYMyqBpfqminebA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@mui/base": "5.0.0-beta.64", - "@mui/system": "^6.1.10", - "@mui/types": "^7.2.19", - "@mui/utils": "^6.1.10", - "clsx": "^2.1.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material": "^6.1.10", - "@mui/material-pigment-css": "^6.1.10", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@mui/material-pigment-css": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/material": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.10.tgz", - "integrity": "sha512-txnwYObY4N9ugv5T2n5h1KcbISegZ6l65w1/7tpSU5OB6MQCU94YkP8n/3slDw2KcEfRk4+4D8EUGfhSPMODEQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@mui/core-downloads-tracker": "^6.1.10", - "@mui/system": "^6.1.10", - "@mui/types": "^7.2.19", - "@mui/utils": "^6.1.10", + "@babel/runtime": "^7.25.7", + "@mui/core-downloads-tracker": "^6.1.5", + "@mui/system": "^6.1.5", + "@mui/types": "^7.2.18", + "@mui/utils": "^6.1.5", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", @@ -1313,7 +817,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.1.10", + "@mui/material-pigment-css": "^6.1.5", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -1334,13 +838,11 @@ } }, "node_modules/@mui/private-theming": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.10.tgz", - "integrity": "sha512-DqgsH0XFEweeG3rQfVkqTkeXcj/E76PGYWag8flbPdV8IYdMo+DfVdFlZK8JEjsaIVD2Eu1kJg972XnH5pfnBQ==", + "version": "6.1.5", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.26.0", - "@mui/utils": "^6.1.10", + "@babel/runtime": "^7.25.7", + "@mui/utils": "^6.1.5", "prop-types": "^15.8.1" }, "engines": { @@ -1361,14 +863,12 @@ } }, "node_modules/@mui/styled-engine": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.10.tgz", - "integrity": "sha512-+NV9adKZYhslJ270iPjf2yzdVJwav7CIaXcMlPSi1Xy1S/zRe5xFgZ6BEoMdmGRpr34lIahE8H1acXP2myrvRw==", + "version": "6.1.5", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.26.0", - "@emotion/cache": "^11.13.5", - "@emotion/serialize": "^1.3.3", + "@babel/runtime": "^7.25.7", + "@emotion/cache": "^11.13.1", + "@emotion/serialize": "^1.3.2", "@emotion/sheet": "^1.4.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1395,16 +895,14 @@ } }, "node_modules/@mui/system": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.10.tgz", - "integrity": "sha512-5YNIqxETR23SIkyP7MY2fFnXmplX/M4wNi2R+10AVRd3Ub+NLctWY/Vs5vq1oAMF0eSDLhRTGUjaUe+IGSfWqg==", + "version": "6.1.5", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.26.0", - "@mui/private-theming": "^6.1.10", - "@mui/styled-engine": "^6.1.10", - "@mui/types": "^7.2.19", - "@mui/utils": "^6.1.10", + "@babel/runtime": "^7.25.7", + "@mui/private-theming": "^6.1.5", + "@mui/styled-engine": "^6.1.5", + "@mui/types": "^7.2.18", + "@mui/utils": "^6.1.5", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1435,9 +933,7 @@ } }, "node_modules/@mui/types": { - "version": "7.2.19", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.19.tgz", - "integrity": "sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==", + "version": "7.2.18", "license": "MIT", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -1449,13 +945,11 @@ } }, "node_modules/@mui/utils": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.10.tgz", - "integrity": "sha512-1ETuwswGjUiAf2dP9TkBy8p49qrw2wXa+RuAjNTRE5+91vtXJ1HKrs7H9s8CZd1zDlQVzUcUAPm9lpQwF5ogTw==", + "version": "6.1.5", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.26.0", - "@mui/types": "^7.2.19", + "@babel/runtime": "^7.25.7", + "@mui/types": "^7.2.18", "@types/prop-types": "^15.7.13", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -1479,14 +973,12 @@ } }, "node_modules/@mui/x-date-pickers": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.23.1.tgz", - "integrity": "sha512-Jr4beZ7r2lvWBaFnkIAg9BgiNFcfeJy4AUe3MbG10BBSZyB++odGqhOUAIGqkP7MpUzEGlTv4NUaaD7gYTAQPg==", + "version": "7.21.0", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", "@mui/utils": "^5.16.6 || ^6.0.0", - "@mui/x-internals": "7.23.0", + "@mui/x-internals": "7.21.0", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -1509,10 +1001,10 @@ "dayjs": "^1.10.7", "luxon": "^3.0.2", "moment": "^2.29.4", - "moment-hijri": "^2.1.2 || ^3.0.0", + "moment-hijri": "^2.1.2", "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1545,16 +1037,14 @@ } }, "node_modules/@mui/x-date-pickers-pro": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers-pro/-/x-date-pickers-pro-7.23.1.tgz", - "integrity": "sha512-3+8pgxJ3NwGBRIZoG+tcXO76p/NrQTJrb490dacPztdNShRhV/h8Xgo4PLdLKJ8lsVcfUiUD7OlK09sgpWXcgw==", + "version": "7.21.0", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "^7.25.7", "@mui/utils": "^5.16.6 || ^6.0.0", - "@mui/x-date-pickers": "7.23.1", - "@mui/x-internals": "7.23.0", - "@mui/x-license": "7.23.0", + "@mui/x-date-pickers": "7.21.0", + "@mui/x-internals": "7.21.0", + "@mui/x-license": "7.21.0", "clsx": "^2.1.1", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" @@ -1572,10 +1062,10 @@ "dayjs": "^1.10.7", "luxon": "^3.0.2", "moment": "^2.29.4", - "moment-hijri": "^2.1.2 || ^3.0.0", + "moment-hijri": "^2.1.2", "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1608,9 +1098,7 @@ } }, "node_modules/@mui/x-internals": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.23.0.tgz", - "integrity": "sha512-bPclKpqUiJYIHqmTxSzMVZi6MH51cQsn5U+8jskaTlo3J4QiMeCYJn/gn7YbeR9GOZFp8hetyHjoQoVHKRXCig==", + "version": "7.21.0", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", @@ -1624,13 +1112,11 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^17.0.0 || ^18.0.0" } }, "node_modules/@mui/x-license": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@mui/x-license/-/x-license-7.23.0.tgz", - "integrity": "sha512-fIWODBg7qZDKD9R/gmZNywa7O4amyt4fczeLul9G37ahj3zOvdJ6B/RPaMlv9ZzFsuxKYRKMbhkz1+9Gks56QQ==", + "version": "7.21.0", "license": "SEE LICENSE IN LICENSE", "dependencies": { "@babel/runtime": "^7.25.7", @@ -1640,13 +1126,11 @@ "node": ">=14.0.0" }, "peerDependencies": { - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^17.0.0 || ^18.0.0" } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", "dependencies": { @@ -1659,8 +1143,6 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", "engines": { @@ -1669,8 +1151,6 @@ }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -1683,8 +1163,6 @@ }, "node_modules/@popperjs/core": { "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "license": "MIT", "funding": { "type": "opencollective", @@ -1693,28 +1171,22 @@ }, "node_modules/@remirror/core-constants": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz", - "integrity": "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg==", "license": "MIT" }, "node_modules/@remix-run/router": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz", - "integrity": "sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==", + "version": "1.20.0", "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", - "integrity": "sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==", + "version": "5.1.2", "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" + "picomatch": "^2.3.1" }, "engines": { "node": ">=14.0.0" @@ -1728,269 +1200,35 @@ } } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz", - "integrity": "sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.24.0", "cpu": [ - "arm" + "x64" ], "license": "MIT", "optional": true, "os": [ - "android" + "win32" ] }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz", - "integrity": "sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz", - "integrity": "sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz", - "integrity": "sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz", - "integrity": "sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz", - "integrity": "sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz", - "integrity": "sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz", - "integrity": "sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz", - "integrity": "sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz", - "integrity": "sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz", - "integrity": "sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz", - "integrity": "sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz", - "integrity": "sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz", - "integrity": "sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz", - "integrity": "sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz", - "integrity": "sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz", - "integrity": "sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz", - "integrity": "sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz", - "integrity": "sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/builder-vite": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.4.7.tgz", - "integrity": "sha512-LovyXG5VM0w7CovI/k56ZZyWCveQFVDl0m7WwetpmMh2mmFJ+uPQ35BBsgTvTfc8RHi+9Q3F58qP1MQSByXi9g==", - "dev": true, + "node_modules/@storybook/builder-vite": { + "version": "8.3.6", + "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "8.4.7", + "@storybook/csf-plugin": "8.3.6", + "@types/find-cache-dir": "^3.2.1", "browser-assert": "^1.2.1", + "es-module-lexer": "^1.5.0", + "express": "^4.19.2", + "find-cache-dir": "^3.0.0", + "fs-extra": "^11.1.0", + "magic-string": "^0.30.0", "ts-dedent": "^2.0.0" }, "funding": { @@ -1998,14 +1236,26 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.7", - "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" + "@preact/preset-vite": "*", + "storybook": "^8.3.6", + "typescript": ">= 4.3.x", + "vite": "^4.0.0 || ^5.0.0", + "vite-plugin-glimmerx": "*" + }, + "peerDependenciesMeta": { + "@preact/preset-vite": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vite-plugin-glimmerx": { + "optional": true + } } }, "node_modules/@storybook/components": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.4.7.tgz", - "integrity": "sha512-uyJIcoyeMWKAvjrG9tJBUCKxr2WZk+PomgrgrUwejkIfXMO76i6jw9BwLa0NZjYdlthDv30r9FfbYZyeNPmF0g==", + "version": "8.3.6", "dev": true, "license": "MIT", "funding": { @@ -2013,22 +1263,22 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + "storybook": "^8.3.6" } }, "node_modules/@storybook/core": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.4.7.tgz", - "integrity": "sha512-7Z8Z0A+1YnhrrSXoKKwFFI4gnsLbWzr8fnDCU6+6HlDukFYh8GHRcZ9zKfqmy6U3hw2h8H5DrHsxWfyaYUUOoA==", + "version": "8.3.6", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@storybook/csf": "^0.1.11", + "@types/express": "^4.17.21", "better-opn": "^3.0.2", "browser-assert": "^1.2.1", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0", "esbuild-register": "^3.5.0", + "express": "^4.19.2", "jsdoc-type-pratt-parser": "^4.0.0", "process": "^0.11.10", "recast": "^0.23.5", @@ -2039,20 +1289,10 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "prettier": "^2 || ^3" - }, - "peerDependenciesMeta": { - "prettier": { - "optional": true - } } }, "node_modules/@storybook/core/node_modules/@storybook/csf": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.12.tgz", - "integrity": "sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==", + "version": "0.1.11", "dev": true, "license": "MIT", "peer": true, @@ -2060,24 +1300,8 @@ "type-fest": "^2.19.0" } }, - "node_modules/@storybook/core/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@storybook/csf": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.1.tgz", - "integrity": "sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==", "dev": true, "license": "MIT", "dependencies": { @@ -2085,9 +1309,7 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.4.7.tgz", - "integrity": "sha512-Fgogplu4HImgC+AYDcdGm1rmL6OR1rVdNX1Be9C/NEXwOCpbbBwi0BxTf/2ZxHRk9fCeaPEcOdP5S8QHfltc1g==", + "version": "8.3.6", "dev": true, "license": "MIT", "dependencies": { @@ -2098,20 +1320,16 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.4.7" + "storybook": "^8.3.6" } }, "node_modules/@storybook/global": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", - "integrity": "sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==", "dev": true, "license": "MIT" }, "node_modules/@storybook/manager-api": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.4.7.tgz", - "integrity": "sha512-ELqemTviCxAsZ5tqUz39sDmQkvhVAvAgiplYy9Uf15kO0SP2+HKsCMzlrm2ue2FfkUNyqbDayCPPCB0Cdn/mpQ==", + "version": "8.3.6", "dev": true, "license": "MIT", "funding": { @@ -2119,13 +1337,11 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + "storybook": "^8.3.6" } }, "node_modules/@storybook/preview-api": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.4.7.tgz", - "integrity": "sha512-0QVQwHw+OyZGHAJEXo6Knx+6/4er7n2rTDE5RYJ9F2E2Lg42E19pfdLlq2Jhoods2Xrclo3wj6GWR//Ahi39Eg==", + "version": "8.3.6", "dev": true, "license": "MIT", "funding": { @@ -2133,22 +1349,34 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + "storybook": "^8.3.6" } }, "node_modules/@storybook/react": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-8.4.7.tgz", - "integrity": "sha512-nQ0/7i2DkaCb7dy0NaT95llRVNYWQiPIVuhNfjr1mVhEP7XD090p0g7eqUmsx8vfdHh2BzWEo6CoBFRd3+EXxw==", + "version": "8.3.6", "dev": true, "license": "MIT", "dependencies": { - "@storybook/components": "8.4.7", + "@storybook/components": "^8.3.6", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "8.4.7", - "@storybook/preview-api": "8.4.7", - "@storybook/react-dom-shim": "8.4.7", - "@storybook/theming": "8.4.7" + "@storybook/manager-api": "^8.3.6", + "@storybook/preview-api": "^8.3.6", + "@storybook/react-dom-shim": "8.3.6", + "@storybook/theming": "^8.3.6", + "@types/escodegen": "^0.0.6", + "@types/estree": "^0.0.51", + "@types/node": "^22.0.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "escodegen": "^2.1.0", + "html-tags": "^3.1.0", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^15.0.0", + "semver": "^7.3.7", + "ts-dedent": "^2.0.0", + "type-fest": "~2.19", + "util-deprecate": "^1.0.2" }, "engines": { "node": ">=18.0.0" @@ -2158,10 +1386,10 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@storybook/test": "8.4.7", + "@storybook/test": "8.3.6", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.4.7", + "storybook": "^8.3.6", "typescript": ">= 4.2.x" }, "peerDependenciesMeta": { @@ -2174,9 +1402,7 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.4.7.tgz", - "integrity": "sha512-6bkG2jvKTmWrmVzCgwpTxwIugd7Lu+2btsLAqhQSzDyIj2/uhMNp8xIMr/NBDtLgq3nomt9gefNa9xxLwk/OMg==", + "version": "8.3.6", "dev": true, "license": "MIT", "funding": { @@ -2186,20 +1412,18 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.4.7" + "storybook": "^8.3.6" } }, "node_modules/@storybook/react-vite": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@storybook/react-vite/-/react-vite-8.4.7.tgz", - "integrity": "sha512-iiY9iLdMXhDnilCEVxU6vQsN72pW3miaf0WSenOZRyZv3HdbpgOxI0qapOS0KCyRUnX9vTlmrSPTMchY4cAeOg==", + "version": "8.3.6", "dev": true, "license": "MIT", "dependencies": { - "@joshwooding/vite-plugin-react-docgen-typescript": "0.4.2", + "@joshwooding/vite-plugin-react-docgen-typescript": "0.3.0", "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "8.4.7", - "@storybook/react": "8.4.7", + "@storybook/builder-vite": "8.3.6", + "@storybook/react": "8.3.6", "find-up": "^5.0.0", "magic-string": "^0.30.0", "react-docgen": "^7.0.0", @@ -2216,14 +1440,17 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.4.7", - "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" + "storybook": "^8.3.6", + "vite": "^4.0.0 || ^5.0.0" } }, + "node_modules/@storybook/react/node_modules/@types/estree": { + "version": "0.0.51", + "dev": true, + "license": "MIT" + }, "node_modules/@storybook/theming": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.4.7.tgz", - "integrity": "sha512-99rgLEjf7iwfSEmdqlHkSG3AyLcK0sfExcr0jnc6rLiAkBhzuIsvcHjjUwkR210SOCgXqBPW0ZA6uhnuyppHLw==", + "version": "8.3.6", "dev": true, "license": "MIT", "funding": { @@ -2231,13 +1458,11 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + "storybook": "^8.3.6" } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "license": "MIT", "engines": { "node": ">=14" @@ -2252,8 +1477,6 @@ }, "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", "license": "MIT", "engines": { "node": ">=14" @@ -2268,8 +1491,6 @@ }, "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", "license": "MIT", "engines": { "node": ">=14" @@ -2284,8 +1505,6 @@ }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "license": "MIT", "engines": { "node": ">=14" @@ -2300,8 +1519,6 @@ }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "license": "MIT", "engines": { "node": ">=14" @@ -2316,8 +1533,6 @@ }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "license": "MIT", "engines": { "node": ">=14" @@ -2332,8 +1547,6 @@ }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", - "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "license": "MIT", "engines": { "node": ">=14" @@ -2348,8 +1561,6 @@ }, "node_modules/@svgr/babel-plugin-transform-svg-component": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "license": "MIT", "engines": { "node": ">=12" @@ -2364,8 +1575,6 @@ }, "node_modules/@svgr/babel-preset": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", - "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "license": "MIT", "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", @@ -2390,8 +1599,6 @@ }, "node_modules/@svgr/core": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", - "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", @@ -2410,8 +1617,6 @@ }, "node_modules/@svgr/core/node_modules/cosmiconfig": { "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "license": "MIT", "dependencies": { "import-fresh": "^3.3.0", @@ -2436,8 +1641,6 @@ }, "node_modules/@svgr/hast-util-to-babel-ast": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "license": "MIT", "dependencies": { "@babel/types": "^7.21.3", @@ -2453,8 +1656,6 @@ }, "node_modules/@svgr/plugin-jsx": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", - "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "license": "MIT", "dependencies": { "@babel/core": "^7.21.3", @@ -2474,14 +1675,12 @@ } }, "node_modules/@swc/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.0.tgz", - "integrity": "sha512-+CuuTCmQFfzaNGg1JmcZvdUVITQXJk9sMnl1C2TiDLzOSVOJRwVD4dNo5dljX/qxpMAN+2BIYlwjlSkoGi6grg==", + "version": "1.7.36", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.17" + "@swc/types": "^0.1.13" }, "engines": { "node": ">=10" @@ -2491,16 +1690,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.10.0", - "@swc/core-darwin-x64": "1.10.0", - "@swc/core-linux-arm-gnueabihf": "1.10.0", - "@swc/core-linux-arm64-gnu": "1.10.0", - "@swc/core-linux-arm64-musl": "1.10.0", - "@swc/core-linux-x64-gnu": "1.10.0", - "@swc/core-linux-x64-musl": "1.10.0", - "@swc/core-win32-arm64-msvc": "1.10.0", - "@swc/core-win32-ia32-msvc": "1.10.0", - "@swc/core-win32-x64-msvc": "1.10.0" + "@swc/core-darwin-arm64": "1.7.36", + "@swc/core-darwin-x64": "1.7.36", + "@swc/core-linux-arm-gnueabihf": "1.7.36", + "@swc/core-linux-arm64-gnu": "1.7.36", + "@swc/core-linux-arm64-musl": "1.7.36", + "@swc/core-linux-x64-gnu": "1.7.36", + "@swc/core-linux-x64-musl": "1.7.36", + "@swc/core-win32-arm64-msvc": "1.7.36", + "@swc/core-win32-ia32-msvc": "1.7.36", + "@swc/core-win32-x64-msvc": "1.7.36" }, "peerDependencies": { "@swc/helpers": "*" @@ -2511,205 +1710,115 @@ } } }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.0.tgz", - "integrity": "sha512-wCeUpanqZyzvgqWRtXIyhcFK3CqukAlYyP+fJpY2gWc/+ekdrenNIfZMwY7tyTFDkXDYEKzvn3BN/zDYNJFowQ==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-darwin-x64": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.0.tgz", - "integrity": "sha512-0CZPzqTynUBO+SHEl/qKsFSahp2Jv/P2ZRjFG0gwZY5qIcr1+B/v+o74/GyNMBGz9rft+F2WpU31gz2sJwyF4A==", + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.7.36", "cpu": [ "x64" ], "license": "Apache-2.0 AND MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=10" } }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.0.tgz", - "integrity": "sha512-oq+DdMu5uJOFPtRkeiITc4kxmd+QSmK+v+OBzlhdGkSgoH3yRWZP+H2ao0cBXo93ZgCr2LfjiER0CqSKhjGuNA==", - "cpu": [ - "arm" - ], + "node_modules/@swc/counter": { + "version": "0.1.3", + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.13", "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" + "dependencies": { + "@swc/counter": "^0.1.3" } }, - "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.0.tgz", - "integrity": "sha512-Y6+PC8knchEViRxiCUj3j8wsGXaIhuvU+WqrFqV834eiItEMEI9+Vh3FovqJMBE3L7d4E4ZQtgImHCXjrHfxbw==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, "engines": { - "node": ">=10" + "node": ">=18" } }, - "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.0.tgz", - "integrity": "sha512-EbrX9A5U4cECCQQfky7945AW9GYnTXtCUXElWTkTYmmyQK87yCyFfY8hmZ9qMFIwxPOH6I3I2JwMhzdi8Qoz7g==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.0.tgz", - "integrity": "sha512-TaxpO6snTjjfLXFYh5EjZ78se69j2gDcqEM8yB9gguPYwkCHi2Ylfmh7iVaNADnDJFtjoAQp0L41bTV/Pfq9Cg==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "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/@swc/core-linux-x64-musl": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.0.tgz", - "integrity": "sha512-IEGvDd6aEEKEyZFZ8oCKuik05G5BS7qwG5hO5PEMzdGeh8JyFZXxsfFXbfeAqjue4UaUUrhnoX+Ze3M2jBVMHw==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.0.tgz", - "integrity": "sha512-UkQ952GSpY+Z6XONj9GSW8xGSkF53jrCsuLj0nrcuw7Dvr1a816U/9WYZmmcYS8tnG2vHylhpm6csQkyS8lpCw==", - "cpu": [ - "arm64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@testing-library/dom/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=10" + "node": ">=7.0.0" } }, - "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.0.tgz", - "integrity": "sha512-a2QpIZmTiT885u/mUInpeN2W9ClCnqrV2LnMqJR1/Fgx1Afw/hAtiDZPtQ0SqS8yDJ2VR5gfNZo3gpxWMrqdVA==", - "cpu": [ - "ia32" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } + "node_modules/@testing-library/dom/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.0.tgz", - "integrity": "sha512-tZcCmMwf483nwsEBfUk5w9e046kMa1iSik4bP9Kwi2FGtOfHuDfIcwW4jek3hdcgF5SaBW1ktnK/lgQLDi5AtA==", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], + "node_modules/@testing-library/dom/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" - }, - "node_modules/@swc/types": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.17.tgz", - "integrity": "sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==", - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" + "node": ">=8" } }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "node_modules/@testing-library/dom/node_modules/supports-color": { + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=18" + "node": ">=8" } }, "node_modules/@testing-library/react": { "version": "15.0.7", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-15.0.7.tgz", - "integrity": "sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2746,9 +1855,7 @@ } }, "node_modules/@tiptap/core": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-2.10.3.tgz", - "integrity": "sha512-wAG/0/UsLeZLmshWb6rtWNXKJftcmnned91/HLccHVQAuQZ1UWH+wXeQKu/mtodxEO7JcU2mVPR9mLGQkK0McQ==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2759,9 +1866,7 @@ } }, "node_modules/@tiptap/extension-blockquote": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.10.3.tgz", - "integrity": "sha512-u9Mq4r8KzoeGVT8ms6FQDIMN95dTh3TYcT7fZpwcVM96mIl2Oyt+Bk66mL8z4zuFptfRI57Cu9QdnHEeILd//w==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2772,9 +1877,7 @@ } }, "node_modules/@tiptap/extension-bold": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-2.10.3.tgz", - "integrity": "sha512-xnF1tS2BsORenr11qyybW120gHaeHKiKq+ZOP14cGA0MsriKvWDnaCSocXP/xMEYHy7+2uUhJ0MsKkHVj4bPzQ==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2785,9 +1888,7 @@ } }, "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.10.3.tgz", - "integrity": "sha512-e9a4yMjQezuKy0rtyyzxbV2IAE1bm1PY3yoZEFrcaY0o47g1CMUn2Hwe+9As2HdntEjQpWR7NO1mZeKxHlBPYA==", + "version": "2.8.0", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -2802,22 +1903,20 @@ } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.10.3.tgz", - "integrity": "sha512-PTkwJOVlHi4RR4Wrs044tKMceweXwNmWA6EoQ93hPUVtQcwQL990Es5Izp+i88twTPLuGD9dH+o9QDyH9SkWdA==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.7.0" + "@tiptap/core": "^2.7.0", + "@tiptap/extension-list-item": "^2.7.0", + "@tiptap/extension-text-style": "^2.7.0" } }, "node_modules/@tiptap/extension-code": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.10.3.tgz", - "integrity": "sha512-JyLbfyY3cPctq9sVdpcRWTcoUOoq3/MnGE1eP6eBNyMTHyBPcM9TPhOkgj+xkD1zW/884jfelB+wa70RT/AMxQ==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2828,9 +1927,7 @@ } }, "node_modules/@tiptap/extension-code-block": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.10.3.tgz", - "integrity": "sha512-yiDVNg22fYkzsFk5kBlDSHcjwVJgajvO/M5fDXA+Hfxwo2oNcG6aJyyHXFe+UaXTVjdkPej0J6kcMKrTMCiFug==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2842,9 +1939,7 @@ } }, "node_modules/@tiptap/extension-document": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.10.3.tgz", - "integrity": "sha512-6i8+xbS2zB6t8iFzli1O/QB01MmwyI5Hqiiv4m5lOxqavmJwLss2sRhoMC2hB3CyFg5UmeODy/f/RnI6q5Vixg==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2855,9 +1950,7 @@ } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.10.3.tgz", - "integrity": "sha512-wzWf82ixWzZQr0hxcf/A0ul8NNxgy1N63O+c56st6OomoLuKUJWOXF+cs9O7V+/5rZKWdbdYYoRB5QLvnDBAlQ==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2869,9 +1962,7 @@ } }, "node_modules/@tiptap/extension-floating-menu": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.10.3.tgz", - "integrity": "sha512-Prg8rYLxeyzHxfzVu1mDkkUWMnD9ZN3y370O/1qy55e+XKVw9jFkTSuz0y0+OhMJG6bulYpDUMtb+N3+2xOWlQ==", + "version": "2.8.0", "license": "MIT", "dependencies": { "tippy.js": "^6.3.7" @@ -2886,9 +1977,7 @@ } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.10.3.tgz", - "integrity": "sha512-FskZi2DqDSTH1WkgLF2OLy0xU7qj3AgHsKhVsryeAtld4jAK5EsonneWgaipbz0e/MxuIvc1oyacfZKABpLaNg==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2900,9 +1989,7 @@ } }, "node_modules/@tiptap/extension-hard-break": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.10.3.tgz", - "integrity": "sha512-2rFlimUKAgKDwT6nqAMtPBjkrknQY8S7oBNyIcDOUGyFkvbDUl3Jd0PiC929S5F3XStJRppnMqhpNDAlWmvBLA==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2913,9 +2000,7 @@ } }, "node_modules/@tiptap/extension-heading": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.10.3.tgz", - "integrity": "sha512-AlxXXPCWIvw8hQUDFRskasj32iMNB8Sb19VgyFWqwvntGs2/UffNu8VdsVqxD2HpZ0g5rLYCYtSW4wigs9R3og==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2926,9 +2011,7 @@ } }, "node_modules/@tiptap/extension-history": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.10.3.tgz", - "integrity": "sha512-HaSiMdx9Im9Pb9qGlVud7W8bweRDRMez33Uzs5a2x0n1RWkelfH7TwYs41Y3wus8Ujs7kw6qh7jyhvPpQBKaSA==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2940,9 +2023,7 @@ } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.10.3.tgz", - "integrity": "sha512-1a2IWhD00tgUNg/91RLnBvfENL7DLCui5L245+smcaLu+OXOOEpoBHawx59/M4hEpsjqvRRM79TzO9YXfopsPw==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2954,9 +2035,7 @@ } }, "node_modules/@tiptap/extension-italic": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.10.3.tgz", - "integrity": "sha512-wAiO6ZxoHx2H90phnKttLWGPjPZXrfKxhOCsqYrK8BpRByhr48godOFRuGwYnKaiwoVjpxc63t+kDJDWvqmgMw==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2967,9 +2046,7 @@ } }, "node_modules/@tiptap/extension-link": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-2.10.3.tgz", - "integrity": "sha512-8esKlkZBzEiNcpt7I8Cd6l1mWmCc/66pPbUq9LfnIniDXE3U+ahBf4m3TJltYFBGbiiTR/xqMtJyVHOpuLDtAw==", + "version": "2.8.0", "license": "MIT", "dependencies": { "linkifyjs": "^4.1.0" @@ -2984,9 +2061,7 @@ } }, "node_modules/@tiptap/extension-list-item": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.10.3.tgz", - "integrity": "sha512-9sok81gvZfSta2K1Dwrq5/HSz1jk4zHBpFqCx0oydzodGslx6X1bNxdca+eXJpXZmQIWALK7zEr4X8kg3WZsgw==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -2997,22 +2072,20 @@ } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.10.3.tgz", - "integrity": "sha512-/SFuEDnbJxy3jvi72LeyiPHWkV+uFc0LUHTUHSh20vwyy+tLrzncJfXohGbTIv5YxYhzExQYZDRD4VbSghKdlw==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^2.7.0" + "@tiptap/core": "^2.7.0", + "@tiptap/extension-list-item": "^2.7.0", + "@tiptap/extension-text-style": "^2.7.0" } }, "node_modules/@tiptap/extension-paragraph": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.10.3.tgz", - "integrity": "sha512-sNkTX/iN+YoleDiTJsrWSBw9D7c4vsYwnW5y/G5ydfuJMIRQMF78pWSIWZFDRNOMkgK5UHkhu9anrbCFYgBfaA==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -3023,9 +2096,7 @@ } }, "node_modules/@tiptap/extension-strike": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.10.3.tgz", - "integrity": "sha512-jYoPy6F6njYp3txF3u23bgdRy/S5ATcWDO9LPZLHSeikwQfJ47nqb+EUNo5M8jIOgFBTn4MEbhuZ6OGyhnxopA==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -3036,9 +2107,7 @@ } }, "node_modules/@tiptap/extension-text": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.10.3.tgz", - "integrity": "sha512-7p9XiRprsRZm8y9jvF/sS929FCELJ5N9FQnbzikOiyGNUx5mdI+exVZlfvBr9xOD5s7fBLg6jj9Vs0fXPNRkPg==", + "version": "2.8.0", "license": "MIT", "funding": { "type": "github", @@ -3049,10 +2118,9 @@ } }, "node_modules/@tiptap/extension-text-style": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.10.3.tgz", - "integrity": "sha512-TalYIdlF7vBA4afFhmido7AORdBbu3sV+HCByda0FiNbM6cjng3Nr9oxHOCVJy+ChqrcgF4m54zDfLmamdyu5Q==", + "version": "2.8.0", "license": "MIT", + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" @@ -3062,29 +2130,27 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.10.3.tgz", - "integrity": "sha512-771p53aU0KFvujvKpngvq2uAxThlEsjYaXcVVmwrhf0vxSSg+psKQEvqvWvHv/3BwkPVCGwmEKNVJZjaXFKu4g==", + "version": "2.8.0", "license": "MIT", "dependencies": { "prosemirror-changeset": "^2.2.1", "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.6.2", + "prosemirror-commands": "^1.6.0", "prosemirror-dropcursor": "^1.8.1", "prosemirror-gapcursor": "^1.3.2", "prosemirror-history": "^1.4.1", "prosemirror-inputrules": "^1.4.0", "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.13.1", + "prosemirror-markdown": "^1.13.0", "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.23.0", + "prosemirror-model": "^1.22.3", "prosemirror-schema-basic": "^1.2.3", "prosemirror-schema-list": "^1.4.1", "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.6.1", + "prosemirror-tables": "^1.4.0", "prosemirror-trailing-node": "^3.0.0", - "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.37.0" + "prosemirror-transform": "^1.10.0", + "prosemirror-view": "^1.33.10" }, "funding": { "type": "github", @@ -3092,16 +2158,14 @@ } }, "node_modules/@tiptap/react": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-2.10.3.tgz", - "integrity": "sha512-5GBL3arWai8WZuCl1MMA7bT5aWwqDi5AOQhX+hovKjwHvttpKDogRoUBL5k6Eds/eQMBMGTpsfmZlGNiFxSv1g==", + "version": "2.8.0", "license": "MIT", "dependencies": { - "@tiptap/extension-bubble-menu": "^2.10.3", - "@tiptap/extension-floating-menu": "^2.10.3", + "@tiptap/extension-bubble-menu": "^2.8.0", + "@tiptap/extension-floating-menu": "^2.8.0", "@types/use-sync-external-store": "^0.0.6", "fast-deep-equal": "^3", - "use-sync-external-store": "^1" + "use-sync-external-store": "^1.2.2" }, "funding": { "type": "github", @@ -3110,37 +2174,34 @@ "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" } }, "node_modules/@tiptap/starter-kit": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.10.3.tgz", - "integrity": "sha512-oq8xdVIMqohSs91ofHSr7i5dCp2F56Lb9aYIAI25lZmwNwQJL2geGOYjMSfL0IC4cQHPylIuSKYCg7vRFdZmAA==", - "license": "MIT", - "dependencies": { - "@tiptap/core": "^2.10.3", - "@tiptap/extension-blockquote": "^2.10.3", - "@tiptap/extension-bold": "^2.10.3", - "@tiptap/extension-bullet-list": "^2.10.3", - "@tiptap/extension-code": "^2.10.3", - "@tiptap/extension-code-block": "^2.10.3", - "@tiptap/extension-document": "^2.10.3", - "@tiptap/extension-dropcursor": "^2.10.3", - "@tiptap/extension-gapcursor": "^2.10.3", - "@tiptap/extension-hard-break": "^2.10.3", - "@tiptap/extension-heading": "^2.10.3", - "@tiptap/extension-history": "^2.10.3", - "@tiptap/extension-horizontal-rule": "^2.10.3", - "@tiptap/extension-italic": "^2.10.3", - "@tiptap/extension-list-item": "^2.10.3", - "@tiptap/extension-ordered-list": "^2.10.3", - "@tiptap/extension-paragraph": "^2.10.3", - "@tiptap/extension-strike": "^2.10.3", - "@tiptap/extension-text": "^2.10.3", - "@tiptap/extension-text-style": "^2.10.3", - "@tiptap/pm": "^2.10.3" + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^2.8.0", + "@tiptap/extension-blockquote": "^2.8.0", + "@tiptap/extension-bold": "^2.8.0", + "@tiptap/extension-bullet-list": "^2.8.0", + "@tiptap/extension-code": "^2.8.0", + "@tiptap/extension-code-block": "^2.8.0", + "@tiptap/extension-document": "^2.8.0", + "@tiptap/extension-dropcursor": "^2.8.0", + "@tiptap/extension-gapcursor": "^2.8.0", + "@tiptap/extension-hard-break": "^2.8.0", + "@tiptap/extension-heading": "^2.8.0", + "@tiptap/extension-history": "^2.8.0", + "@tiptap/extension-horizontal-rule": "^2.8.0", + "@tiptap/extension-italic": "^2.8.0", + "@tiptap/extension-list-item": "^2.8.0", + "@tiptap/extension-ordered-list": "^2.8.0", + "@tiptap/extension-paragraph": "^2.8.0", + "@tiptap/extension-strike": "^2.8.0", + "@tiptap/extension-text": "^2.8.0", + "@tiptap/pm": "^2.8.0" }, "funding": { "type": "github", @@ -3149,15 +2210,11 @@ }, "node_modules/@types/aria-query": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { @@ -3170,8 +2227,6 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "license": "MIT", "dependencies": { @@ -3180,8 +2235,6 @@ }, "node_modules/@types/babel__template": { "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { @@ -3191,76 +2244,110 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/doctrine": { "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz", - "integrity": "sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==", "dev": true, "license": "MIT" }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "node_modules/@types/escodegen": { + "version": "0.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" } }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" } }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "node_modules/@types/find-cache-dir": { + "version": "3.2.1", + "dev": true, "license": "MIT" }, + "node_modules/@types/glob": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", - "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "license": "MIT", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" } }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/json-schema": { "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/linkify-it": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", "license": "MIT" }, "node_modules/@types/markdown-it": { "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", - "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", "license": "MIT", "dependencies": { "@types/linkify-it": "^5", @@ -3269,36 +2356,49 @@ }, "node_modules/@types/mdurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "dev": true, "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "version": "22.7.6", "devOptional": true, "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.19.2" } }, "node_modules/@types/parse-json": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, "node_modules/@types/prop-types": { - "version": "15.7.14", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", - "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "version": "15.7.13", "license": "MIT" }, + "node_modules/@types/qs": { + "version": "6.9.16", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/react": { - "version": "18.3.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.14.tgz", - "integrity": "sha512-NzahNKvjNhVjuPBQ+2G7WlxstQ+47kXZNHlUvFakDViuIEfGY926GqhMueQFZ7woG+sPiQKlF36XfrIUVSUfFg==", + "version": "18.3.11", "license": "MIT", "dependencies": { "@types/prop-types": "*", @@ -3306,19 +2406,15 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.2", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.2.tgz", - "integrity": "sha512-Fqp+rcvem9wEnGr3RY8dYNvSQ8PoLqjZ9HLgaPUOjJJD120uDyOxOjc/39M4Kddp9JQCxpGQbnhVQF0C0ncYVg==", + "version": "18.3.1", "dev": true, "license": "MIT", "dependencies": { - "@types/react": "^18" + "@types/react": "*" } }, "node_modules/@types/react-transition-group": { "version": "4.4.11", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", - "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", "license": "MIT", "dependencies": { "@types/react": "*" @@ -3326,35 +2422,41 @@ }, "node_modules/@types/resolve": { "version": "1.20.6", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.6.tgz", - "integrity": "sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==", "dev": true, "license": "MIT" }, "node_modules/@types/semver": { "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true, "license": "MIT" }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "dev": true, "license": "MIT", - "optional": true + "peer": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } }, "node_modules/@types/use-sync-external-store": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "license": "MIT", "dependencies": { @@ -3371,8 +2473,6 @@ }, "node_modules/@typescript-eslint/types": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "license": "MIT", "engines": { @@ -3385,8 +2485,6 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3411,23 +2509,8 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/utils": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3453,8 +2536,6 @@ }, "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -3467,31 +2548,14 @@ }, "node_modules/@typescript-eslint/utils/node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "license": "MIT", "dependencies": { @@ -3508,27 +2572,21 @@ }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true, "license": "ISC" }, "node_modules/@vitejs/plugin-react-swc": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.7.2.tgz", - "integrity": "sha512-y0byko2b2tSVVf5Gpng1eEhX1OvPC7x8yns1Fx8jDzlJp4LS6CMkCPfLw47cjyoMrshQDoQw4qcgjsU9VvlCew==", + "version": "3.7.1", "license": "MIT", "dependencies": { "@swc/core": "^1.7.26" }, "peerDependencies": { - "vite": "^4 || ^5 || ^6" + "vite": "^4 || ^5" } }, "node_modules/@vitest/expect": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", - "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3542,8 +2600,6 @@ }, "node_modules/@vitest/runner": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", - "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", "dev": true, "license": "MIT", "dependencies": { @@ -3557,8 +2613,6 @@ }, "node_modules/@vitest/runner/node_modules/p-limit": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3573,8 +2627,6 @@ }, "node_modules/@vitest/runner/node_modules/yocto-queue": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true, "license": "MIT", "engines": { @@ -3586,8 +2638,6 @@ }, "node_modules/@vitest/snapshot": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3601,8 +2651,6 @@ }, "node_modules/@vitest/snapshot/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, "license": "MIT", "engines": { @@ -3614,8 +2662,6 @@ }, "node_modules/@vitest/snapshot/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3629,8 +2675,6 @@ }, "node_modules/@vitest/spy": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", - "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", "dev": true, "license": "MIT", "dependencies": { @@ -3642,8 +2686,6 @@ }, "node_modules/@vitest/utils": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", - "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", "dev": true, "license": "MIT", "dependencies": { @@ -3658,8 +2700,6 @@ }, "node_modules/@vitest/utils/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, "license": "MIT", "engines": { @@ -3671,8 +2711,6 @@ }, "node_modules/@vitest/utils/node_modules/estree-walker": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { @@ -3681,8 +2719,6 @@ }, "node_modules/@vitest/utils/node_modules/pretty-format": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3695,73 +2731,57 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "version": "1.12.1", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "version": "1.11.6", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "version": "1.11.6", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "version": "1.12.1", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "version": "1.11.6", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "version": "1.11.6", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "version": "1.12.1", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "version": "1.11.6", "dev": true, "license": "MIT", "dependencies": { @@ -3769,9 +2789,7 @@ } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "version": "1.11.6", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3779,101 +2797,95 @@ } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "version": "1.11.6", "dev": true, "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "version": "1.12.1", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "version": "1.12.1", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "version": "1.12.1", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "version": "1.12.1", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "version": "1.12.1", "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true, "license": "Apache-2.0" }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "devOptional": true, + "version": "7.4.1", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -3884,8 +2896,6 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3893,22 +2903,15 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "7.2.0", "dev": true, "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, "engines": { "node": ">=0.4.0" } }, "node_modules/agent-base": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "license": "MIT", "dependencies": { @@ -3920,8 +2923,6 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { @@ -3937,8 +2938,6 @@ }, "node_modules/ajv-keywords": { "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true, "license": "MIT", "peerDependencies": { @@ -3947,8 +2946,6 @@ }, "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, "license": "MIT", "engines": { @@ -3956,31 +2953,21 @@ } }, "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==", - "dev": true, + "version": "3.2.1", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, "node_modules/aria-query": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3989,8 +2976,6 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "license": "MIT", "dependencies": { @@ -4004,10 +2989,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, "node_modules/array-includes": { "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4027,8 +3015,6 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", "engines": { @@ -4037,8 +3023,6 @@ }, "node_modules/array.prototype.findlast": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", - "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4058,8 +3042,6 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "license": "MIT", "dependencies": { @@ -4077,8 +3059,6 @@ }, "node_modules/array.prototype.flatmap": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4096,8 +3076,6 @@ }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", - "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "license": "MIT", "dependencies": { @@ -4113,8 +3091,6 @@ }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "license": "MIT", "dependencies": { @@ -4136,8 +3112,6 @@ }, "node_modules/assertion-error": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, "license": "MIT", "engines": { @@ -4146,8 +3120,6 @@ }, "node_modules/ast-types": { "version": "0.16.1", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.16.1.tgz", - "integrity": "sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==", "dev": true, "license": "MIT", "peer": true, @@ -4160,14 +3132,10 @@ }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "license": "MIT" }, "node_modules/attr-accept": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.5.tgz", - "integrity": "sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ==", + "version": "2.2.4", "license": "MIT", "engines": { "node": ">=4" @@ -4175,8 +3143,6 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4190,9 +3156,7 @@ } }, "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "version": "1.7.7", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -4202,8 +3166,6 @@ }, "node_modules/babel-plugin-macros": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.12.5", @@ -4217,15 +3179,11 @@ }, "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, "license": "MIT" }, "node_modules/better-opn": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", "dev": true, "license": "MIT", "peer": true, @@ -4236,10 +3194,44 @@ "node": ">=12.0.0" } }, + "node_modules/body-parser": { + "version": "1.20.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, "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, "license": "MIT", "dependencies": { @@ -4249,8 +3241,6 @@ }, "node_modules/braces": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { @@ -4262,14 +3252,10 @@ }, "node_modules/browser-assert": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz", - "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", "dev": true }, "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "version": "4.24.0", "funding": [ { "type": "opencollective", @@ -4286,10 +3272,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -4300,22 +3286,24 @@ }, "node_modules/buffer-builder": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", - "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", "devOptional": true, "license": "MIT/X11" }, "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==", "devOptional": true, "license": "MIT" }, + "node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/cac": { "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", "engines": { @@ -4323,16 +3311,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" + "set-function-length": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -4341,24 +3328,8 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.0.tgz", - "integrity": "sha512-CCKAP2tkPau7D3GE8+V8R6sQubA9R5foIzGp+85EXCVSCivuxBNAWqcpn72PKYiIcqoViv/kcUDpaEIMBVi1lQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "license": "MIT", "engines": { "node": ">=6" @@ -4366,8 +3337,6 @@ }, "node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "license": "MIT", "engines": { "node": ">=10" @@ -4377,9 +3346,7 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001687", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001687.tgz", - "integrity": "sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==", + "version": "1.0.30001669", "funding": [ { "type": "opencollective", @@ -4398,8 +3365,6 @@ }, "node_modules/chai": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, "license": "MIT", "dependencies": { @@ -4416,26 +3381,26 @@ } }, "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, + "version": "2.4.2", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" } }, "node_modules/check-error": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, "license": "MIT", "dependencies": { @@ -4447,8 +3412,6 @@ }, "node_modules/chrome-trace-event": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "license": "MIT", "engines": { @@ -4457,50 +3420,33 @@ }, "node_modules/classnames": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "license": "MIT" }, "node_modules/clsx": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "license": "MIT", "engines": { "node": ">=6" } }, "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==", - "dev": true, + "version": "1.9.3", "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "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==", - "dev": true, + "version": "1.1.3", "license": "MIT" }, "node_modules/colorjs.io": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", "devOptional": true, "license": "MIT" }, "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==", "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" @@ -4511,35 +3457,62 @@ }, "node_modules/commander": { "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "devOptional": true, "license": "MIT" }, + "node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, "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, "license": "MIT" }, "node_modules/confbox": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", "dev": true, "license": "MIT" }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "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==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, "license": "MIT" }, "node_modules/cosmiconfig": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", @@ -4554,14 +3527,10 @@ }, "node_modules/crelt": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "version": "7.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -4575,8 +3544,6 @@ }, "node_modules/cssstyle": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.1.0.tgz", - "integrity": "sha512-h66W1URKpBS5YMI/V8PyXvTMFT8SupJ1IzoIV8IeBC/ji8WVmrO8dGlTi+2dh6whmdk6BiKJLD/ZBkhWbcg6nA==", "dev": true, "license": "MIT", "dependencies": { @@ -4588,14 +3555,10 @@ }, "node_modules/csstype": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, "node_modules/data-urls": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", - "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "license": "MIT", "dependencies": { @@ -4608,8 +3571,6 @@ }, "node_modules/data-view-buffer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", "dev": true, "license": "MIT", "dependencies": { @@ -4626,8 +3587,6 @@ }, "node_modules/data-view-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4644,8 +3603,6 @@ }, "node_modules/data-view-byte-offset": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", "dev": true, "license": "MIT", "dependencies": { @@ -4662,8 +3619,6 @@ }, "node_modules/date-fns": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", "license": "MIT", "funding": { "type": "github", @@ -4671,9 +3626,7 @@ } }, "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.3.7", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -4689,15 +3642,11 @@ }, "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==", "dev": true, "license": "MIT" }, "node_modules/deep-eql": { "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, "license": "MIT", "dependencies": { @@ -4709,8 +3658,6 @@ }, "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==", "dev": true, "license": "MIT" }, @@ -4725,8 +3672,6 @@ }, "node_modules/define-data-property": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { @@ -4743,8 +3688,6 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, "license": "MIT", "peer": true, @@ -4754,8 +3697,6 @@ }, "node_modules/define-properties": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "license": "MIT", "dependencies": { @@ -4772,27 +3713,38 @@ }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { "node": ">=0.4.0" } }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/dequal": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/diff-sequences": { "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", "engines": { @@ -4801,8 +3753,6 @@ }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", "dependencies": { @@ -4814,8 +3764,6 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -4827,15 +3775,11 @@ }, "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, "license": "MIT" }, "node_modules/dom-helpers": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.8.7", @@ -4843,34 +3787,36 @@ } }, "node_modules/dompurify": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.2.tgz", - "integrity": "sha512-YMM+erhdZ2nkZ4fTNRTSI94mb7VG7uVF5vj5Zde7tImgnhZE3R6YW/IACGIHb2ux+QkEXMhe591N+5jWOmL4Zw==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } + "version": "3.1.7", + "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/dot-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "license": "MIT", "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { - "version": "1.5.71", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.71.tgz", - "integrity": "sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==", + "version": "1.5.41", "license": "ISC" }, + "node_modules/encodeurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/enhanced-resolve": { "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "license": "MIT", "dependencies": { @@ -4883,8 +3829,6 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "license": "BSD-2-Clause", "engines": { "node": ">=0.12" @@ -4895,17 +3839,13 @@ }, "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==", "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.23.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", - "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "version": "1.23.3", "dev": true, "license": "MIT", "dependencies": { @@ -4924,7 +3864,7 @@ "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.4", + "globalthis": "^1.0.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", @@ -4940,10 +3880,10 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.3", + "regexp.prototype.flags": "^1.5.2", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", @@ -4965,8 +3905,6 @@ }, "node_modules/es-define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4978,8 +3916,6 @@ }, "node_modules/es-errors": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { @@ -4987,9 +3923,7 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz", - "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==", + "version": "1.1.0", "dev": true, "license": "MIT", "dependencies": { @@ -5001,7 +3935,6 @@ "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "globalthis": "^1.0.4", - "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", @@ -5015,15 +3948,11 @@ }, "node_modules/es-module-lexer": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", "dev": true, "license": "MIT", "dependencies": { @@ -5035,8 +3964,6 @@ }, "node_modules/es-set-tostringtag": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5050,8 +3977,6 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "license": "MIT", "dependencies": { @@ -5059,15 +3984,13 @@ } }, "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "version": "1.2.1", "dev": true, "license": "MIT", "dependencies": { - "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5077,9 +4000,7 @@ } }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.23.1", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -5091,36 +4012,34 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" } }, "node_modules/esbuild-register": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", "dev": true, "license": "MIT", "peer": true, @@ -5133,17 +4052,18 @@ }, "node_modules/escalade": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "license": "MIT", "engines": { "node": ">=10" @@ -5152,11 +4072,37 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint": { "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { @@ -5210,9 +4156,7 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.37.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", - "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", + "version": "7.37.1", "dev": true, "license": "MIT", "dependencies": { @@ -5221,7 +4165,7 @@ "array.prototype.flatmap": "^1.3.2", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.1.0", + "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", @@ -5244,8 +4188,6 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", - "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "license": "MIT", "engines": { @@ -5257,8 +4199,6 @@ }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -5270,8 +4210,6 @@ }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "license": "MIT", "dependencies": { @@ -5286,10 +4224,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-plugin-storybook": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-0.8.0.tgz", - "integrity": "sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==", "dev": true, "license": "MIT", "dependencies": { @@ -5307,8 +4251,6 @@ }, "node_modules/eslint-scope": { "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5324,8 +4266,6 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { @@ -5335,10 +4275,53 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "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/eslint/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5351,10 +4334,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { @@ -5366,8 +4366,6 @@ }, "node_modules/espree": { "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5382,13 +4380,21 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/acorn": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "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==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -5399,8 +4405,6 @@ }, "node_modules/esquery": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -5412,8 +4416,6 @@ }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -5425,8 +4427,6 @@ }, "node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -5435,24 +4435,26 @@ }, "node_modules/estree-walker": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, + "node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/events": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", "engines": { @@ -5461,8 +4463,6 @@ }, "node_modules/execa": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "license": "MIT", "dependencies": { @@ -5483,16 +4483,66 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/express": { + "version": "4.21.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "license": "MIT", "dependencies": { @@ -5508,8 +4558,6 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "license": "ISC", "dependencies": { @@ -5521,22 +4569,16 @@ }, "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, "license": "MIT" }, "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==", "dev": true, "license": "MIT" }, "node_modules/fastq": { "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "license": "ISC", "dependencies": { @@ -5545,8 +4587,6 @@ }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", "dependencies": { @@ -5557,12 +4597,10 @@ } }, "node_modules/file-selector": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-2.1.2.tgz", - "integrity": "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig==", + "version": "0.6.0", "license": "MIT", "dependencies": { - "tslib": "^2.7.0" + "tslib": "^2.4.0" }, "engines": { "node": ">= 12" @@ -5570,8 +4608,6 @@ }, "node_modules/fill-range": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { @@ -5581,16 +4617,58 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, "node_modules/find-root": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { @@ -5606,8 +4684,6 @@ }, "node_modules/flat-cache": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { @@ -5620,16 +4696,12 @@ } }, "node_modules/flatted": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", - "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "version": "3.3.1", "dev": true, "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -5648,8 +4720,6 @@ }, "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, "license": "MIT", "dependencies": { @@ -5658,8 +4728,6 @@ }, "node_modules/form-data": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", @@ -5695,31 +4763,42 @@ "react": ">=16.8.0" } }, - "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==", + "node_modules/forwarded": { + "version": "0.2.0", "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">= 0.6" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5727,8 +4806,6 @@ }, "node_modules/function.prototype.name": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "license": "MIT", "dependencies": { @@ -5746,8 +4823,6 @@ }, "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, "license": "MIT", "funding": { @@ -5756,8 +4831,6 @@ }, "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==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -5765,8 +4838,6 @@ }, "node_modules/get-func-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "license": "MIT", "engines": { @@ -5775,8 +4846,6 @@ }, "node_modules/get-intrinsic": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5795,8 +4864,6 @@ }, "node_modules/get-stream": { "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, "license": "MIT", "engines": { @@ -5808,8 +4875,6 @@ }, "node_modules/get-symbol-description": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "license": "MIT", "dependencies": { @@ -5826,9 +4891,6 @@ }, "node_modules/glob": { "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -5848,8 +4910,6 @@ }, "node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { @@ -5859,17 +4919,31 @@ "node": ">=10.13.0" } }, + "node_modules/glob-promise": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" + }, + "peerDependencies": { + "glob": "^7.1.6" + } + }, "node_modules/glob-to-regexp": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, "license": "BSD-2-Clause" }, "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==", "license": "MIT", "engines": { "node": ">=4" @@ -5877,8 +4951,6 @@ }, "node_modules/globalthis": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5894,8 +4966,6 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { @@ -5914,13 +4984,11 @@ } }, "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "version": "1.0.1", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5928,22 +4996,16 @@ }, "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==", "dev": true, "license": "ISC" }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, "license": "MIT" }, "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, "license": "MIT", "funding": { @@ -5951,19 +5013,14 @@ } }, "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==", - "devOptional": true, + "version": "3.0.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { @@ -5974,14 +5031,9 @@ } }, "node_modules/has-proto": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", - "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", + "version": "1.0.3", "dev": true, "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7" - }, "engines": { "node": ">= 0.4" }, @@ -5990,9 +5042,7 @@ } }, "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "version": "1.0.3", "dev": true, "license": "MIT", "engines": { @@ -6004,8 +5054,6 @@ }, "node_modules/has-tostringtag": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { @@ -6020,8 +5068,6 @@ }, "node_modules/hasown": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -6032,8 +5078,6 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" @@ -6041,14 +5085,10 @@ }, "node_modules/hoist-non-react-statics/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==", "license": "MIT" }, "node_modules/html-encoding-sniffer": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", - "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6058,10 +5098,34 @@ "node": ">=18" } }, + "node_modules/html-tags": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/http-proxy-agent": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "license": "MIT", "dependencies": { @@ -6074,8 +5138,6 @@ }, "node_modules/https-proxy-agent": { "version": "7.0.5", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", - "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "license": "MIT", "dependencies": { @@ -6088,8 +5150,6 @@ }, "node_modules/human-signals": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "license": "Apache-2.0", "engines": { @@ -6097,13 +5157,11 @@ } }, "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==", + "version": "0.4.24", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" @@ -6111,8 +5169,6 @@ }, "node_modules/ignore": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { @@ -6120,16 +5176,12 @@ } }, "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "version": "4.3.7", "devOptional": true, "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -6144,8 +5196,6 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { @@ -6154,9 +5204,6 @@ }, "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==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, "license": "ISC", "dependencies": { @@ -6166,15 +5213,11 @@ }, "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, "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "license": "MIT", "dependencies": { @@ -6186,10 +5229,16 @@ "node": ">= 0.4" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "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, "license": "MIT", "peer": true, @@ -6206,8 +5255,6 @@ }, "node_modules/is-array-buffer": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "license": "MIT", "dependencies": { @@ -6223,14 +5270,10 @@ }, "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==", "license": "MIT" }, "node_modules/is-async-function": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dev": true, "license": "MIT", "dependencies": { @@ -6244,30 +5287,23 @@ } }, "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" + "has-bigints": "^1.0.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", - "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", + "version": "1.1.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "has-tostringtag": "^1.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6278,8 +5314,6 @@ }, "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, "license": "MIT", "engines": { @@ -6291,8 +5325,6 @@ }, "node_modules/is-core-module": { "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "license": "MIT", "dependencies": { "hasown": "^2.0.2" @@ -6306,8 +5338,6 @@ }, "node_modules/is-data-view": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", "dev": true, "license": "MIT", "dependencies": { @@ -6322,8 +5352,6 @@ }, "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, "license": "MIT", "dependencies": { @@ -6338,8 +5366,6 @@ }, "node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", "peer": true, @@ -6355,8 +5381,6 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { @@ -6364,16 +5388,11 @@ } }, "node_modules/is-finalizationregistry": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", - "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6381,8 +5400,6 @@ }, "node_modules/is-generator-function": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dev": true, "license": "MIT", "dependencies": { @@ -6397,8 +5414,6 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { @@ -6410,8 +5425,6 @@ }, "node_modules/is-map": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { @@ -6423,8 +5436,6 @@ }, "node_modules/is-negative-zero": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "license": "MIT", "engines": { @@ -6436,8 +5447,6 @@ }, "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==", "dev": true, "license": "MIT", "engines": { @@ -6445,14 +5454,11 @@ } }, "node_modules/is-number-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", - "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6463,32 +5469,32 @@ }, "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, "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "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==", "dev": true, "license": "MIT" }, "node_modules/is-regex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", - "integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==", + "version": "1.1.4", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "gopd": "^1.1.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6499,8 +5505,6 @@ }, "node_modules/is-set": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { @@ -6512,8 +5516,6 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "license": "MIT", "dependencies": { @@ -6528,8 +5530,6 @@ }, "node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "license": "MIT", "engines": { @@ -6540,14 +5540,11 @@ } }, "node_modules/is-string": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", - "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", + "version": "1.0.7", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "has-tostringtag": "^1.0.2" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6557,15 +5554,11 @@ } }, "node_modules/is-symbol": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", - "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", + "version": "1.0.4", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "has-symbols": "^1.0.3", - "safe-regex-test": "^1.0.3" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6576,8 +5569,6 @@ }, "node_modules/is-typed-array": { "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "license": "MIT", "dependencies": { @@ -6592,8 +5583,6 @@ }, "node_modules/is-weakmap": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { @@ -6605,8 +5594,6 @@ }, "node_modules/is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6618,8 +5605,6 @@ }, "node_modules/is-weakset": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6635,8 +5620,6 @@ }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "peer": true, @@ -6649,22 +5632,16 @@ }, "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, "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, "license": "ISC" }, "node_modules/iterator.prototype": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", - "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6680,8 +5657,6 @@ }, "node_modules/jest-worker": { "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, "license": "MIT", "dependencies": { @@ -6693,10 +5668,16 @@ "node": ">= 10.13.0" } }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "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, "license": "MIT", "dependencies": { @@ -6711,8 +5692,6 @@ }, "node_modules/js-cookie": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", "license": "MIT", "engines": { "node": ">=14" @@ -6720,14 +5699,10 @@ }, "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==", "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -6738,8 +5713,6 @@ }, "node_modules/jsdoc-type-pratt-parser": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", - "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", "dev": true, "license": "MIT", "peer": true, @@ -6749,8 +5722,6 @@ }, "node_modules/jsdom": { "version": "24.1.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.1.3.tgz", - "integrity": "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6790,8 +5761,6 @@ }, "node_modules/jsesc": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -6802,35 +5771,25 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "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==", "license": "MIT" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -6839,10 +5798,19 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6857,8 +5825,6 @@ }, "node_modules/keyv": { "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { @@ -6867,8 +5833,6 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6881,29 +5845,21 @@ }, "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==", "license": "MIT" }, "node_modules/linkify-it": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" } }, "node_modules/linkifyjs": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.2.0.tgz", - "integrity": "sha512-pCj3PrQyATaoTYKHrgWRF3SJwsm61udVh+vuls/Rl6SptiDhgE7ziUIudAedRY9QEfynmM7/RmLEfPUyw1HPCw==", + "version": "4.1.3", "license": "MIT" }, "node_modules/loader-runner": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, "license": "MIT", "engines": { @@ -6911,14 +5867,12 @@ } }, "node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "version": "0.5.0", "dev": true, "license": "MIT", "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" }, "engines": { "node": ">=14" @@ -6929,8 +5883,6 @@ }, "node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { @@ -6945,8 +5897,6 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, "node_modules/lodash-es": { @@ -6957,15 +5907,11 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "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==", "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -6976,8 +5922,6 @@ }, "node_modules/loupe": { "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, "license": "MIT", "dependencies": { @@ -6986,8 +5930,6 @@ }, "node_modules/lower-case": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "license": "MIT", "dependencies": { "tslib": "^2.0.3" @@ -6995,8 +5937,6 @@ }, "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==", "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -7004,8 +5944,6 @@ }, "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, "license": "MIT", "bin": { @@ -7013,19 +5951,37 @@ } }, "node_modules/magic-string": { - "version": "0.30.14", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.14.tgz", - "integrity": "sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==", + "version": "0.30.12", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/markdown-it": { "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", "license": "MIT", "dependencies": { "argparse": "^2.0.1", @@ -7041,31 +5997,47 @@ }, "node_modules/mdurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", "license": "MIT" }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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, "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { "node": ">= 8" } }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/micromatch": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { @@ -7076,23 +6048,19 @@ "node": ">=8.6" } }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/mime": { + "version": "1.6.0", "dev": true, "license": "MIT", - "engines": { - "node": ">=8.6" + "bin": { + "mime": "cli.js" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=4" } }, "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==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -7100,8 +6068,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==", "license": "MIT", "dependencies": { "mime-db": "1.52.0" @@ -7112,8 +6078,6 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "license": "MIT", "engines": { @@ -7125,8 +6089,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, "license": "MIT", "engines": { @@ -7135,8 +6097,6 @@ }, "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, "license": "ISC", "dependencies": { @@ -7148,8 +6108,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", "funding": { @@ -7157,28 +6115,33 @@ } }, "node_modules/mlly": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz", - "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==", + "version": "1.7.2", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.12.1", "pathe": "^1.1.2", - "pkg-types": "^1.2.1", + "pkg-types": "^1.2.0", "ufo": "^1.5.4" } }, + "node_modules/mlly/node_modules/acorn": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, "node_modules/mui-color-input": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/mui-color-input/-/mui-color-input-4.0.2.tgz", - "integrity": "sha512-TXbdtgBqyeUFXmmT2PW4LZfr/j14J24wtjp0GhQxmskwRl7NF54UmBFs1/Qsx9jev3V67weAs0GyYUT+Nkw9Tg==", + "version": "4.0.1", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -7199,9 +6162,7 @@ } }, "node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "version": "3.3.7", "funding": [ { "type": "github", @@ -7218,22 +6179,24 @@ }, "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, "license": "MIT" }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, "license": "MIT" }, "node_modules/no-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "license": "MIT", "dependencies": { "lower-case": "^2.0.2", @@ -7242,14 +6205,10 @@ }, "node_modules/node-releases": { "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "license": "MIT" }, "node_modules/npm-run-path": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7264,8 +6223,6 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "license": "MIT", "engines": { @@ -7276,25 +6233,19 @@ } }, "node_modules/nwsapi": { - "version": "2.2.16", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.16.tgz", - "integrity": "sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==", + "version": "2.2.13", "dev": true, "license": "MIT" }, "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==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.2", "dev": true, "license": "MIT", "engines": { @@ -7306,8 +6257,6 @@ }, "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, "license": "MIT", "engines": { @@ -7316,8 +6265,6 @@ }, "node_modules/object.assign": { "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7335,8 +6282,6 @@ }, "node_modules/object.entries": { "version": "1.1.8", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", - "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7350,8 +6295,6 @@ }, "node_modules/object.fromentries": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7369,8 +6312,6 @@ }, "node_modules/object.values": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7385,10 +6326,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "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, "license": "ISC", "dependencies": { @@ -7397,8 +6347,6 @@ }, "node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7413,8 +6361,6 @@ }, "node_modules/open": { "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "license": "MIT", "peer": true, @@ -7432,8 +6378,6 @@ }, "node_modules/optionator": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { @@ -7450,14 +6394,10 @@ }, "node_modules/orderedmap": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", - "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", "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, "license": "MIT", "dependencies": { @@ -7472,8 +6412,6 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -7486,10 +6424,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -7500,8 +6444,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==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -7517,9 +6459,7 @@ } }, "node_modules/parse5": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", - "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", + "version": "7.2.0", "dev": true, "license": "MIT", "dependencies": { @@ -7529,10 +6469,16 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "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, "license": "MIT", "engines": { @@ -7541,8 +6487,6 @@ }, "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, "license": "MIT", "engines": { @@ -7551,8 +6495,6 @@ }, "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, "license": "MIT", "engines": { @@ -7561,14 +6503,15 @@ }, "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==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "dev": true, "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", "engines": { "node": ">=8" @@ -7576,15 +6519,11 @@ }, "node_modules/pathe": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true, "license": "MIT" }, "node_modules/pathval": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, "license": "MIT", "engines": { @@ -7593,52 +6532,101 @@ }, "node_modules/picocolors": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "2.3.1", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkg-types": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz", - "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", + "node_modules/pkg-dir": { + "version": "4.2.0", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.2", - "pathe": "^1.1.2" + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", "dev": true, "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/postcss": { - "version": "8.4.49", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", - "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.2", + "pathe": "^1.1.2" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", @@ -7652,7 +6640,7 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.1", + "picocolors": "^1.1.0", "source-map-js": "^1.2.1" }, "engines": { @@ -7661,8 +6649,6 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { @@ -7671,8 +6657,6 @@ }, "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, "license": "MIT", "dependencies": { @@ -7686,8 +6670,6 @@ }, "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, "license": "MIT", "engines": { @@ -7699,15 +6681,11 @@ }, "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, "license": "MIT" }, "node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "dev": true, "license": "MIT", "peer": true, @@ -7717,8 +6695,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==", "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -7728,20 +6704,14 @@ }, "node_modules/prop-types/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==", "license": "MIT" }, "node_modules/property-expr": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", - "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==", "license": "MIT" }, "node_modules/prosemirror-changeset": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.1.tgz", - "integrity": "sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==", "license": "MIT", "dependencies": { "prosemirror-transform": "^1.0.0" @@ -7749,17 +6719,13 @@ }, "node_modules/prosemirror-collab": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.1.tgz", - "integrity": "sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0" } }, "node_modules/prosemirror-commands": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.6.2.tgz", - "integrity": "sha512-0nDHH++qcf/BuPLYvmqZTUUsPJUCPBUXt0J1ErTcDIS369CTp773itzLGIgIXG4LJXOlwYCr44+Mh4ii6MP1QA==", + "version": "1.6.1", "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", @@ -7769,8 +6735,6 @@ }, "node_modules/prosemirror-dropcursor": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.1.tgz", - "integrity": "sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", @@ -7780,8 +6744,6 @@ }, "node_modules/prosemirror-gapcursor": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.2.tgz", - "integrity": "sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==", "license": "MIT", "dependencies": { "prosemirror-keymap": "^1.0.0", @@ -7792,8 +6754,6 @@ }, "node_modules/prosemirror-history": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.4.1.tgz", - "integrity": "sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.2.2", @@ -7804,8 +6764,6 @@ }, "node_modules/prosemirror-inputrules": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.4.0.tgz", - "integrity": "sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", @@ -7814,8 +6772,6 @@ }, "node_modules/prosemirror-keymap": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.2.tgz", - "integrity": "sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==", "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", @@ -7824,8 +6780,6 @@ }, "node_modules/prosemirror-markdown": { "version": "1.13.1", - "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.1.tgz", - "integrity": "sha512-Sl+oMfMtAjWtlcZoj/5L/Q39MpEnVZ840Xo330WJWUvgyhNmLBLN7MsHn07s53nG/KImevWHSE6fEj4q/GihHw==", "license": "MIT", "dependencies": { "@types/markdown-it": "^14.0.0", @@ -7835,8 +6789,6 @@ }, "node_modules/prosemirror-menu": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.4.tgz", - "integrity": "sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==", "license": "MIT", "dependencies": { "crelt": "^1.0.0", @@ -7846,9 +6798,7 @@ } }, "node_modules/prosemirror-model": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.24.0.tgz", - "integrity": "sha512-Ft7epNnycoQSM+2ObF35SBbBX+5WY39v8amVlrtlAcpglhlHs2tCTnWl7RX5tbp/PsMKcRcWV9cXPuoBWq0AIQ==", + "version": "1.23.0", "license": "MIT", "dependencies": { "orderedmap": "^2.0.0" @@ -7856,17 +6806,13 @@ }, "node_modules/prosemirror-schema-basic": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.3.tgz", - "integrity": "sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.19.0" } }, "node_modules/prosemirror-schema-list": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.0.tgz", - "integrity": "sha512-gg1tAfH1sqpECdhIHOA/aLg2VH3ROKBWQ4m8Qp9mBKrOxQRW61zc+gMCI8nh22gnBzd1t2u1/NPLmO3nAa3ssg==", + "version": "1.4.1", "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", @@ -7876,8 +6822,6 @@ }, "node_modules/prosemirror-state": { "version": "1.4.3", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", - "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", @@ -7886,9 +6830,7 @@ } }, "node_modules/prosemirror-tables": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.6.1.tgz", - "integrity": "sha512-p8WRJNA96jaNQjhJolmbxTzd6M4huRE5xQ8OxjvMhQUP0Nzpo4zz6TztEiwk6aoqGBhz9lxRWR1yRZLlpQN98w==", + "version": "1.5.0", "license": "MIT", "dependencies": { "prosemirror-keymap": "^1.1.2", @@ -7900,8 +6842,6 @@ }, "node_modules/prosemirror-trailing-node": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-3.0.0.tgz", - "integrity": "sha512-xiun5/3q0w5eRnGYfNlW1uU9W6x5MoFKWwq/0TIRgt09lv7Hcser2QYV8t4muXbEr+Fwo0geYn79Xs4GKywrRQ==", "license": "MIT", "dependencies": { "@remirror/core-constants": "3.0.0", @@ -7915,17 +6855,13 @@ }, "node_modules/prosemirror-transform": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.2.tgz", - "integrity": "sha512-2iUq0wv2iRoJO/zj5mv8uDUriOHWzXRnOTVgCzSXnktS/2iQRa3UUQwVlkBlYZFtygw6Nh1+X4mGqoYBINn5KQ==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.21.0" } }, "node_modules/prosemirror-view": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.37.0.tgz", - "integrity": "sha512-z2nkKI1sJzyi7T47Ji/ewBPuIma1RNvQCCYVdV+MqWBV7o4Sa1n94UJCJJ1aQRF/xRkFfyqLGlGFWitIcCOtbg==", + "version": "1.34.3", "license": "MIT", "dependencies": { "prosemirror-model": "^1.20.0", @@ -7933,29 +6869,29 @@ "prosemirror-transform": "^1.1.0" } }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, "node_modules/psl": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", - "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "version": "1.9.0", "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "funding": { - "url": "https://github.com/sponsors/lupomontero" - } + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { @@ -7964,24 +6900,32 @@ }, "node_modules/punycode.js": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", - "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", "license": "MIT", "engines": { "node": ">=6" } }, + "node_modules/qs": { + "version": "6.13.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "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", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true, "license": "MIT" }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -8001,18 +6945,36 @@ }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/react": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" @@ -8022,9 +6984,7 @@ } }, "node_modules/react-docgen": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-7.1.0.tgz", - "integrity": "sha512-APPU8HB2uZnpl6Vt/+0AFoVYgSRtfiP6FLrZgPPTDmqSb2R4qZRbgd0A3VzIFxDt5e+Fozjx79WjLWnF69DK8g==", + "version": "7.0.3", "dev": true, "license": "MIT", "dependencies": { @@ -8045,8 +7005,6 @@ }, "node_modules/react-docgen-typescript": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.2.2.tgz", - "integrity": "sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -8055,8 +7013,6 @@ }, "node_modules/react-dom": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", @@ -8067,13 +7023,11 @@ } }, "node_modules/react-dropzone": { - "version": "14.3.5", - "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.3.5.tgz", - "integrity": "sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ==", + "version": "14.2.9", "license": "MIT", "dependencies": { - "attr-accept": "^2.2.4", - "file-selector": "^2.1.0", + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", "prop-types": "^15.8.1" }, "engines": { @@ -8083,6 +7037,25 @@ "react": ">= 16.8 || 18.0.0" } }, + "node_modules/react-element-to-jsx-string": { + "version": "15.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "18.1.0" + }, + "peerDependencies": { + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/react-element-to-jsx-string/node_modules/react-is": { + "version": "18.1.0", + "dev": true, + "license": "MIT" + }, "node_modules/react-fast-compare": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", @@ -8090,9 +7063,7 @@ "license": "MIT" }, "node_modules/react-icons": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.4.0.tgz", - "integrity": "sha512-7eltJxgVt7X64oHh6wSWNwwbKTCtMfK35hcjvJS0yxEAhPM8oUKdS3+kqaW1vicIltw+kR2unHaa12S9pPALoQ==", + "version": "5.3.0", "license": "MIT", "peerDependencies": { "react": "*" @@ -8100,14 +7071,10 @@ }, "node_modules/react-is": { "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, "node_modules/react-redux": { "version": "9.1.2", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", - "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "license": "MIT", "dependencies": { "@types/use-sync-external-store": "^0.0.3", @@ -8129,17 +7096,13 @@ }, "node_modules/react-redux/node_modules/@types/use-sync-external-store": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==", "license": "MIT" }, "node_modules/react-router": { - "version": "6.28.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.0.tgz", - "integrity": "sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==", + "version": "6.27.0", "license": "MIT", "dependencies": { - "@remix-run/router": "1.21.0" + "@remix-run/router": "1.20.0" }, "engines": { "node": ">=14.0.0" @@ -8149,13 +7112,11 @@ } }, "node_modules/react-router-dom": { - "version": "6.28.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.0.tgz", - "integrity": "sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==", + "version": "6.27.0", "license": "MIT", "dependencies": { - "@remix-run/router": "1.21.0", - "react-router": "6.28.0" + "@remix-run/router": "1.20.0", + "react-router": "6.27.0" }, "engines": { "node": ">=14.0.0" @@ -8167,8 +7128,6 @@ }, "node_modules/react-transition-group": { "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", "license": "BSD-3-Clause", "dependencies": { "@babel/runtime": "^7.5.5", @@ -8183,8 +7142,6 @@ }, "node_modules/recast": { "version": "0.23.9", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.9.tgz", - "integrity": "sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==", "dev": true, "license": "MIT", "peer": true, @@ -8201,8 +7158,6 @@ }, "node_modules/recast/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==", "dev": true, "license": "BSD-3-Clause", "peer": true, @@ -8212,24 +7167,20 @@ }, "node_modules/redux": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT" }, "node_modules/reflect.getprototypeof": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", - "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", + "version": "1.0.6", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", + "es-abstract": "^1.23.1", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "which-builtin-type": "^1.1.4" + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" }, "engines": { "node": ">= 0.4" @@ -8240,14 +7191,10 @@ }, "node_modules/regenerator-runtime": { "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", "license": "MIT" }, "node_modules/regexp.prototype.flags": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8265,8 +7212,6 @@ }, "node_modules/requireindex": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", "dev": true, "license": "MIT", "engines": { @@ -8275,15 +7220,11 @@ }, "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==", "dev": true, "license": "MIT" }, "node_modules/resolve": { "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", @@ -8299,8 +7240,6 @@ }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "license": "MIT", "engines": { "node": ">=4" @@ -8308,8 +7247,6 @@ }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "license": "MIT", "engines": { @@ -8319,9 +7256,6 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", "dependencies": { @@ -8335,9 +7269,7 @@ } }, "node_modules/rollup": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz", - "integrity": "sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg==", + "version": "4.24.0", "license": "MIT", "dependencies": { "@types/estree": "1.0.6" @@ -8350,45 +7282,36 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.28.1", - "@rollup/rollup-android-arm64": "4.28.1", - "@rollup/rollup-darwin-arm64": "4.28.1", - "@rollup/rollup-darwin-x64": "4.28.1", - "@rollup/rollup-freebsd-arm64": "4.28.1", - "@rollup/rollup-freebsd-x64": "4.28.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.28.1", - "@rollup/rollup-linux-arm-musleabihf": "4.28.1", - "@rollup/rollup-linux-arm64-gnu": "4.28.1", - "@rollup/rollup-linux-arm64-musl": "4.28.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.28.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.28.1", - "@rollup/rollup-linux-riscv64-gnu": "4.28.1", - "@rollup/rollup-linux-s390x-gnu": "4.28.1", - "@rollup/rollup-linux-x64-gnu": "4.28.1", - "@rollup/rollup-linux-x64-musl": "4.28.1", - "@rollup/rollup-win32-arm64-msvc": "4.28.1", - "@rollup/rollup-win32-ia32-msvc": "4.28.1", - "@rollup/rollup-win32-x64-msvc": "4.28.1", + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", "fsevents": "~2.3.2" } }, "node_modules/rope-sequence": { "version": "1.3.4", - "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", - "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", "license": "MIT" }, "node_modules/rrweb-cssom": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz", - "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==", "dev": true, "license": "MIT" }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -8411,8 +7334,6 @@ }, "node_modules/rxjs": { "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -8421,8 +7342,6 @@ }, "node_modules/safe-array-concat": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "license": "MIT", "dependencies": { @@ -8440,8 +7359,6 @@ }, "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": [ { @@ -8461,8 +7378,6 @@ }, "node_modules/safe-regex-test": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "license": "MIT", "dependencies": { @@ -8479,25 +7394,20 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, "license": "MIT" }, "node_modules/sass-embedded": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.82.0.tgz", - "integrity": "sha512-v13sRVVZtWAQLpAGTz5D8hy+oyNKRHao5tKVc/P6AMqSP+jDM8X6GkEpL0jfbu3MaN2/hAQsd4Qx14GG1u0prQ==", + "version": "1.80.2", "devOptional": true, "license": "MIT", "dependencies": { "@bufbuild/protobuf": "^2.0.0", "buffer-builder": "^0.2.0", "colorjs.io": "^0.5.0", - "immutable": "^5.0.2", + "immutable": "^4.0.0", "rxjs": "^7.4.0", "supports-color": "^8.1.1", - "sync-child-process": "^1.0.2", "varint": "^6.0.0" }, "bin": { @@ -8507,428 +7417,178 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.82.0", - "sass-embedded-android-arm64": "1.82.0", - "sass-embedded-android-ia32": "1.82.0", - "sass-embedded-android-riscv64": "1.82.0", - "sass-embedded-android-x64": "1.82.0", - "sass-embedded-darwin-arm64": "1.82.0", - "sass-embedded-darwin-x64": "1.82.0", - "sass-embedded-linux-arm": "1.82.0", - "sass-embedded-linux-arm64": "1.82.0", - "sass-embedded-linux-ia32": "1.82.0", - "sass-embedded-linux-musl-arm": "1.82.0", - "sass-embedded-linux-musl-arm64": "1.82.0", - "sass-embedded-linux-musl-ia32": "1.82.0", - "sass-embedded-linux-musl-riscv64": "1.82.0", - "sass-embedded-linux-musl-x64": "1.82.0", - "sass-embedded-linux-riscv64": "1.82.0", - "sass-embedded-linux-x64": "1.82.0", - "sass-embedded-win32-arm64": "1.82.0", - "sass-embedded-win32-ia32": "1.82.0", - "sass-embedded-win32-x64": "1.82.0" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.82.0.tgz", - "integrity": "sha512-ttGMvWnA/5TYdZTjr5fWHDbb9nZgKipHKCc9zZQRF5HjUydOYWKNqmAJHQtbFWaq35kd5qn6yiE73IJN6eJ6wA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=14.0.0" + "sass-embedded-android-arm": "1.80.2", + "sass-embedded-android-arm64": "1.80.2", + "sass-embedded-android-ia32": "1.80.2", + "sass-embedded-android-riscv64": "1.80.2", + "sass-embedded-android-x64": "1.80.2", + "sass-embedded-darwin-arm64": "1.80.2", + "sass-embedded-darwin-x64": "1.80.2", + "sass-embedded-linux-arm": "1.80.2", + "sass-embedded-linux-arm64": "1.80.2", + "sass-embedded-linux-ia32": "1.80.2", + "sass-embedded-linux-musl-arm": "1.80.2", + "sass-embedded-linux-musl-arm64": "1.80.2", + "sass-embedded-linux-musl-ia32": "1.80.2", + "sass-embedded-linux-musl-riscv64": "1.80.2", + "sass-embedded-linux-musl-x64": "1.80.2", + "sass-embedded-linux-riscv64": "1.80.2", + "sass-embedded-linux-x64": "1.80.2", + "sass-embedded-win32-arm64": "1.80.2", + "sass-embedded-win32-ia32": "1.80.2", + "sass-embedded-win32-x64": "1.80.2" } }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.82.0.tgz", - "integrity": "sha512-bldHMs02QQWXsgHUZRgolNnZdMjN6XHvmUYoRkzmFq7lsvtLU6SJg2S1Wa9IZJs9jRWdTmOgA6YibSf3pROyFQ==", + "node_modules/sass-embedded-win32-x64": { + "version": "1.80.2", "cpu": [ - "arm64" + "x64" ], "license": "MIT", "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=14.0.0" } }, - "node_modules/sass-embedded-android-ia32": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.82.0.tgz", - "integrity": "sha512-FUJOnxw8IYKuYuxxiOkk6QXle8/yQFtKjnuSAJuZ5ZpLVMcSZzLc3SWOtuEXYx5iSAfJCO075o2ZoG/pPrJ9aw==", - "cpu": [ - "ia32" - ], + "node_modules/sass-embedded/node_modules/has-flag": { + "version": "4.0.0", + "devOptional": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=14.0.0" + "node": ">=8" } }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.82.0.tgz", - "integrity": "sha512-rd+vc+sxJxNnbhaubiIJmnb1b3FvC9wxCIq8spstopbO7o1uufvBBDeRoFSJaN+7oNhamzjlYGdu6aQoQNs3+A==", - "cpu": [ - "riscv64" - ], + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "devOptional": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=14.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/sass-embedded-android-x64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.82.0.tgz", - "integrity": "sha512-EVlybGTgJ8wNLyWj8RUatPXSnmIcvCsx3EfsRfBfhGihLbn4NNpavYO9QsvZzI2XWbJqHLBCd+CvkTcDw/TaSQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "node_modules/saxes": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, "engines": { - "node": ">=14.0.0" + "node": ">=v12.22.7" } }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.82.0.tgz", - "integrity": "sha512-LvdJPojjKlNGYOB0nSUR/ZtMDuAF4puspHlwK42aA/qK292bfSkMUKZPPapB2aSRwccc/ieBq5fI7n/WHrOCVw==", - "cpu": [ - "arm64" - ], + "node_modules/scheduler": { + "version": "0.23.2", "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "loose-envify": "^1.1.0" } }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.82.0.tgz", - "integrity": "sha512-6LfnD6YmG1aBfd3ReqMOJDb6Pg2Z/hmlJB7nU+Lb3E+hCNjAZAgeUHQxU/Pm1eIqJJTU/h4ib5QP0Pt9O8yVnw==", - "cpu": [ - "x64" - ], + "node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, "engines": { - "node": ">=14.0.0" + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" } }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.82.0.tgz", - "integrity": "sha512-ozjdC5rWzyi5Vo300I4tVZzneXOTQUiaxOr7DjtN26HuFaGAGCGmvThh2BRV4RvySg++5H9rdFu+VgyUQ5iukw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": ">=14.0.0" + "node": ">=10" } }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.82.0.tgz", - "integrity": "sha512-590/y0HJr/JiyxaqgR7Xf9P20BIhJ+zhB/afAnVuZe/4lEfCpTyM5xMe2+sKLsqtrVyzs9Zm/M4S4ASUOPCggA==", - "cpu": [ - "arm64" - ], + "node_modules/send": { + "version": "0.19.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.8.0" } }, - "node_modules/sass-embedded-linux-ia32": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.82.0.tgz", - "integrity": "sha512-hpc4acZ3UTjjJ3Q/GUXqQOCSml6AFKaku0HMawra9bKyRmOpxn8V5hqgXeOWVjK2oQzCmCnJvwKoQUP+S/SIYQ==", - "cpu": [ - "ia32" - ], + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" + "dependencies": { + "ms": "2.0.0" } }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.82.0.tgz", - "integrity": "sha512-R5PQmY/I+GSoMtfLo8GgHkvF/q6x6y8VNM7yu/Ac1mJj86n48VFi29W1HfY2496+Q6cpAq7toobDj7YfldIdVA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.82.0.tgz", - "integrity": "sha512-bc2MUSMv/jabnNGEyKP2jQAYZoEzTT/c633W6QoeSEWETGCuTNjaHvWWE6qSI6/UfRg1EpuV1LQA2jPMzZfv/w==", - "cpu": [ - "arm64" - ], + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], "engines": { - "node": ">=14.0.0" + "node": ">= 0.8" } }, - "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.82.0.tgz", - "integrity": "sha512-ZQKCFKm5TBcJ19UG6uUQmIKfVCJIWMb7e1a93lGeujSb9gyKF5Fb6MN3tuExoT7iFK8zU0Z9iyHqh93F58lcCw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.82.0.tgz", - "integrity": "sha512-5meSU8BHFeaT09RWfkuUrikRlC+WZcYb9To7MpfV1d9nlD7CZ2xydPExK+mj3DqRuQvTbvhMPcr7f+pHlgHINQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.82.0.tgz", - "integrity": "sha512-ASLAMfjWv7YEPBvEOVlb3zzHq8l4Y9Eh4x3m7B1dNauGVbO11Yng5cPCX/XbwGVf30BtE75pwqvV7oXxBtN15w==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.82.0.tgz", - "integrity": "sha512-qWvRDXCXH3GzD8OcP0ntd8gBTK3kZyUeyXmxQDZyEtMAM4STC2Tn7+5+2JYYHlppzqWnZPFBNESvpKeOtHaBBw==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.82.0.tgz", - "integrity": "sha512-AmRaHqShztwfep+M4NagdGaY7fTyWGSOM3k4Z/dd7q4nZclXbALLqNJtKx8xOM7A41LHYJ9zDpIBVRkrh0PzTA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.82.0.tgz", - "integrity": "sha512-zL9JDQZHXHSGAZe5DqSrR86wMHbm9QPziU4/3hoIG+99StuS74CuV42+hw/+FXXBkXMWbjKWsyF/HZt+I/wJuw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-ia32": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.82.0.tgz", - "integrity": "sha512-xE+AzLquCkFPnnpo0NHjQdLRIhG1bVs42xIKx42aUbVLYKkBDvbBGpw6EtTscRMyvcjoOqGH5saRvSFComUQcw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.82.0", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.82.0.tgz", - "integrity": "sha512-cEgfOQG5womOzzk16ReTv2dxPq5BG16LgLUold/LH9IZH86u4E/MN7Fspf4RWeEJ2EcLdew9QYSC2YWs1l98dQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded/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==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "node_modules/serialize-javascript": { + "version": "6.0.2", "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "loose-envify": "^1.1.0" + "randombytes": "^2.1.0" } }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "node_modules/serve-static": { + "version": "1.16.2", "dev": true, "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" }, "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" + "node": ">= 0.8.0" } }, "node_modules/set-function-length": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { @@ -8945,8 +7605,6 @@ }, "node_modules/set-function-name": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8959,10 +7617,13 @@ "node": ">= 0.4" } }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, "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, "license": "MIT", "dependencies": { @@ -8974,8 +7635,6 @@ }, "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, "license": "MIT", "engines": { @@ -8984,8 +7643,6 @@ }, "node_modules/side-channel": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "license": "MIT", "dependencies": { @@ -9003,15 +7660,11 @@ }, "node_modules/siginfo": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", "dev": true, "license": "ISC" }, "node_modules/signal-exit": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, "license": "ISC", "engines": { @@ -9023,8 +7676,6 @@ }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { @@ -9033,8 +7684,6 @@ }, "node_modules/snake-case": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "license": "MIT", "dependencies": { "dot-case": "^3.0.4", @@ -9043,8 +7692,6 @@ }, "node_modules/source-map": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -9052,8 +7699,6 @@ }, "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -9061,8 +7706,6 @@ }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "devOptional": true, "license": "MIT", "dependencies": { @@ -9072,8 +7715,6 @@ }, "node_modules/source-map-support/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, "license": "BSD-3-Clause", "engines": { @@ -9082,27 +7723,29 @@ }, "node_modules/stackback": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", "dev": true, "license": "MIT" }, + "node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", + "version": "3.7.0", "dev": true, "license": "MIT" }, "node_modules/storybook": { - "version": "8.4.7", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.4.7.tgz", - "integrity": "sha512-RP/nMJxiWyFc8EVMH5gp20ID032Wvk+Yr3lmKidoegto5Iy+2dVQnUoElZb2zpbVXNHWakGuAkfI0dY1Hfp/vw==", + "version": "8.3.6", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@storybook/core": "8.4.7" + "@storybook/core": "8.3.6" }, "bin": { "getstorybook": "bin/index.cjs", @@ -9112,20 +7755,10 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "prettier": "^2 || ^3" - }, - "peerDependenciesMeta": { - "prettier": { - "optional": true - } } }, "node_modules/string.prototype.matchall": { "version": "4.0.11", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", - "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", "dev": true, "license": "MIT", "dependencies": { @@ -9151,8 +7784,6 @@ }, "node_modules/string.prototype.repeat": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, "license": "MIT", "dependencies": { @@ -9162,8 +7793,6 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "license": "MIT", "dependencies": { @@ -9181,8 +7810,6 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9196,8 +7823,6 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { @@ -9214,8 +7839,6 @@ }, "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, "license": "MIT", "dependencies": { @@ -9227,8 +7850,6 @@ }, "node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { @@ -9237,8 +7858,6 @@ }, "node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "license": "MIT", "engines": { @@ -9250,8 +7869,6 @@ }, "node_modules/strip-indent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, "license": "MIT", "dependencies": { @@ -9266,8 +7883,6 @@ }, "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, "license": "MIT", "engines": { @@ -9278,48 +7893,37 @@ } }, "node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "version": "2.1.0", "dev": true, "license": "MIT", "dependencies": { - "js-tokens": "^9.0.1" + "js-tokens": "^9.0.0" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "version": "9.0.0", "dev": true, "license": "MIT" }, "node_modules/stylis": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", "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==", - "dev": true, + "version": "5.5.0", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "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==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -9330,44 +7934,15 @@ }, "node_modules/svg-parser": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", "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==", "dev": true, "license": "MIT" }, - "node_modules/sync-child-process": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", - "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "sync-message-port": "^1.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/sync-message-port": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", - "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, "license": "MIT", "engines": { @@ -9375,9 +7950,7 @@ } }, "node_modules/terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "version": "5.36.0", "devOptional": true, "license": "BSD-2-Clause", "dependencies": { @@ -9395,8 +7968,6 @@ }, "node_modules/terser-webpack-plugin": { "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "license": "MIT", "dependencies": { @@ -9428,23 +7999,28 @@ } } }, + "node_modules/terser/node_modules/acorn": { + "version": "8.13.0", + "devOptional": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, "license": "MIT" }, "node_modules/tiny-case": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", - "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==", "license": "MIT" }, "node_modules/tiny-invariant": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", "dev": true, "license": "MIT", "peer": true @@ -9457,15 +8033,11 @@ }, "node_modules/tinybench": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, "node_modules/tinypool": { "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", "dev": true, "license": "MIT", "engines": { @@ -9474,8 +8046,6 @@ }, "node_modules/tinyspy": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", "dev": true, "license": "MIT", "engines": { @@ -9484,17 +8054,20 @@ }, "node_modules/tippy.js": { "version": "6.3.7", - "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz", - "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==", "license": "MIT", "dependencies": { "@popperjs/core": "^2.9.0" } }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "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==", "dev": true, "license": "MIT", "dependencies": { @@ -9504,16 +8077,20 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, "node_modules/toposort": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", - "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==", "license": "MIT" }, "node_modules/tough-cookie": { "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -9526,10 +8103,16 @@ "node": ">=6" } }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", - "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "dev": true, "license": "MIT", "dependencies": { @@ -9541,8 +8124,6 @@ }, "node_modules/ts-dedent": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", "dev": true, "license": "MIT", "engines": { @@ -9551,8 +8132,6 @@ }, "node_modules/tsconfig-paths": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, "license": "MIT", "dependencies": { @@ -9565,15 +8144,11 @@ } }, "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "version": "2.8.0", "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", "dependencies": { @@ -9588,15 +8163,11 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { @@ -9608,8 +8179,6 @@ }, "node_modules/type-detect": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true, "license": "MIT", "engines": { @@ -9618,8 +8187,6 @@ }, "node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" @@ -9628,10 +8195,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "license": "MIT", "dependencies": { @@ -9645,8 +8222,6 @@ }, "node_modules/typed-array-byte-length": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "license": "MIT", "dependencies": { @@ -9664,9 +8239,7 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", - "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { @@ -9675,8 +8248,7 @@ "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "reflect.getprototypeof": "^1.0.6" + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -9686,18 +8258,16 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "version": "1.0.6", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", + "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "possible-typed-array-names": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9707,9 +8277,7 @@ } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.6.3", "devOptional": true, "license": "Apache-2.0", "peer": true, @@ -9723,21 +8291,15 @@ }, "node_modules/uc.micro": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", "license": "MIT" }, "node_modules/ufo": { "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", "dev": true, "license": "MIT" }, "node_modules/unbox-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, "license": "MIT", "dependencies": { @@ -9751,40 +8313,59 @@ } }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.19.8", "devOptional": true, "license": "MIT" }, "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==", + "version": "2.0.1", "dev": true, "license": "MIT", "engines": { - "node": ">= 4.0.0" + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" } }, "node_modules/unplugin": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.0.tgz", - "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==", + "version": "1.14.1", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.12.1", "webpack-virtual-modules": "^0.6.2" }, "engines": { "node": ">=14.0.0" + }, + "peerDependencies": { + "webpack-sources": "^3" + }, + "peerDependenciesMeta": { + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/unplugin/node_modules/acorn": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/update-browserslist-db": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -9807,514 +8388,165 @@ "bin": { "update-browserslist-db": "cli.js" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", - "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/vite": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", - "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", - "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-svgr": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/vite-plugin-svgr/-/vite-plugin-svgr-4.3.0.tgz", - "integrity": "sha512-Jy9qLB2/PyWklpYy0xk0UU3TlU0t2UMpJXZvf+hWII1lAmRHrOUKi11Uw8N3rxoNk7atZNYO3pR3vI1f7oi+6w==", - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.1.3", - "@svgr/core": "^8.1.0", - "@svgr/plugin-jsx": "^8.1.0" - }, - "peerDependencies": { - "vite": ">=2.6.0" - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], + "node_modules/use-sync-external-store": { + "version": "1.2.2", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], + "node_modules/util": { + "version": "0.12.5", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], "engines": { - "node": ">=12" + "node": ">= 0.4.0" } }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], + "node_modules/varint": { + "version": "6.0.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], "engines": { - "node": ">=12" + "node": ">= 0.8" } }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], + "node_modules/vite": { + "version": "5.4.10", "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, "engines": { - "node": ">=12" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], + "node_modules/vite-node": { + "version": "1.6.0", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, "engines": { - "node": ">=12" + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], + "node_modules/vite-plugin-svgr": { + "version": "4.2.0", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@rollup/pluginutils": "^5.0.5", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": "^2.6.0 || 3 || 4 || 5" } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -10329,8 +8561,6 @@ }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -10367,8 +8597,6 @@ }, "node_modules/vitest": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", - "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", "dev": true, "license": "MIT", "dependencies": { @@ -10431,16 +8659,34 @@ } } }, + "node_modules/vitest/node_modules/acorn": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/vitest/node_modules/acorn-walk": { + "version": "8.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/w3c-keyname": { "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, "license": "MIT", "dependencies": { @@ -10452,8 +8698,6 @@ }, "node_modules/watchpack": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "license": "MIT", "dependencies": { @@ -10466,14 +8710,10 @@ }, "node_modules/web-vitals": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==", "license": "Apache-2.0" }, "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==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -10481,19 +8721,17 @@ } }, "node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "version": "5.95.0", "dev": true, "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", @@ -10529,8 +8767,6 @@ }, "node_modules/webpack-sources": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, "license": "MIT", "engines": { @@ -10539,15 +8775,30 @@ }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", "dev": true, "license": "MIT" }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-attributes": { + "version": "1.9.5", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -10560,8 +8811,6 @@ }, "node_modules/webpack/node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, "license": "BSD-2-Clause", "engines": { @@ -10570,8 +8819,6 @@ }, "node_modules/whatwg-encoding": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", - "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10581,10 +8828,19 @@ "node": ">=18" } }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/whatwg-mimetype": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", - "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "license": "MIT", "engines": { @@ -10592,9 +8848,7 @@ } }, "node_modules/whatwg-url": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.1.0.tgz", - "integrity": "sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==", + "version": "14.0.0", "dev": true, "license": "MIT", "dependencies": { @@ -10607,8 +8861,6 @@ }, "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, "license": "ISC", "dependencies": { @@ -10622,38 +8874,30 @@ } }, "node_modules/which-boxed-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", - "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", + "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.0", - "is-number-object": "^1.1.0", - "is-string": "^1.1.0", - "is-symbol": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" + "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/which-builtin-type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", - "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "version": "1.1.4", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.1.0", + "is-finalizationregistry": "^1.0.2", "is-generator-function": "^1.0.10", "is-regex": "^1.1.4", "is-weakref": "^1.0.2", @@ -10671,8 +8915,6 @@ }, "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { @@ -10689,9 +8931,7 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.16", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", - "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", + "version": "1.1.15", "dev": true, "license": "MIT", "dependencies": { @@ -10710,8 +8950,6 @@ }, "node_modules/why-is-node-running": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { @@ -10727,8 +8965,6 @@ }, "node_modules/word-wrap": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { @@ -10737,15 +8973,11 @@ }, "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, "license": "ISC" }, "node_modules/ws": { "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", - "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "license": "MIT", "engines": { @@ -10766,8 +8998,6 @@ }, "node_modules/xml-name-validator": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "dev": true, "license": "Apache-2.0", "engines": { @@ -10776,21 +9006,15 @@ }, "node_modules/xmlchars": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true, "license": "MIT" }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "license": "ISC" }, "node_modules/yaml": { "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "license": "ISC", "engines": { "node": ">= 6" @@ -10798,8 +9022,6 @@ }, "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, "license": "MIT", "engines": { @@ -10810,9 +9032,7 @@ } }, "node_modules/yup": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yup/-/yup-1.5.0.tgz", - "integrity": "sha512-NJfBIHnp1QbqZwxcgl6irnDMIsb/7d1prNhFx02f1kp8h+orpi4xs3w90szNpOh68a/iHPdMsYvhZWoDmUvXBQ==", + "version": "1.4.0", "license": "MIT", "dependencies": { "property-expr": "^2.0.5", From ffc80ef3cba6f8f78787fb5972689a2ee51f9c79 Mon Sep 17 00:00:00 2001 From: tunckiral Date: Fri, 6 Dec 2024 13:35:36 -0500 Subject: [PATCH 100/178] update --- backend/package-lock.json | 251 +++++++++++++++++-------------------- frontend/package-lock.json | 1 + 2 files changed, 117 insertions(+), 135 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index da4ae7f2..178862c7 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -47,9 +47,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "license": "MIT", "engines": { @@ -185,18 +185,18 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "version": "22.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.1.0.tgz", + "integrity": "sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.13.0" } }, "node_modules/@types/validator": { - "version": "13.12.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.2.tgz", - "integrity": "sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==", "license": "MIT" }, "node_modules/abbrev": { @@ -231,12 +231,12 @@ } }, "node_modules/agent-base/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "ms": "2.1.2" }, "engines": { "node": ">=6.0" @@ -248,9 +248,9 @@ } }, "node_modules/agent-base/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, "node_modules/ansi-regex": { @@ -437,15 +437,16 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" + "set-function-length": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -454,19 +455,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.0.tgz", - "integrity": "sha512-CCKAP2tkPau7D3GE8+V8R6sQubA9R5foIzGp+85EXCVSCivuxBNAWqcpn72PKYiIcqoViv/kcUDpaEIMBVi1lQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -642,9 +630,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "license": "MIT", "dependencies": { @@ -731,9 +719,9 @@ } }, "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "license": "BSD-2-Clause", "engines": { "node": ">=12" @@ -908,9 +896,9 @@ } }, "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "license": "MIT", "engines": { @@ -960,9 +948,9 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "license": "MIT", "dependencies": { "accepts": "~1.3.8", @@ -984,7 +972,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -999,16 +987,12 @@ }, "engines": { "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/express-validator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.2.0.tgz", - "integrity": "sha512-I2ByKD8panjtr8Y05l21Wph9xk7kk64UMyvJCl/fFM/3CTJq8isXYPLeKW/aZBCdb/LYNv63PwhY8khw8VWocA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.1.0.tgz", + "integrity": "sha512-ePn6NXjHRZiZkwTiU1Rl2hy6aUqmi6Cb4/s8sfUsKH7j2yYl9azSpl8xEHcOj1grzzQ+UBEoLWtE1s6FDxW++g==", "license": "MIT", "dependencies": { "lodash": "^4.17.21", @@ -1262,12 +1246,12 @@ } }, "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1324,13 +1308,10 @@ } }, "node_modules/has-proto": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", - "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7" - }, "engines": { "node": ">= 0.4" }, @@ -1339,9 +1320,9 @@ } }, "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -1378,9 +1359,9 @@ } }, "node_modules/helmet": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.2.0.tgz", - "integrity": "sha512-ZRiwvN089JfMXokizgqEPXsl2Guk094yExfoDXR0cBYWxtBbaSww/w+vT4WEJsBW2iTUi1GgZ6swmoug3Oy4Xw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-7.1.0.tgz", + "integrity": "sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==", "license": "MIT", "engines": { "node": ">=16.0.0" @@ -1416,12 +1397,12 @@ } }, "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "ms": "2.1.2" }, "engines": { "node": ">=6.0" @@ -1433,9 +1414,9 @@ } }, "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, "node_modules/iconv-lite": { @@ -1513,9 +1494,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", + "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", "dev": true, "license": "MIT", "dependencies": { @@ -2023,9 +2004,9 @@ } }, "node_modules/moment-timezone": { - "version": "0.5.46", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", - "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", + "version": "0.5.45", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", + "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", "license": "MIT", "dependencies": { "moment": "^2.29.4" @@ -2089,18 +2070,18 @@ } }, "node_modules/nodemailer": { - "version": "6.9.16", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz", - "integrity": "sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==", + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.15.tgz", + "integrity": "sha512-AHf04ySLC6CIfuRtRiEYtGEXgRfa6INgWGluDhnxTZhHSKvrBu7lc1VVchQ0d8nPc4cFaZoPq8vkyNoZr0TpGQ==", "license": "MIT-0", "engines": { "node": ">=6.0.0" } }, "node_modules/nodemon": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", - "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", + "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2127,13 +2108,13 @@ } }, "node_modules/nodemon/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "ms": "2.1.2" }, "engines": { "node": ">=6.0" @@ -2145,9 +2126,9 @@ } }, "node_modules/nodemon/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true, "license": "MIT" }, @@ -2199,9 +2180,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -2232,9 +2213,9 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", "dev": true, "license": "BlueOak-1.0.0" }, @@ -2291,20 +2272,20 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "license": "MIT" }, "node_modules/pg": { - "version": "8.13.1", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", - "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", + "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.7.0", - "pg-pool": "^3.7.0", - "pg-protocol": "^1.7.0", + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -2331,9 +2312,9 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", - "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", + "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==", "license": "MIT" }, "node_modules/pg-int8": { @@ -2346,18 +2327,18 @@ } }, "node_modules/pg-pool": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", - "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", + "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", - "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==", "license": "MIT" }, "node_modules/pg-types": { @@ -2658,9 +2639,9 @@ "license": "MIT" }, "node_modules/sequelize": { - "version": "6.37.5", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.5.tgz", - "integrity": "sha512-10WA4poUb3XWnUROThqL2Apq9C2NhyV1xHPMZuybNMCucDsbbFuKg51jhmyvvAUyUqCiimwTZamc3AHhMoBr2Q==", + "version": "6.37.3", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.3.tgz", + "integrity": "sha512-V2FTqYpdZjPy3VQrZvjTPnOoLm0KudCRXfGWp48QwhyPPp2yW8z0p0sCYZd/em847Tl2dVxJJ1DR+hF+O77T7A==", "funding": [ { "type": "opencollective", @@ -2752,12 +2733,12 @@ } }, "node_modules/sequelize/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "license": "MIT", "dependencies": { - "ms": "^2.1.3" + "ms": "2.1.2" }, "engines": { "node": ">=6.0" @@ -2769,9 +2750,9 @@ } }, "node_modules/sequelize/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "license": "MIT" }, "node_modules/serve-static": { @@ -3125,9 +3106,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.13.0.tgz", + "integrity": "sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==", "license": "MIT" }, "node_modules/universalify": { diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 0fd965d3..2b703cf9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9043,3 +9043,4 @@ } } } + From 2017cd4eab8f6ad99a53d0df323bc4df4b4db6a5 Mon Sep 17 00:00:00 2001 From: erenfn <81182796+erenfn@users.noreply.github.com> Date: Fri, 6 Dec 2024 21:37:39 +0300 Subject: [PATCH 101/178] Update CONTRIBUTING.md --- CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d62110d7..638cdd2c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,6 +11,7 @@ All types of contributions are encouraged and valued. See the [Table of Contents > - Refer this project in your project's readme > - Mention the project at local meetups and tell your friends/colleagues + ## Table of Contents - [I Have a Question](#i-have-a-question) From 369a1a893d25a0e45df167f04113f64f979e3b67 Mon Sep 17 00:00:00 2001 From: erenfn <81182796+erenfn@users.noreply.github.com> Date: Fri, 6 Dec 2024 21:59:57 +0300 Subject: [PATCH 102/178] Update .env --- backend/.env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/.env b/backend/.env index 20aa10b7..f1ebcc98 100644 --- a/backend/.env +++ b/backend/.env @@ -5,7 +5,7 @@ NODE_ENV=development DEV_DB_USERNAME=user123 DEV_DB_PASSWORD=password123 DEV_DB_NAME=onboarding_db -DEV_DB_HOST=localhost +DEV_DB_HOST=db DEV_DB_PORT=5432 EMAIL_ENABLE=false @@ -17,4 +17,4 @@ TEST_DB_USERNAME=user123 TEST_DB_PASSWORD=password123 TEST_DB_NAME=onboarding_db TEST_DB_HOST=localhost -TEST_DB_PORT=5432 \ No newline at end of file +TEST_DB_PORT=5432 From 72d45931abc0abfe36c0890b8c6e7842d32f49a1 Mon Sep 17 00:00:00 2001 From: tunckiral Date: Fri, 6 Dec 2024 14:10:46 -0500 Subject: [PATCH 103/178] fix for triangle component --- backend/index.js | 2 +- frontend/src/scenes/settings/PasswordTab/PasswordTab.jsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/index.js b/backend/index.js index a7bd43c5..96224bc4 100644 --- a/backend/index.js +++ b/backend/index.js @@ -39,7 +39,7 @@ sequelize .catch((err) => console.log('Error: ' + err)); sequelize - .sync({ force: true }) + .sync({ force: false }) .then(() => console.log("Models synced with the database...")) .catch((err) => console.log("Error syncing models: " + err)); diff --git a/frontend/src/scenes/settings/PasswordTab/PasswordTab.jsx b/frontend/src/scenes/settings/PasswordTab/PasswordTab.jsx index 194b043f..6fa3c6b1 100644 --- a/frontend/src/scenes/settings/PasswordTab/PasswordTab.jsx +++ b/frontend/src/scenes/settings/PasswordTab/PasswordTab.jsx @@ -1,5 +1,5 @@ import React, { useState } from "react"; -import { LuTriangleAlert } from "react-icons/lu"; +import { LuAlertTriangle } from "react-icons/lu"; import styles from "./PasswordTab.module.css"; import CustomTextField from "@components/TextFieldComponents/CustomTextField/CustomTextField"; import Button from "@components/Button/Button"; @@ -70,7 +70,7 @@ const PasswordTab = () => {

- + New password must contain at least 8 characters and must have at least one uppercase letter, one number, and one symbol.

From 41c72886145d59bf73db8f81db5618cbfee3aa95 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 6 Dec 2024 11:12:26 -0800 Subject: [PATCH 104/178] chore: downgrade chai --- .github/workflows/node.js.yml | 2 +- backend/package-lock.json | 89 +++++++++++++++++++++++------------ backend/package.json | 4 +- 3 files changed, 63 insertions(+), 32 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 5202156a..5b114d4f 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -89,7 +89,7 @@ jobs: - name: Run tests for backend working-directory: ./backend - run: npm run test:unit + run: npm test - name: Run tests for frontend working-directory: ./frontend diff --git a/backend/package-lock.json b/backend/package-lock.json index 6d52cce0..2a74e769 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -24,7 +24,7 @@ "sequelize": "^6.37.3" }, "devDependencies": { - "chai": "^5.1.2", + "chai": "^4.5.0", "chai-http": "^5.1.1", "mocha": "^10.8.2", "nodemon": "^3.1.0", @@ -981,13 +981,13 @@ "license": "MIT" }, "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": "*" } }, "node_modules/asynckit": { @@ -1237,20 +1237,22 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, "license": "MIT", "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" }, "engines": { - "node": ">=12" + "node": ">=4" } }, "node_modules/chai-http": { @@ -1271,6 +1273,16 @@ "node": ">=18.20.0" } }, + "node_modules/chai/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1322,13 +1334,16 @@ } }, "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { - "node": ">= 16" + "node": "*" } }, "node_modules/chokidar": { @@ -1640,11 +1655,14 @@ } }, "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, "engines": { "node": ">=6" } @@ -2409,6 +2427,16 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -3474,11 +3502,14 @@ } }, "node_modules/loupe": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } }, "node_modules/lru-cache": { "version": "10.4.3", @@ -4397,13 +4428,13 @@ "license": "MIT" }, "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.16" + "node": "*" } }, "node_modules/pg": { diff --git a/backend/package.json b/backend/package.json index caec9ff7..6f319151 100644 --- a/backend/package.json +++ b/backend/package.json @@ -9,7 +9,7 @@ "posttest": "docker stop test-postgres && docker rm test-postgres", "test": "NODE_ENV=test nyc mocha --extension js,mjs --watch 'src/test/**/*.test.*'", "test:e2e": "npm run pretest && NODE_ENV=test mocha 'src/test/e2e/**/*.test.mjs'", - "test:unit": "NODE_ENV=test mocha 'src/test/unit/**/*.test.js' --watch", + "test:unit": "NODE_ENV=test mocha 'src/test/unit/**/*.test.js' --watch", "dev": "nodemon index.js", "prod": "NODE_ENV=production node index.js", "build": "echo 'No build script defined'" @@ -33,7 +33,7 @@ "sequelize": "^6.37.3" }, "devDependencies": { - "chai": "^5.1.2", + "chai": "^4.5.0", "chai-http": "^5.1.1", "mocha": "^10.8.2", "nodemon": "^3.1.0", From 2587ed4173fcc705abc075c63dabc2f1efe278dd Mon Sep 17 00:00:00 2001 From: tunckiral Date: Fri, 6 Dec 2024 14:36:05 -0500 Subject: [PATCH 105/178] changing node docker base version --- backend/Dockerfile | 2 +- frontend/Dockerfile | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index d17a4a51..3679a783 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22 +FROM node:22-alpine3.20 WORKDIR /app diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 3e0d24fc..f3badd6d 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,10 +1,11 @@ -FROM node:22 +FROM node:22-alpine3.20 WORKDIR /app COPY package*.json ./ -RUN npm install +RUN rm -rf package-lock.json && npm install +RUN npm install formik COPY . . From e265fee773c76b6648d15ad0cfe0f57f1ac1af70 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 6 Dec 2024 11:54:12 -0800 Subject: [PATCH 106/178] chore: remove front lock file --- backend/.DS_Store | Bin 0 -> 6148 bytes frontend/package-lock.json | 9045 ------------------------------------ test.css | 26 + 3 files changed, 26 insertions(+), 9045 deletions(-) create mode 100644 backend/.DS_Store delete mode 100644 frontend/package-lock.json create mode 100644 test.css diff --git a/backend/.DS_Store b/backend/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.25.7", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.25.8", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.25.8", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.8", - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.8", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.7", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.7", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.8", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.25.8" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.7", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.8", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@base2/pretty-print-object": { - "version": "1.0.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/@bufbuild/protobuf": { - "version": "2.2.0", - "devOptional": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" - }, - "node_modules/@ctrl/tinycolor": { - "version": "4.1.0", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.12.0", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.2.0", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.13.1", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.0", - "@emotion/weak-memoize": "^0.4.0", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "license": "MIT" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "license": "MIT" - }, - "node_modules/@emotion/react": { - "version": "11.13.3", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", - "@emotion/cache": "^11.13.0", - "@emotion/serialize": "^1.3.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0", - "@emotion/weak-memoize": "^0.4.0", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.1", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/@emotion/styled": { - "version": "11.13.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", - "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.0", - "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0" - }, - "peerDependencies": { - "@emotion/react": "^11.0.0-rc.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "license": "MIT" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.1.0", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.4.1", - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.11.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.8", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.8" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.11", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.8" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.8", - "license": "MIT" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^7.2.0", - "glob-promise": "^4.2.0", - "magic-string": "^0.27.0", - "react-docgen-typescript": "^2.2.2" - }, - "peerDependencies": { - "typescript": ">= 4.3.x", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": { - "version": "0.27.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.59", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@floating-ui/react-dom": "^2.1.1", - "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.4", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/core-downloads-tracker": { - "version": "6.1.5", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - } - }, - "node_modules/@mui/icons-material": { - "version": "6.1.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@mui/material": "^6.1.5", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/lab": { - "version": "6.0.0-beta.12", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/base": "5.0.0-beta.59", - "@mui/system": "^6.1.4", - "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.4", - "clsx": "^2.1.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material": "^6.1.4", - "@mui/material-pigment-css": "^6.1.4", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@mui/material-pigment-css": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/material": { - "version": "6.1.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/core-downloads-tracker": "^6.1.5", - "@mui/system": "^6.1.5", - "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.5", - "@popperjs/core": "^2.11.8", - "@types/react-transition-group": "^4.4.11", - "clsx": "^2.1.1", - "csstype": "^3.1.3", - "prop-types": "^15.8.1", - "react-is": "^18.3.1", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.1.5", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@mui/material-pigment-css": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/private-theming": { - "version": "6.1.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^6.1.5", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/styled-engine": { - "version": "6.1.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@emotion/cache": "^11.13.1", - "@emotion/serialize": "^1.3.2", - "@emotion/sheet": "^1.4.0", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.4.1", - "@emotion/styled": "^11.3.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, - "node_modules/@mui/system": { - "version": "6.1.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/private-theming": "^6.1.5", - "@mui/styled-engine": "^6.1.5", - "@mui/types": "^7.2.18", - "@mui/utils": "^6.1.5", - "clsx": "^2.1.1", - "csstype": "^3.1.3", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/types": { - "version": "7.2.18", - "license": "MIT", - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/utils": { - "version": "6.1.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/types": "^7.2.18", - "@types/prop-types": "^15.7.13", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-is": "^18.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@mui/x-date-pickers": { - "version": "7.21.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0", - "@mui/x-internals": "7.21.0", - "@types/react-transition-group": "^4.4.11", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14 || ^6.0.0", - "@mui/system": "^5.15.14 || ^6.0.0", - "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", - "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", - "dayjs": "^1.10.7", - "luxon": "^3.0.2", - "moment": "^2.29.4", - "moment-hijri": "^2.1.2", - "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "date-fns": { - "optional": true - }, - "date-fns-jalali": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "luxon": { - "optional": true - }, - "moment": { - "optional": true - }, - "moment-hijri": { - "optional": true - }, - "moment-jalaali": { - "optional": true - } - } - }, - "node_modules/@mui/x-date-pickers-pro": { - "version": "7.21.0", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0", - "@mui/x-date-pickers": "7.21.0", - "@mui/x-internals": "7.21.0", - "@mui/x-license": "7.21.0", - "clsx": "^2.1.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14 || ^6.0.0", - "@mui/system": "^5.15.14 || ^6.0.0", - "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", - "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", - "dayjs": "^1.10.7", - "luxon": "^3.0.2", - "moment": "^2.29.4", - "moment-hijri": "^2.1.2", - "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, - "date-fns": { - "optional": true - }, - "date-fns-jalali": { - "optional": true - }, - "dayjs": { - "optional": true - }, - "luxon": { - "optional": true - }, - "moment": { - "optional": true - }, - "moment-hijri": { - "optional": true - }, - "moment-jalaali": { - "optional": true - } - } - }, - "node_modules/@mui/x-internals": { - "version": "7.21.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0" - } - }, - "node_modules/@mui/x-license": { - "version": "7.21.0", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@remirror/core-constants": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/@remix-run/router": { - "version": "1.20.0", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.24.0", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/builder-vite": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/csf-plugin": "8.3.6", - "@types/find-cache-dir": "^3.2.1", - "browser-assert": "^1.2.1", - "es-module-lexer": "^1.5.0", - "express": "^4.19.2", - "find-cache-dir": "^3.0.0", - "fs-extra": "^11.1.0", - "magic-string": "^0.30.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@preact/preset-vite": "*", - "storybook": "^8.3.6", - "typescript": ">= 4.3.x", - "vite": "^4.0.0 || ^5.0.0", - "vite-plugin-glimmerx": "*" - }, - "peerDependenciesMeta": { - "@preact/preset-vite": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vite-plugin-glimmerx": { - "optional": true - } - } - }, - "node_modules/@storybook/components": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.6" - } - }, - "node_modules/@storybook/core": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@storybook/csf": "^0.1.11", - "@types/express": "^4.17.21", - "better-opn": "^3.0.2", - "browser-assert": "^1.2.1", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0", - "esbuild-register": "^3.5.0", - "express": "^4.19.2", - "jsdoc-type-pratt-parser": "^4.0.0", - "process": "^0.11.10", - "recast": "^0.23.5", - "semver": "^7.6.2", - "util": "^0.12.5", - "ws": "^8.2.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core/node_modules/@storybook/csf": { - "version": "0.1.11", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "type-fest": "^2.19.0" - } - }, - "node_modules/@storybook/csf": { - "version": "0.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15" - } - }, - "node_modules/@storybook/csf-plugin": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "unplugin": "^1.3.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.6" - } - }, - "node_modules/@storybook/global": { - "version": "5.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/manager-api": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.6" - } - }, - "node_modules/@storybook/preview-api": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.6" - } - }, - "node_modules/@storybook/react": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/components": "^8.3.6", - "@storybook/global": "^5.0.0", - "@storybook/manager-api": "^8.3.6", - "@storybook/preview-api": "^8.3.6", - "@storybook/react-dom-shim": "8.3.6", - "@storybook/theming": "^8.3.6", - "@types/escodegen": "^0.0.6", - "@types/estree": "^0.0.51", - "@types/node": "^22.0.0", - "acorn": "^7.4.1", - "acorn-jsx": "^5.3.1", - "acorn-walk": "^7.2.0", - "escodegen": "^2.1.0", - "html-tags": "^3.1.0", - "prop-types": "^15.7.2", - "react-element-to-jsx-string": "^15.0.0", - "semver": "^7.3.7", - "ts-dedent": "^2.0.0", - "type-fest": "~2.19", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@storybook/test": "8.3.6", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.3.6", - "typescript": ">= 4.2.x" - }, - "peerDependenciesMeta": { - "@storybook/test": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/@storybook/react-dom-shim": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.3.6" - } - }, - "node_modules/@storybook/react-vite": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@joshwooding/vite-plugin-react-docgen-typescript": "0.3.0", - "@rollup/pluginutils": "^5.0.2", - "@storybook/builder-vite": "8.3.6", - "@storybook/react": "8.3.6", - "find-up": "^5.0.0", - "magic-string": "^0.30.0", - "react-docgen": "^7.0.0", - "resolve": "^1.22.8", - "tsconfig-paths": "^4.2.0" - }, - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.3.6", - "vite": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/@storybook/react/node_modules/@types/estree": { - "version": "0.0.51", - "dev": true, - "license": "MIT" - }, - "node_modules/@storybook/theming": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "storybook": "^8.3.6" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.1.0", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/core/node_modules/cosmiconfig": { - "version": "8.3.6", - "license": "MIT", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.1.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@swc/core": { - "version": "1.7.36", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.13" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.7.36", - "@swc/core-darwin-x64": "1.7.36", - "@swc/core-linux-arm-gnueabihf": "1.7.36", - "@swc/core-linux-arm64-gnu": "1.7.36", - "@swc/core-linux-arm64-musl": "1.7.36", - "@swc/core-linux-x64-gnu": "1.7.36", - "@swc/core-linux-x64-musl": "1.7.36", - "@swc/core-win32-arm64-msvc": "1.7.36", - "@swc/core-win32-ia32-msvc": "1.7.36", - "@swc/core-win32-x64-msvc": "1.7.36" - }, - "peerDependencies": { - "@swc/helpers": "*" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.7.36", - "cpu": [ - "x64" - ], - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "license": "Apache-2.0" - }, - "node_modules/@swc/types": { - "version": "0.1.13", - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/dom/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react": { - "version": "15.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^10.0.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@testing-library/user-event": { - "version": "14.5.2", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz", - "integrity": "sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tiptap/core": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-blockquote": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-bold": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "tippy.js": "^6.3.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-bullet-list": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/extension-list-item": "^2.7.0", - "@tiptap/extension-text-style": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-code": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-code-block": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-document": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-dropcursor": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-floating-menu": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "tippy.js": "^6.3.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-gapcursor": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-hard-break": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-heading": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-history": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-italic": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-link": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "linkifyjs": "^4.1.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-list-item": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-ordered-list": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/extension-list-item": "^2.7.0", - "@tiptap/extension-text-style": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-paragraph": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-strike": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-text": { - "version": "2.8.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/extension-text-style": { - "version": "2.8.0", - "license": "MIT", - "peer": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0" - } - }, - "node_modules/@tiptap/pm": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "prosemirror-changeset": "^2.2.1", - "prosemirror-collab": "^1.3.1", - "prosemirror-commands": "^1.6.0", - "prosemirror-dropcursor": "^1.8.1", - "prosemirror-gapcursor": "^1.3.2", - "prosemirror-history": "^1.4.1", - "prosemirror-inputrules": "^1.4.0", - "prosemirror-keymap": "^1.2.2", - "prosemirror-markdown": "^1.13.0", - "prosemirror-menu": "^1.2.4", - "prosemirror-model": "^1.22.3", - "prosemirror-schema-basic": "^1.2.3", - "prosemirror-schema-list": "^1.4.1", - "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.4.0", - "prosemirror-trailing-node": "^3.0.0", - "prosemirror-transform": "^1.10.0", - "prosemirror-view": "^1.33.10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@tiptap/react": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "@tiptap/extension-bubble-menu": "^2.8.0", - "@tiptap/extension-floating-menu": "^2.8.0", - "@types/use-sync-external-store": "^0.0.6", - "fast-deep-equal": "^3", - "use-sync-external-store": "^1.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.7.0", - "@tiptap/pm": "^2.7.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - } - }, - "node_modules/@tiptap/starter-kit": { - "version": "2.8.0", - "license": "MIT", - "dependencies": { - "@tiptap/core": "^2.8.0", - "@tiptap/extension-blockquote": "^2.8.0", - "@tiptap/extension-bold": "^2.8.0", - "@tiptap/extension-bullet-list": "^2.8.0", - "@tiptap/extension-code": "^2.8.0", - "@tiptap/extension-code-block": "^2.8.0", - "@tiptap/extension-document": "^2.8.0", - "@tiptap/extension-dropcursor": "^2.8.0", - "@tiptap/extension-gapcursor": "^2.8.0", - "@tiptap/extension-hard-break": "^2.8.0", - "@tiptap/extension-heading": "^2.8.0", - "@tiptap/extension-history": "^2.8.0", - "@tiptap/extension-horizontal-rule": "^2.8.0", - "@tiptap/extension-italic": "^2.8.0", - "@tiptap/extension-list-item": "^2.8.0", - "@tiptap/extension-ordered-list": "^2.8.0", - "@tiptap/extension-paragraph": "^2.8.0", - "@tiptap/extension-strike": "^2.8.0", - "@tiptap/extension-text": "^2.8.0", - "@tiptap/pm": "^2.8.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "dev": true, - "license": "MIT", - "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.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/doctrine": { - "version": "0.0.9", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/escodegen": { - "version": "0.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "4.17.21", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/find-cache-dir": { - "version": "3.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "license": "MIT", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/linkify-it": { - "version": "5.0.0", - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "14.1.2", - "license": "MIT", - "dependencies": { - "@types/linkify-it": "^5", - "@types/mdurl": "^2" - } - }, - "node_modules/@types/mdurl": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "22.7.6", - "devOptional": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "license": "MIT" - }, - "node_modules/@types/prop-types": { - "version": "15.7.13", - "license": "MIT" - }, - "node_modules/@types/qs": { - "version": "6.9.16", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/react": { - "version": "18.3.11", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.11", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.20.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "0.17.4", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.6", - "license": "MIT" - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.7.1", - "license": "MIT", - "dependencies": { - "@swc/core": "^1.7.26" - }, - "peerDependencies": { - "vite": "^4 || ^5" - } - }, - "node_modules/@vitest/expect": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "1.6.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/snapshot/node_modules/pretty-format": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@vitest/spy": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@vitest/utils/node_modules/estree-walker": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/@vitest/utils/node_modules/pretty-format": { - "version": "29.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "1.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/array-includes": { - "version": "3.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlast": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/ast-types": { - "version": "0.16.1", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/attr-accept": { - "version": "2.2.4", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axios": { - "version": "1.7.7", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/better-opn": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "open": "^8.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.3", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-assert": { - "version": "1.2.1", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.24.0", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-builder": { - "version": "0.2.0", - "devOptional": true, - "license": "MIT/X11" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "devOptional": true, - "license": "MIT" - }, - "node_modules/bytes": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001669", - "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" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chai": { - "version": "4.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/classnames": { - "version": "2.5.1", - "license": "MIT" - }, - "node_modules/clsx": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/colorjs.io": { - "version": "0.5.2", - "devOptional": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "devOptional": true, - "license": "MIT" - }, - "node_modules/commondir": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.1.8", - "dev": true, - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/crelt": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssstyle": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "rrweb-cssom": "^0.7.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/data-urls": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "3.6.0", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debug": { - "version": "4.3.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "dev": true, - "license": "MIT" - }, - "node_modules/deep-eql": { - "version": "4.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "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", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "dev": true, - "license": "MIT" - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dompurify": { - "version": "3.1.7", - "license": "(MPL-2.0 OR Apache-2.0)" - }, - "node_modules/dot-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.41", - "license": "ISC" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3", - "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.4", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.3", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "dev": true, - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "dev": 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/esbuild": { - "version": "0.23.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "node_modules/esbuild-register": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint": { - "version": "8.57.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.1", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.19", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "object.values": "^1.2.0", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.11", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.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/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-storybook": { - "version": "0.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@storybook/csf": "^0.0.1", - "@typescript-eslint/utils": "^5.62.0", - "requireindex": "^1.2.0", - "ts-dedent": "^2.2.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "eslint": ">=6" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "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/eslint/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "8.13.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/express": { - "version": "4.21.1", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.17.1", - "dev": true, - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-selector": { - "version": "0.6.0", - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/form-data": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/formik": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.6.tgz", - "integrity": "sha512-A+2EI7U7aG296q2TLGvNapDNTZp1khVt5Vk0Q/fyfSROss0V/V6+txt2aJnwEos44IxTCW/LYAi/zgWzlevj+g==", - "funding": [ - { - "type": "individual", - "url": "https://opencollective.com/formik" - } - ], - "license": "Apache-2.0", - "dependencies": { - "@types/hoist-non-react-statics": "^3.3.1", - "deepmerge": "^2.1.1", - "hoist-non-react-statics": "^3.3.0", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "react-fast-compare": "^2.0.1", - "tiny-warning": "^1.0.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "8.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "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/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-promise": { - "version": "4.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/glob": "^7.1.3" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/ahmadnassri" - }, - "peerDependencies": { - "glob": "^7.1.6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/globals": { - "version": "11.12.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/html-encoding-sniffer": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^3.1.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/html-tags": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "5.0.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.3.7", - "devOptional": true, - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "dev": true, - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "peer": 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.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "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.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "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.13", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-cookie": { - "version": "3.0.5", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdom": { - "version": "24.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "cssstyle": "^4.0.1", - "data-urls": "^5.0.0", - "decimal.js": "^10.4.3", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^4.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.5", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.12", - "parse5": "^7.1.2", - "rrweb-cssom": "^0.7.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.4", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^3.1.1", - "whatwg-mimetype": "^4.0.0", - "whatwg-url": "^14.0.0", - "ws": "^8.18.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "canvas": "^2.11.2" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsesc": { - "version": "3.0.2", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "node_modules/linkify-it": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/linkifyjs": { - "version": "4.1.3", - "license": "MIT" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/local-pkg": { - "version": "0.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.12", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/markdown-it": { - "version": "14.1.0", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/mdurl": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mlly": { - "version": "1.7.2", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.12.1", - "pathe": "^1.1.2", - "pkg-types": "^1.2.0", - "ufo": "^1.5.4" - } - }, - "node_modules/mlly/node_modules/acorn": { - "version": "8.13.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "license": "MIT" - }, - "node_modules/mui-color-input": { - "version": "4.0.1", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@ctrl/tinycolor": "^4.1.0" - }, - "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@mui/material": "^5.0.0 || ^6.0.0", - "@types/react": "^18.0.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/no-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-releases": { - "version": "2.0.18", - "license": "MIT" - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nwsapi": { - "version": "2.2.13", - "dev": true, - "license": "MIT" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/orderedmap": { - "version": "2.1.1", - "license": "MIT" - }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "@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": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^4.5.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "0.1.10", - "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-types": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.2", - "pathe": "^1.1.2" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.47", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "dev": true, - "license": "MIT", - "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", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "17.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/process": { - "version": "0.11.10", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/property-expr": { - "version": "2.0.6", - "license": "MIT" - }, - "node_modules/prosemirror-changeset": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-collab": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-commands": { - "version": "1.6.1", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.10.2" - } - }, - "node_modules/prosemirror-dropcursor": { - "version": "1.8.1", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "node_modules/prosemirror-gapcursor": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "node_modules/prosemirror-history": { - "version": "1.4.1", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.31.0", - "rope-sequence": "^1.3.0" - } - }, - "node_modules/prosemirror-inputrules": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-keymap": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } - }, - "node_modules/prosemirror-markdown": { - "version": "1.13.1", - "license": "MIT", - "dependencies": { - "@types/markdown-it": "^14.0.0", - "markdown-it": "^14.0.0", - "prosemirror-model": "^1.20.0" - } - }, - "node_modules/prosemirror-menu": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "crelt": "^1.0.0", - "prosemirror-commands": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-model": { - "version": "1.23.0", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-schema-basic": { - "version": "1.2.3", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.19.0" - } - }, - "node_modules/prosemirror-schema-list": { - "version": "1.4.1", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.7.3" - } - }, - "node_modules/prosemirror-state": { - "version": "1.4.3", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.27.0" - } - }, - "node_modules/prosemirror-tables": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "prosemirror-keymap": "^1.1.2", - "prosemirror-model": "^1.8.1", - "prosemirror-state": "^1.3.1", - "prosemirror-transform": "^1.2.1", - "prosemirror-view": "^1.13.3" - } - }, - "node_modules/prosemirror-trailing-node": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "@remirror/core-constants": "3.0.0", - "escape-string-regexp": "^4.0.0" - }, - "peerDependencies": { - "prosemirror-model": "^1.22.1", - "prosemirror-state": "^1.4.2", - "prosemirror-view": "^1.33.8" - } - }, - "node_modules/prosemirror-transform": { - "version": "1.10.2", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.21.0" - } - }, - "node_modules/prosemirror-view": { - "version": "1.34.3", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.20.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/psl": { - "version": "1.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/punycode.js": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "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" - } - ], - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react": { - "version": "18.3.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-docgen": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.18.9", - "@babel/traverse": "^7.18.9", - "@babel/types": "^7.18.9", - "@types/babel__core": "^7.18.0", - "@types/babel__traverse": "^7.18.0", - "@types/doctrine": "^0.0.9", - "@types/resolve": "^1.20.2", - "doctrine": "^3.0.0", - "resolve": "^1.22.1", - "strip-indent": "^4.0.0" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/react-docgen-typescript": { - "version": "2.2.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "typescript": ">= 4.3.x" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-dropzone": { - "version": "14.2.9", - "license": "MIT", - "dependencies": { - "attr-accept": "^2.2.2", - "file-selector": "^0.6.0", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "react": ">= 16.8 || 18.0.0" - } - }, - "node_modules/react-element-to-jsx-string": { - "version": "15.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@base2/pretty-print-object": "1.0.1", - "is-plain-object": "5.0.0", - "react-is": "18.1.0" - }, - "peerDependencies": { - "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", - "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" - } - }, - "node_modules/react-element-to-jsx-string/node_modules/react-is": { - "version": "18.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/react-fast-compare": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", - "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==", - "license": "MIT" - }, - "node_modules/react-icons": { - "version": "5.3.0", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "license": "MIT" - }, - "node_modules/react-redux": { - "version": "9.1.2", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.3", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25", - "react": "^18.0", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-redux/node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/react-router": { - "version": "6.27.0", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.20.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.27.0", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.20.0", - "react-router": "6.27.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/recast": { - "version": "0.23.9", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ast-types": "^0.16.1", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tiny-invariant": "^1.3.3", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/recast/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/redux": { - "version": "5.0.1", - "license": "MIT" - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/requireindex": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.5" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/resolve": { - "version": "1.22.8", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.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/resolve-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "4.24.0", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.24.0", - "@rollup/rollup-android-arm64": "4.24.0", - "@rollup/rollup-darwin-arm64": "4.24.0", - "@rollup/rollup-darwin-x64": "4.24.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", - "@rollup/rollup-linux-arm-musleabihf": "4.24.0", - "@rollup/rollup-linux-arm64-gnu": "4.24.0", - "@rollup/rollup-linux-arm64-musl": "4.24.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", - "@rollup/rollup-linux-riscv64-gnu": "4.24.0", - "@rollup/rollup-linux-s390x-gnu": "4.24.0", - "@rollup/rollup-linux-x64-gnu": "4.24.0", - "@rollup/rollup-linux-x64-musl": "4.24.0", - "@rollup/rollup-win32-arm64-msvc": "4.24.0", - "@rollup/rollup-win32-ia32-msvc": "4.24.0", - "@rollup/rollup-win32-x64-msvc": "4.24.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/rope-sequence": { - "version": "1.3.4", - "license": "MIT" - }, - "node_modules/rrweb-cssom": { - "version": "0.7.1", - "dev": true, - "license": "MIT" - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "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" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.1", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "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" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/sass-embedded": { - "version": "1.80.2", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@bufbuild/protobuf": "^2.0.0", - "buffer-builder": "^0.2.0", - "colorjs.io": "^0.5.0", - "immutable": "^4.0.0", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=16.0.0" - }, - "optionalDependencies": { - "sass-embedded-android-arm": "1.80.2", - "sass-embedded-android-arm64": "1.80.2", - "sass-embedded-android-ia32": "1.80.2", - "sass-embedded-android-riscv64": "1.80.2", - "sass-embedded-android-x64": "1.80.2", - "sass-embedded-darwin-arm64": "1.80.2", - "sass-embedded-darwin-x64": "1.80.2", - "sass-embedded-linux-arm": "1.80.2", - "sass-embedded-linux-arm64": "1.80.2", - "sass-embedded-linux-ia32": "1.80.2", - "sass-embedded-linux-musl-arm": "1.80.2", - "sass-embedded-linux-musl-arm64": "1.80.2", - "sass-embedded-linux-musl-ia32": "1.80.2", - "sass-embedded-linux-musl-riscv64": "1.80.2", - "sass-embedded-linux-musl-x64": "1.80.2", - "sass-embedded-linux-riscv64": "1.80.2", - "sass-embedded-linux-x64": "1.80.2", - "sass-embedded-win32-arm64": "1.80.2", - "sass-embedded-win32-ia32": "1.80.2", - "sass-embedded-win32-x64": "1.80.2" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.80.2", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded/node_modules/has-flag": { - "version": "4.0.0", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/sass-embedded/node_modules/supports-color": { - "version": "8.1.1", - "devOptional": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.23.2", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "devOptional": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.7.0", - "dev": true, - "license": "MIT" - }, - "node_modules/storybook": { - "version": "8.3.6", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@storybook/core": "8.3.6" - }, - "bin": { - "getstorybook": "bin/index.cjs", - "sb": "bin/index.cjs", - "storybook": "bin/index.cjs" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.repeat": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-indent": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/stylis": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "license": "MIT" - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.36.0", - "devOptional": true, - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser/node_modules/acorn": { - "version": "8.13.0", - "devOptional": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/tiny-case": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/tinypool": { - "version": "0.8.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tippy.js": { - "version": "6.3.7", - "license": "MIT", - "dependencies": { - "@popperjs/core": "^2.9.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toposort": { - "version": "2.0.2", - "license": "MIT" - }, - "node_modules/tough-cookie": { - "version": "4.1.4", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.10" - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.8.0", - "license": "0BSD" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "dev": true, - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "2.19.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.6.3", - "devOptional": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uc.micro": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/ufo": { - "version": "1.5.4", - "dev": true, - "license": "MIT" - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "6.19.8", - "devOptional": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unplugin": { - "version": "1.14.1", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.12.1", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "webpack-sources": "^3" - }, - "peerDependenciesMeta": { - "webpack-sources": { - "optional": true - } - } - }, - "node_modules/unplugin/node_modules/acorn": { - "version": "8.13.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "dev": true, - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/varint": { - "version": "6.0.0", - "devOptional": true, - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "5.4.10", - "license": "MIT", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-svgr": { - "version": "4.2.0", - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.5", - "@svgr/core": "^8.1.0", - "@svgr/plugin-jsx": "^8.1.0" - }, - "peerDependencies": { - "vite": "^2.6.0 || 3 || 4 || 5" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vitest": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.0", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.0", - "@vitest/ui": "1.6.0", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/acorn": { - "version": "8.13.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/vitest/node_modules/acorn-walk": { - "version": "8.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "license": "MIT" - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/watchpack": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/web-vitals": { - "version": "2.1.4", - "license": "Apache-2.0" - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/webpack": { - "version": "5.95.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.13.0", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/acorn-import-attributes": { - "version": "1.9.5", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/whatwg-url": { - "version": "14.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "^5.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/which": { - "version": "2.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "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/which-builtin-type": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.18.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/yallist": { - "version": "3.1.1", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yup": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "property-expr": "^2.0.5", - "tiny-case": "^1.0.3", - "toposort": "^2.0.2", - "type-fest": "^2.19.0" - } - } - } -} diff --git a/test.css b/test.css new file mode 100644 index 00000000..67cb1abd --- /dev/null +++ b/test.css @@ -0,0 +1,26 @@ +.snowflake { + position: absolute; + top: -10px; + user-select: none; + pointer-events: none; + animation: fall linear infinite; + z-index: 4; +} + +@keyframes fall { + 0% { + transform: translate(-12px, -10px); + } + 25% { + transform: translateX(0); + } + 50% { + transform: translateX(12px); + } + 75% { + transform: translateX(0px); + } + 100% { + transform: translate(-12px, 100vh); + } +} From be7ed0d7e5c2622907164fbfaea3e1d365776eca Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 6 Dec 2024 11:55:35 -0800 Subject: [PATCH 107/178] chore: add new lock file for front end --- frontend/package-lock.json | 8962 ++++++++++++++++++++++++++++++++++++ 1 file changed, 8962 insertions(+) create mode 100644 frontend/package-lock.json diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 00000000..2347cb61 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,8962 @@ +{ + "name": "frontend", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.1.0", + "dependencies": { + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", + "@mui/icons-material": "^6.1.5", + "@mui/lab": "^6.0.0-beta.11", + "@mui/material": "^6.1.5", + "@mui/x-date-pickers": "^7.3.1", + "@mui/x-date-pickers-pro": "^7.3.1", + "@tiptap/core": "^2.6.6", + "@tiptap/extension-bullet-list": "^2.6.6", + "@tiptap/extension-heading": "^2.6.6", + "@tiptap/extension-link": "^2.6.6", + "@tiptap/extension-ordered-list": "^2.6.6", + "@tiptap/react": "^2.6.6", + "@tiptap/starter-kit": "^2.6.6", + "@vitejs/plugin-react-swc": "^3.7.1", + "axios": "^1.6.8", + "classnames": "^2.5.1", + "date-fns": "^3.6.0", + "dompurify": "^3.1.6", + "formik": "^2.4.6", + "js-cookie": "^3.0.5", + "mui-color-input": "^4.0.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-dropzone": "^14.2.9", + "react-icons": "^5.3.0", + "react-redux": "^9.1.2", + "react-router": "^6.27.0", + "react-router-dom": "^6.27.0", + "redux": "^5.0.1", + "vite-plugin-svgr": "^4.2.0", + "web-vitals": "^2.1.4", + "yup": "^1.4.0" + }, + "devDependencies": { + "@storybook/react-vite": "^8.3.6", + "@testing-library/react": "^15.0.7", + "@testing-library/user-event": "^14.5.2", + "eslint": "^8.57.0", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-storybook": "^0.8.0", + "jsdom": "^24.0.0", + "prop-types": "^15.8.1", + "sass-embedded": "^1.79.4", + "vite": "^5.4.10", + "vitest": "^1.6.0", + "webpack": "^5.93.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.25.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.8", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.8", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.8", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-simple-access": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "@babel/traverse": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.8", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.7", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/types": "^7.25.7", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.8", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@base2/pretty-print-object": { + "version": "1.0.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.2.0", + "devOptional": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.12.0", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.13.1", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.13.3", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.13.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.1.0", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.8", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.11", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.8" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.2", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.8", + "license": "MIT" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.2.0", + "glob-promise": "^4.2.0", + "magic-string": "^0.27.0", + "react-docgen-typescript": "^2.2.2" + }, + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": { + "version": "0.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.59", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@floating-ui/react-dom": "^2.1.1", + "@mui/types": "^7.2.18", + "@mui/utils": "^6.1.4", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "6.1.5", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "6.1.5", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^6.1.5", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab": { + "version": "6.0.0-beta.12", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/base": "5.0.0-beta.59", + "@mui/system": "^6.1.4", + "@mui/types": "^7.2.18", + "@mui/utils": "^6.1.4", + "clsx": "^2.1.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": "^6.1.4", + "@mui/material-pigment-css": "^6.1.4", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "6.1.5", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/core-downloads-tracker": "^6.1.5", + "@mui/system": "^6.1.5", + "@mui/types": "^7.2.18", + "@mui/utils": "^6.1.5", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^6.1.5", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming": { + "version": "6.1.5", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^6.1.5", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "6.1.5", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@emotion/cache": "^11.13.1", + "@emotion/serialize": "^1.3.2", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "6.1.5", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/private-theming": "^6.1.5", + "@mui/styled-engine": "^6.1.5", + "@mui/types": "^7.2.18", + "@mui/utils": "^6.1.5", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.18", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "6.1.5", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/types": "^7.2.18", + "@types/prop-types": "^15.7.13", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0", + "@mui/x-internals": "7.21.0", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.15.14 || ^6.0.0", + "@mui/system": "^5.15.14 || ^6.0.0", + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", + "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers-pro": { + "version": "7.21.0", + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0", + "@mui/x-date-pickers": "7.21.0", + "@mui/x-internals": "7.21.0", + "@mui/x-license": "7.21.0", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.15.14 || ^6.0.0", + "@mui/system": "^5.15.14 || ^6.0.0", + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", + "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals": { + "version": "7.21.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/x-license": { + "version": "7.21.0", + "license": "SEE LICENSE IN LICENSE", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remirror/core-constants": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/@remix-run/router": { + "version": "1.20.0", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/builder-vite": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf-plugin": "8.3.6", + "@types/find-cache-dir": "^3.2.1", + "browser-assert": "^1.2.1", + "es-module-lexer": "^1.5.0", + "express": "^4.19.2", + "find-cache-dir": "^3.0.0", + "fs-extra": "^11.1.0", + "magic-string": "^0.30.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@preact/preset-vite": "*", + "storybook": "^8.3.6", + "typescript": ">= 4.3.x", + "vite": "^4.0.0 || ^5.0.0", + "vite-plugin-glimmerx": "*" + }, + "peerDependenciesMeta": { + "@preact/preset-vite": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vite-plugin-glimmerx": { + "optional": true + } + } + }, + "node_modules/@storybook/components": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" + } + }, + "node_modules/@storybook/core": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@storybook/csf": "^0.1.11", + "@types/express": "^4.17.21", + "better-opn": "^3.0.2", + "browser-assert": "^1.2.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0", + "esbuild-register": "^3.5.0", + "express": "^4.19.2", + "jsdoc-type-pratt-parser": "^4.0.0", + "process": "^0.11.10", + "recast": "^0.23.5", + "semver": "^7.6.2", + "util": "^0.12.5", + "ws": "^8.2.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core/node_modules/@storybook/csf": { + "version": "0.1.11", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "type-fest": "^2.19.0" + } + }, + "node_modules/@storybook/csf": { + "version": "0.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "unplugin": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/manager-api": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" + } + }, + "node_modules/@storybook/preview-api": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" + } + }, + "node_modules/@storybook/react": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/components": "^8.3.6", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "^8.3.6", + "@storybook/preview-api": "^8.3.6", + "@storybook/react-dom-shim": "8.3.6", + "@storybook/theming": "^8.3.6", + "@types/escodegen": "^0.0.6", + "@types/estree": "^0.0.51", + "@types/node": "^22.0.0", + "acorn": "^7.4.1", + "acorn-jsx": "^5.3.1", + "acorn-walk": "^7.2.0", + "escodegen": "^2.1.0", + "html-tags": "^3.1.0", + "prop-types": "^15.7.2", + "react-element-to-jsx-string": "^15.0.0", + "semver": "^7.3.7", + "ts-dedent": "^2.0.0", + "type-fest": "~2.19", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@storybook/test": "8.3.6", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.6", + "typescript": ">= 4.2.x" + }, + "peerDependenciesMeta": { + "@storybook/test": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/react-dom-shim": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.6" + } + }, + "node_modules/@storybook/react-vite": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@joshwooding/vite-plugin-react-docgen-typescript": "0.3.0", + "@rollup/pluginutils": "^5.0.2", + "@storybook/builder-vite": "8.3.6", + "@storybook/react": "8.3.6", + "find-up": "^5.0.0", + "magic-string": "^0.30.0", + "react-docgen": "^7.0.0", + "resolve": "^1.22.8", + "tsconfig-paths": "^4.2.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.3.6", + "vite": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/@storybook/react/node_modules/@types/estree": { + "version": "0.0.51", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/theming": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.3.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "8.3.6", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@swc/core": { + "version": "1.7.36", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.13" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.7.36", + "@swc/core-darwin-x64": "1.7.36", + "@swc/core-linux-arm-gnueabihf": "1.7.36", + "@swc/core-linux-arm64-gnu": "1.7.36", + "@swc/core-linux-arm64-musl": "1.7.36", + "@swc/core-linux-x64-gnu": "1.7.36", + "@swc/core-linux-x64-musl": "1.7.36", + "@swc/core-win32-arm64-msvc": "1.7.36", + "@swc/core-win32-ia32-msvc": "1.7.36", + "@swc/core-win32-x64-msvc": "1.7.36" + }, + "peerDependencies": { + "@swc/helpers": "*" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.13", + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "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/dom/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/dom/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/dom/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "15.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^10.0.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tiptap/core": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-blockquote": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bold": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-bullet-list": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/extension-list-item": "^2.7.0", + "@tiptap/extension-text-style": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-code": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-code-block": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-dropcursor": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-gapcursor": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-heading": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-history": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-italic": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-link": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "linkifyjs": "^4.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-list-item": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-ordered-list": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/extension-list-item": "^2.7.0", + "@tiptap/extension-text-style": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-strike": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "2.8.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/extension-text-style": { + "version": "2.8.0", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0" + } + }, + "node_modules/@tiptap/pm": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "prosemirror-changeset": "^2.2.1", + "prosemirror-collab": "^1.3.1", + "prosemirror-commands": "^1.6.0", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-markdown": "^1.13.0", + "prosemirror-menu": "^1.2.4", + "prosemirror-model": "^1.22.3", + "prosemirror-schema-basic": "^1.2.3", + "prosemirror-schema-list": "^1.4.1", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.4.0", + "prosemirror-trailing-node": "^3.0.0", + "prosemirror-transform": "^1.10.0", + "prosemirror-view": "^1.33.10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/react": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "@tiptap/extension-bubble-menu": "^2.8.0", + "@tiptap/extension-floating-menu": "^2.8.0", + "@types/use-sync-external-store": "^0.0.6", + "fast-deep-equal": "^3", + "use-sync-external-store": "^1.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.7.0", + "@tiptap/pm": "^2.7.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tiptap/starter-kit": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^2.8.0", + "@tiptap/extension-blockquote": "^2.8.0", + "@tiptap/extension-bold": "^2.8.0", + "@tiptap/extension-bullet-list": "^2.8.0", + "@tiptap/extension-code": "^2.8.0", + "@tiptap/extension-code-block": "^2.8.0", + "@tiptap/extension-document": "^2.8.0", + "@tiptap/extension-dropcursor": "^2.8.0", + "@tiptap/extension-gapcursor": "^2.8.0", + "@tiptap/extension-hard-break": "^2.8.0", + "@tiptap/extension-heading": "^2.8.0", + "@tiptap/extension-history": "^2.8.0", + "@tiptap/extension-horizontal-rule": "^2.8.0", + "@tiptap/extension-italic": "^2.8.0", + "@tiptap/extension-list-item": "^2.8.0", + "@tiptap/extension-ordered-list": "^2.8.0", + "@tiptap/extension-paragraph": "^2.8.0", + "@tiptap/extension-strike": "^2.8.0", + "@tiptap/extension-text": "^2.8.0", + "@tiptap/pm": "^2.8.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "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.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/doctrine": { + "version": "0.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/escodegen": { + "version": "0.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/find-cache-dir": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.7.6", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.13", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.16", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/react": { + "version": "18.3.11", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.11", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "license": "MIT" + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.7.1", + "license": "MIT", + "dependencies": { + "@swc/core": "^1.7.26" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/@vitest/expect": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "1.6.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/snapshot/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@vitest/spy": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/utils/node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/attr-accept": { + "version": "2.2.4", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.7.7", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/better-opn": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-assert": { + "version": "1.2.1", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.24.0", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "devOptional": true, + "license": "MIT/X11" + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "devOptional": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001669", + "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" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "4.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "devOptional": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "devOptional": true, + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssstyle": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "rrweb-cssom": "^0.7.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/date-fns": { + "version": "3.6.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "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", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dompurify": { + "version": "3.1.7", + "license": "(MPL-2.0 OR Apache-2.0)" + }, + "node_modules/dot-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.41", + "license": "ISC" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.4", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.3", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "dev": 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/esbuild": { + "version": "0.23.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.1", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.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/eslint-plugin-react/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-storybook": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf": "^0.0.1", + "@typescript-eslint/utils": "^5.62.0", + "requireindex": "^1.2.0", + "ts-dedent": "^2.2.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "eslint": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "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/eslint/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.21.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-selector": { + "version": "0.6.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formik": { + "version": "2.4.6", + "funding": [ + { + "type": "individual", + "url": "https://opencollective.com/formik" + } + ], + "license": "Apache-2.0", + "dependencies": { + "@types/hoist-non-react-statics": "^3.3.1", + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "react-fast-compare": "^2.0.1", + "tiny-warning": "^1.0.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "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/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-promise": { + "version": "4.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/ahmadnassri" + }, + "peerDependencies": { + "glob": "^7.1.6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "devOptional": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "peer": 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.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "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.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "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.13", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdom": { + "version": "24.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.4.3", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.12", + "parse5": "^7.1.2", + "rrweb-cssom": "^0.7.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.4", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^2.11.2" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/linkifyjs": { + "version": "4.1.3", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/mdurl": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mlly": { + "version": "1.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.12.1", + "pathe": "^1.1.2", + "pkg-types": "^1.2.0", + "ufo": "^1.5.4" + } + }, + "node_modules/mlly/node_modules/acorn": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/mui-color-input": { + "version": "4.0.1", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.1.0" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": "^5.0.0 || ^6.0.0", + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nwsapi": { + "version": "2.2.13", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@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": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-types": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.2", + "pathe": "^1.1.2" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.47", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/process": { + "version": "0.11.10", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/property-expr": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/prosemirror-changeset": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.6.1", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.13.1", + "license": "MIT", + "dependencies": { + "@types/markdown-it": "^14.0.0", + "markdown-it": "^14.0.0", + "prosemirror-model": "^1.20.0" + } + }, + "node_modules/prosemirror-menu": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.23.0", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.19.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.5.0", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.1.2", + "prosemirror-model": "^1.8.1", + "prosemirror-state": "^1.3.1", + "prosemirror-transform": "^1.2.1", + "prosemirror-view": "^1.13.3" + } + }, + "node_modules/prosemirror-trailing-node": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@remirror/core-constants": "3.0.0", + "escape-string-regexp": "^4.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.22.1", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.33.8" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.10.2", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.34.3", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.13.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "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" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/react": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-docgen": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.18.9", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "@types/babel__core": "^7.18.0", + "@types/babel__traverse": "^7.18.0", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.2.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dropzone": { + "version": "14.2.9", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-element-to-jsx-string": { + "version": "15.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "18.1.0" + }, + "peerDependencies": { + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/react-element-to-jsx-string/node_modules/react-is": { + "version": "18.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/react-fast-compare": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/react-icons": { + "version": "5.3.0", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "license": "MIT" + }, + "node_modules/react-redux": { + "version": "9.1.2", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.3", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25", + "react": "^18.0", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/react-router": { + "version": "6.27.0", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.20.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.27.0", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.20.0", + "react-router": "6.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/recast": { + "version": "0.23.9", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/recast/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/requireindex": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.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/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "license": "MIT" + }, + "node_modules/rrweb-cssom": { + "version": "0.7.1", + "dev": true, + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "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" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "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" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/sass-embedded": { + "version": "1.80.2", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.0.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^4.0.0", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.80.2", + "sass-embedded-android-arm64": "1.80.2", + "sass-embedded-android-ia32": "1.80.2", + "sass-embedded-android-riscv64": "1.80.2", + "sass-embedded-android-x64": "1.80.2", + "sass-embedded-darwin-arm64": "1.80.2", + "sass-embedded-darwin-x64": "1.80.2", + "sass-embedded-linux-arm": "1.80.2", + "sass-embedded-linux-arm64": "1.80.2", + "sass-embedded-linux-ia32": "1.80.2", + "sass-embedded-linux-musl-arm": "1.80.2", + "sass-embedded-linux-musl-arm64": "1.80.2", + "sass-embedded-linux-musl-ia32": "1.80.2", + "sass-embedded-linux-musl-riscv64": "1.80.2", + "sass-embedded-linux-musl-x64": "1.80.2", + "sass-embedded-linux-riscv64": "1.80.2", + "sass-embedded-linux-x64": "1.80.2", + "sass-embedded-win32-arm64": "1.80.2", + "sass-embedded-win32-ia32": "1.80.2", + "sass-embedded-win32-x64": "1.80.2" + } + }, + "node_modules/sass-embedded/node_modules/has-flag": { + "version": "4.0.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "devOptional": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/storybook": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@storybook/core": "8.3.6" + }, + "bin": { + "getstorybook": "bin/index.cjs", + "sb": "bin/index.cjs", + "storybook": "bin/index.cjs" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-indent": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stylis": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.36.0", + "devOptional": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.13.0", + "devOptional": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tiny-case": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tinypool": { + "version": "0.8.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tippy.js": { + "version": "6.3.7", + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.0", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "devOptional": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.5.4", + "dev": true, + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "devOptional": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unplugin": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.12.1", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "webpack-sources": "^3" + }, + "peerDependenciesMeta": { + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/unplugin/node_modules/acorn": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.4.10", + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-plugin-svgr": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.5", + "@svgr/core": "^8.1.0", + "@svgr/plugin-jsx": "^8.1.0" + }, + "peerDependencies": { + "vite": "^2.6.0 || 3 || 4 || 5" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vitest": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.0", + "@vitest/ui": "1.6.0", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/acorn": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/vitest/node_modules/acorn-walk": { + "version": "8.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "license": "MIT" + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/web-vitals": { + "version": "2.1.4", + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.95.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.13.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-attributes": { + "version": "1.9.5", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^5.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "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/which-builtin-type": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yup": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + } + } +} From 8c06e096df19e8920ba09cf16c99945119fa99db Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 6 Dec 2024 11:56:00 -0800 Subject: [PATCH 108/178] fix: remove useless file --- test.css | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 test.css diff --git a/test.css b/test.css deleted file mode 100644 index 67cb1abd..00000000 --- a/test.css +++ /dev/null @@ -1,26 +0,0 @@ -.snowflake { - position: absolute; - top: -10px; - user-select: none; - pointer-events: none; - animation: fall linear infinite; - z-index: 4; -} - -@keyframes fall { - 0% { - transform: translate(-12px, -10px); - } - 25% { - transform: translateX(0); - } - 50% { - transform: translateX(12px); - } - 75% { - transform: translateX(0px); - } - 100% { - transform: translate(-12px, 100vh); - } -} From c216a9d79dcde89fd2f2da2044cea73eab45b66a Mon Sep 17 00:00:00 2001 From: tunckiral Date: Fri, 6 Dec 2024 15:04:29 -0500 Subject: [PATCH 109/178] remove cache from node.js.yml --- .github/workflows/node.js.yml | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 615d437c..a92cf372 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -43,23 +43,23 @@ jobs: run: | rm -rf ./frontend/node_modules ./frontend/package-lock.json - # Cache backend dependencies - - name: Cache backend dependencies - uses: actions/cache@v3 - with: - path: ./backend/node_modules - key: backend-node-modules-${{ matrix.node-version }}-${{ hashFiles('backend/package-lock.json') }} - restore-keys: | - backend-node-modules-${{ matrix.node-version }}- - - # Cache frontend dependencies - - name: Cache frontend dependencies - uses: actions/cache@v3 - with: - path: ./frontend/node_modules - key: frontend-node-modules-${{ matrix.node-version }}-${{ hashFiles('frontend/package-lock.json') }} - restore-keys: | - frontend-node-modules-${{ matrix.node-version }}- + # # Cache backend dependencies + # - name: Cache backend dependencies + # uses: actions/cache@v3 + # with: + # path: ./backend/node_modules + # key: backend-node-modules-${{ matrix.node-version }}-${{ hashFiles('backend/package-lock.json') }} + # restore-keys: | + # backend-node-modules-${{ matrix.node-version }}- + + # # Cache frontend dependencies + # - name: Cache frontend dependencies + # uses: actions/cache@v3 + # with: + # path: ./frontend/node_modules + # key: frontend-node-modules-${{ matrix.node-version }}-${{ hashFiles('frontend/package-lock.json') }} + # restore-keys: | + # frontend-node-modules-${{ matrix.node-version }}- - name: Install dependencies for backend working-directory: ./backend From 69afe072681757721eb5778a12f2878a3956a99f Mon Sep 17 00:00:00 2001 From: tunckiral Date: Fri, 6 Dec 2024 15:12:19 -0500 Subject: [PATCH 110/178] removed unused deps --- frontend/package.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 7f3d8105..ac19be6d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,12 +30,8 @@ "react-dom": "^18.2.0", "react-dropzone": "^14.2.9", "react-icons": "^5.3.0", - "react-redux": "^9.1.2", "react-router": "^6.27.0", "react-router-dom": "^6.27.0", - "redux": "^5.0.1", - "vite-plugin-svgr": "^4.2.0", - "web-vitals": "^2.1.4", "yup": "^1.4.0" }, "devDependencies": { From 507b96625ce2580111797c13aeb6bb2e847a45b3 Mon Sep 17 00:00:00 2001 From: tunckiral Date: Fri, 6 Dec 2024 15:14:18 -0500 Subject: [PATCH 111/178] removed backend unused deps --- backend/package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/package.json b/backend/package.json index 3a6370d5..9deb853d 100644 --- a/backend/package.json +++ b/backend/package.json @@ -14,7 +14,6 @@ "author": "", "license": "ISC", "dependencies": { - "bcrypt": "^5.1.1", "bcryptjs": "^2.4.3", "cors": "^2.8.5", "dotenv": "^16.4.5", @@ -25,7 +24,7 @@ "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", "nodemailer": "^6.9.15", - "pg": "^8.11.5", + "sequelize": "^6.37.3" }, "devDependencies": { From d25ea20a9e0c18395908373be236e754af3fc343 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 6 Dec 2024 12:53:58 -0800 Subject: [PATCH 112/178] Merge branch 'develop' of github.com:bluewave-labs/bluewave-onboarding into 316-write-some-tests-for-backend-using-vitest From f90ebf12cb815ee7c57c48c2456ec6f1edb88575 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 6 Dec 2024 13:07:01 -0800 Subject: [PATCH 113/178] fix: remove useless tests --- .../test/unit/controllers/popuplog.test.js | 92 ------------------- .../src/test/unit/services/popuplog.test.js | 37 -------- 2 files changed, 129 deletions(-) delete mode 100644 backend/src/test/unit/controllers/popuplog.test.js delete mode 100644 backend/src/test/unit/services/popuplog.test.js diff --git a/backend/src/test/unit/controllers/popuplog.test.js b/backend/src/test/unit/controllers/popuplog.test.js deleted file mode 100644 index 9217cbd9..00000000 --- a/backend/src/test/unit/controllers/popuplog.test.js +++ /dev/null @@ -1,92 +0,0 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const sinon = require("sinon"); -const mocks = require("../../mocks/popupLog.mock.js"); -const { expect } = require("chai"); -const popuplogService = require("../../../service/popuplog.service.js"); -const popuplogController = require("../../../controllers/popuplog.controller.js"); - -const popupLog = mocks.PopupLogBuilder.popupLog; -const popupLogList = mocks.popupLogList; - -describe("Test popup log controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - describe("addPopupLog", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return a new popup log", async () => { - const popupLogData = popupLog().build(); - req.body = popupLogData; - serviceMock.addPopupLog = sinon - .stub(popuplogService, "addPopupLog") - .returns(popupLogData); - await popuplogController.addPopupLog(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(201); - expect(body).to.be.deep.equal(popupLogData); - }); - it("should create a new popup log with default completed value", async () => { - req.body = popupLog().missingCompleted().build(); - serviceMock.addPopupLog = sinon - .stub(popuplogService, "addPopupLog") - .returns(popupLog().build()); - await popuplogController.addPopupLog(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(201); - expect(body).to.be.deep.equal(popupLog().build()); - }); - it("should return 500 if an error occurs", async () => { - req.body = popupLog().build(); - serviceMock.addPopupLog = sinon - .stub(popuplogService, "addPopupLog") - .throws(new Error("Error adding popup log")); - await popuplogController.addPopupLog(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - message: "Error logging popup event", - error: new Error("Error adding popup log"), - }); - }); - }); - describe("getAllPopups", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return all popup logs", async () => { - serviceMock.getAllPopupLogs = sinon - .stub(popuplogService, "getAllPopupLogs") - .returns(popupLogList); - await popuplogController.getAllPopups(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(popupLogList); - }); - it("should return 500 if an error occurs", async () => { - serviceMock.getAllPopupLogs = sinon - .stub(popuplogService, "getAllPopupLogs") - .throws(new Error("Error getting all popup logs")); - await popuplogController.getAllPopups(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_ALL_POPUP_LOGS_ERROR", - message: "Error getting all popup logs", - }); - }); - }); -}); diff --git a/backend/src/test/unit/services/popuplog.test.js b/backend/src/test/unit/services/popuplog.test.js deleted file mode 100644 index 638190b9..00000000 --- a/backend/src/test/unit/services/popuplog.test.js +++ /dev/null @@ -1,37 +0,0 @@ -const { describe, it, afterEach } = require("mocha"); -const db = require("../../../models/index.js"); -const sinon = require("sinon"); -const mocks = require("../../mocks/popupLog.mock.js"); -const { expect } = require("chai"); -const popuplogService = require("../../../service/popuplog.service.js"); - -const PopupLog = db.PopupLog; -const popupLog = mocks.PopupLogBuilder.popupLog; - -describe("Test popup log service", () => { - const PopupLogMock = {}; - afterEach(sinon.restore); - it("addPopupLog - should create a new popup log", async () => { - const body = popupLog().build(); - PopupLogMock.create = sinon.stub(PopupLog, "create").resolves(body); - const result = await popuplogService.addPopupLog(body); - expect(result).to.be.deep.equal(body); - expect(PopupLogMock.create.called).to.be.true; - const params = PopupLogMock.create.getCall(0).args[0]; - const { showingTime, ...rest } = params; - const { showingTime: s, ...expected } = body; - expect(rest).to.be.deep.equal(expected); - expect(Date.parse(showingTime)).to.be.closeTo(Date.parse(s), 1000); - }); - it("getAllPopupLogs - should return all popup logs", async () => { - PopupLogMock.findAll = sinon - .stub(PopupLog, "findAll") - .resolves(mocks.popupLogList); - const popupLogs = await popuplogService.getAllPopupLogs(); - popupLogs.forEach((log, index) => { - const { showingTime, ...rest } = log; - const { showingTime: s, ...expected } = mocks.popupLogList[index]; - expect(rest).to.be.deep.equal(expected); - }); - }); -}); From 0c27aca60d25fcaeb665651843775d34a859b7c3 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 6 Dec 2024 13:07:17 -0800 Subject: [PATCH 114/178] fix: add export server --- backend/src/server.js | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/backend/src/server.js b/backend/src/server.js index 3427b0ab..5a8d530b 100644 --- a/backend/src/server.js +++ b/backend/src/server.js @@ -3,25 +3,25 @@ const cors = require('cors'); const helmet = require('helmet'); const dotenv = require('dotenv'); const bodyParser = require('body-parser'); -const jsonErrorMiddleware = require('./src/middleware/jsonError.middleware'); -const fileSizeValidator = require('./src/middleware/fileSizeValidator.middleware'); -const { MAX_FILE_SIZE } = require('./src/utils/constants.helper'); +const jsonErrorMiddleware = require('./middleware/jsonError.middleware'); +const fileSizeValidator = require('./middleware/fileSizeValidator.middleware'); +const { MAX_FILE_SIZE } = require('./utils/constants.helper'); // Load environment variables from .env file dotenv.config(); -const authRoutes = require('./src/routes/auth.routes'); -const userRoutes = require('./src/routes/user.routes'); -const mocks = require('./src/routes/mocks.routes'); -const popup = require('./src/routes/popup.routes'); -const guide_log = require('./src/routes/guidelog.routes'); -const banner = require('./src/routes/banner.routes'); -const teamRoutes = require('./src/routes/team.routes'); -const hint = require('./src/routes/hint.routes'); -const tourRoutes = require('./src/routes/tour.routes'); -const linkRoutes = require('./src/routes/link.routes'); -const helperLinkRoutes = require('./src/routes/helperLink.routes'); -const guideRoutes = require('./src/routes/guide.routes'); +const authRoutes = require('./routes/auth.routes'); +const userRoutes = require('./routes/user.routes'); +const mocks = require('./routes/mocks.routes'); +const popup = require('./routes/popup.routes'); +const guide_log = require('./routes/guidelog.routes'); +const banner = require('./routes/banner.routes'); +const teamRoutes = require('./routes/team.routes'); +const hint = require('./routes/hint.routes'); +const tourRoutes = require('./routes/tour.routes'); +const linkRoutes = require('./routes/link.routes'); +const helperLinkRoutes = require('./routes/helperLink.routes'); +const guideRoutes = require('./routes/guide.routes'); const app = express(); @@ -31,7 +31,7 @@ app.use(bodyParser.json({ limit: MAX_FILE_SIZE })); app.use(jsonErrorMiddleware); // app.use(fileSizeValidator); -const { sequelize } = require("./src/models"); +const { sequelize } = require("./models"); sequelize .authenticate() @@ -59,4 +59,6 @@ app.use('/api/helper-link', helperLinkRoutes); app.use((err, req, res, next) => { console.error(err.stack); res.status(500).json({ message: 'Internal Server Error' }); -}); \ No newline at end of file +}); + +module.exports = app; \ No newline at end of file From eb2ecebd09177c3419b3f2c9715b61d58e09ae2f Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 6 Dec 2024 13:07:28 -0800 Subject: [PATCH 115/178] fix: add dependency back --- backend/package-lock.json | 417 ++------------------------------------ backend/package.json | 2 +- 2 files changed, 22 insertions(+), 397 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 2a74e769..355e842d 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,7 +9,6 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "bcrypt": "^5.1.1", "bcryptjs": "^2.4.3", "cors": "^2.8.5", "dotenv": "^16.4.5", @@ -662,26 +661,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, "node_modules/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -803,12 +782,6 @@ "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==", "license": "MIT" }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC" - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -822,41 +795,6 @@ "node": ">= 0.6" } }, - "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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/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==", - "license": "MIT" - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -885,6 +823,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -933,12 +872,6 @@ "node": ">=8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "license": "ISC" - }, "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -946,20 +879,6 @@ "dev": true, "license": "MIT" }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1023,22 +942,9 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, - "node_modules/bcrypt": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", - "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.11", - "node-addon-api": "^5.0.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -1093,6 +999,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -1371,15 +1278,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -1455,15 +1353,6 @@ "dev": true, "license": "MIT" }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1508,6 +1397,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, "license": "MIT" }, "node_modules/config-chain": { @@ -1521,12 +1411,6 @@ "proto-list": "~1.2.1" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -1710,12 +1594,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -1735,15 +1613,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -1861,6 +1730,7 @@ "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, "license": "MIT" }, "node_modules/encodeurl": { @@ -2319,34 +2189,11 @@ "node": ">=10" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "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, "license": "ISC" }, "node_modules/fsevents": { @@ -2386,27 +2233,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -2471,6 +2297,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", @@ -2596,12 +2423,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" - }, "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -2682,42 +2503,6 @@ "node": ">= 0.8" } }, - "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==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/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==", - "license": "MIT" - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -2771,6 +2556,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "license": "ISC", "dependencies": { "once": "^1.3.0", @@ -2855,6 +2641,7 @@ "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, "license": "MIT", "engines": { "node": ">=8" @@ -3532,6 +3319,7 @@ "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, "license": "MIT", "dependencies": { "semver": "^6.0.0" @@ -3547,6 +3335,7 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -3636,6 +3425,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -3657,48 +3447,12 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, "license": "ISC", "engines": { "node": ">=8" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mocha": { "version": "10.8.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", @@ -3903,32 +3657,6 @@ "node": ">=16" } }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -4012,21 +3740,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -4037,19 +3750,6 @@ "node": ">=0.10.0" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/nyc": { "version": "17.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-17.1.0.tgz", @@ -4276,6 +3976,7 @@ "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, "license": "ISC", "dependencies": { "wrappy": "1" @@ -4382,6 +4083,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -4750,20 +4452,6 @@ "node": ">= 0.8" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -4846,6 +4534,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, "license": "ISC", "dependencies": { "glob": "^7.1.3" @@ -5090,6 +4779,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, "license": "ISC" }, "node_modules/set-function-length": { @@ -5160,6 +4850,7 @@ "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, "license": "ISC" }, "node_modules/simple-update-notifier": { @@ -5293,19 +4984,11 @@ "node": ">= 0.8" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "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, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -5336,6 +5019,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -5484,23 +5168,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -5584,12 +5251,6 @@ "nodetouch": "bin/nodetouch.js" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -5736,12 +5397,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -5798,22 +5453,6 @@ "node": ">=12.0.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5837,15 +5476,6 @@ "dev": true, "license": "ISC" }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -5909,6 +5539,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { @@ -5943,12 +5574,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/backend/package.json b/backend/package.json index 8efe1442..9bcc84a0 100644 --- a/backend/package.json +++ b/backend/package.json @@ -28,7 +28,7 @@ "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", "nodemailer": "^6.9.15", - + "pg": "^8.11.5", "sequelize": "^6.37.3" }, "devDependencies": { From e0b7d7e8190ef0fcd698ea694a814517241257ba Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 6 Dec 2024 13:22:27 -0800 Subject: [PATCH 116/178] test: add dynamic import to controller tests --- .../src/test/unit/controllers/auth.test.js | 699 ++++----- .../src/test/unit/controllers/banner.test.js | 722 ++++----- .../test/unit/controllers/helperLink.test.js | 1376 +++++++++-------- .../src/test/unit/controllers/hint.test.js | 824 +++++----- .../src/test/unit/controllers/invite.test.js | 142 +- .../src/test/unit/controllers/link.test.js | 966 ++++++------ .../test/unit/controllers/onboarding.test.js | 206 +-- .../src/test/unit/controllers/popup.test.js | 974 ++++++------ .../src/test/unit/controllers/team.test.js | 496 +++--- .../src/test/unit/controllers/tour.test.js | 642 ++++---- .../src/test/unit/controllers/user.test.js | 314 ++-- 11 files changed, 3707 insertions(+), 3654 deletions(-) diff --git a/backend/src/test/unit/controllers/auth.test.js b/backend/src/test/unit/controllers/auth.test.js index ca2b44ad..875befa9 100644 --- a/backend/src/test/unit/controllers/auth.test.js +++ b/backend/src/test/unit/controllers/auth.test.js @@ -1,389 +1,398 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const emailService = require("../../../service/email.service.js"); -const db = require("../../../models/index.js"); -const sinon = require("sinon"); -const auth = require("../../../controllers/auth.controller.js"); -const { expect } = require("chai"); -const mocks = require("../../mocks/user.mock.js"); -const jwt = require("jsonwebtoken"); -const bcrypt = require("bcryptjs"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const emailService = require("../../../service/email.service.js"); + const db = require("../../../models/index.js"); + const auth = require("../../../controllers/auth.controller.js"); + const mocks = require("../../mocks/user.mock.js"); + const jwt = require("jsonwebtoken"); + const bcrypt = require("bcryptjs"); -const User = db.User; -const Token = db.Token; + const User = db.User; + const Token = db.Token; -describe("Unit test auth controller", () => { - const req = {}; - const res = {}; - const fakeToken = jwt.sign({ id: 1 }, process.env.JWT_SECRET || 'test_secret'); - const UserMock = {}; - const TokenMock = {}; - let commit; - let rollback; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - commit = sinon.spy(); - rollback = sinon.spy(); - sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ - commit, - rollback, - })); - }); - afterEach(sinon.restore); - it("register - if something goes wrong, should return status 500", async () => { - UserMock.findOne = sinon.stub(User, "findOne").rejects(); - req.body = { ...mocks.validUser }; - await auth.register(req, res); + describe("Unit test auth controller", () => { + const req = {}; + const res = {}; + const fakeToken = jwt.sign( + { id: 1 }, + process.env.JWT_SECRET || "test_secret" + ); + const UserMock = {}; + const TokenMock = {}; + let commit; + let rollback; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + commit = sinon.spy(); + rollback = sinon.spy(); + sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ + commit, + rollback, + })); + }); + afterEach(sinon.restore); + it("register - if something goes wrong, should return status 500", async () => { + UserMock.findOne = sinon.stub(User, "findOne").rejects(); + req.body = { ...mocks.validUser }; + await auth.register(req, res); - expect(res.status.args[0][0]).to.be.equal(500); - const body = res.json.args[0][0]; - const { token, ...info } = body; - expect(info).to.be.deep.equal({ - error: "Internal Server Error", + expect(res.status.args[0][0]).to.be.equal(500); + const body = res.json.args[0][0]; + const { token, ...info } = body; + expect(info).to.be.deep.equal({ + error: "Internal Server Error", + }); }); - }); - it("register - should return status 400 if the email is already registered", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(true); - req.body = mocks.validUser; - await auth.register(req, res); - expect(UserMock.findOne.called).to.be.true; - expect( - UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) - ).to.be.true; - expect(res.status.args[0][0]).to.be.equal(400); - expect(res.json.args[0][0]).to.be.deep.equal({ - error: "Email already exists", + it("register - should return status 400 if the email is already registered", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(true); + req.body = mocks.validUser; + await auth.register(req, res); + expect(UserMock.findOne.called).to.be.true; + expect( + UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) + ).to.be.true; + expect(res.status.args[0][0]).to.be.equal(400); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Email already exists", + }); }); - }); - it("register - should return the created user and the token if there is a user already created", async () => { - UserMock.count = sinon.stub(User, "count").resolves(1); - UserMock.create = sinon.stub(User, "create").resolves(mocks.validUser); - UserMock.findOne = sinon.stub(User, "findOne").resolves(false); - TokenMock.create = sinon.stub(Token, "create").resolves(); - req.body = mocks.validUser; - await auth.register(req, res); + it("register - should return the created user and the token if there is a user already created", async () => { + UserMock.count = sinon.stub(User, "count").resolves(1); + UserMock.create = sinon.stub(User, "create").resolves(mocks.validUser); + UserMock.findOne = sinon.stub(User, "findOne").resolves(false); + TokenMock.create = sinon.stub(Token, "create").resolves(); + req.body = mocks.validUser; + await auth.register(req, res); - expect(UserMock.findOne.called).to.be.true; - expect( - UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) - ).to.be.true; - expect(UserMock.count.called).to.be.true; - expect(TokenMock.create.called).to.be.true; - expect(commit.called).to.be.true; + expect(UserMock.findOne.called).to.be.true; + expect( + UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) + ).to.be.true; + expect(UserMock.count.called).to.be.true; + expect(TokenMock.create.called).to.be.true; + expect(commit.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(201); - const body = res.json.args[0][0]; - const { token, ...info } = body; - expect(info).to.be.deep.equal({ - user: { - email: "jane.doe@email.com", - id: 1, - name: "Jane", - role: "admin", - surname: "Doe", - }, + expect(res.status.args[0][0]).to.be.equal(201); + const body = res.json.args[0][0]; + const { token, ...info } = body; + expect(info).to.be.deep.equal({ + user: { + email: "jane.doe@email.com", + id: 1, + name: "Jane", + role: "admin", + surname: "Doe", + }, + }); + expect(body).to.have.property("token"); }); - expect(body).to.have.property("token"); - }); - it("register - should return status 400 if something goes wrong and a user is already created", async () => { - UserMock.count = sinon.stub(User, "count").resolves(1); - UserMock.create = sinon.stub(User, "create").rejects(); - UserMock.findOne = sinon.stub(User, "findOne").resolves(false); - TokenMock.create = sinon.stub(Token, "create").resolves(); - req.body = mocks.validUser; - await auth.register(req, res); + it("register - should return status 400 if something goes wrong and a user is already created", async () => { + UserMock.count = sinon.stub(User, "count").resolves(1); + UserMock.create = sinon.stub(User, "create").rejects(); + UserMock.findOne = sinon.stub(User, "findOne").resolves(false); + TokenMock.create = sinon.stub(Token, "create").resolves(); + req.body = mocks.validUser; + await auth.register(req, res); - expect(UserMock.findOne.called).to.be.true; - expect( - UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) - ).to.be.true; - expect(UserMock.count.called).to.be.true; - expect(TokenMock.create.called).to.be.false; - expect(commit.called).to.be.false; - expect(rollback.called).to.be.true; + expect(UserMock.findOne.called).to.be.true; + expect( + UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) + ).to.be.true; + expect(UserMock.count.called).to.be.true; + expect(TokenMock.create.called).to.be.false; + expect(commit.called).to.be.false; + expect(rollback.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Error registering user by invite", + expect(res.status.args[0][0]).to.be.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Error registering user by invite", + }); + expect(body).not.to.have.property("token"); }); - expect(body).not.to.have.property("token"); - }); - it("register - should return the created user and the token if there isn't any user created", async () => { - UserMock.count = sinon.stub(User, "count").resolves(0); - UserMock.create = sinon.stub(User, "create").resolves(mocks.validUser); - UserMock.findOne = sinon.stub(User, "findOne").resolves(false); - TokenMock.create = sinon.stub(Token, "create").resolves(); - req.body = mocks.validUser; - await auth.register(req, res); + it("register - should return the created user and the token if there isn't any user created", async () => { + UserMock.count = sinon.stub(User, "count").resolves(0); + UserMock.create = sinon.stub(User, "create").resolves(mocks.validUser); + UserMock.findOne = sinon.stub(User, "findOne").resolves(false); + TokenMock.create = sinon.stub(Token, "create").resolves(); + req.body = mocks.validUser; + await auth.register(req, res); - expect(UserMock.findOne.called).to.be.true; - expect( - UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) - ).to.be.true; - expect(UserMock.count.called).to.be.true; - expect(TokenMock.create.called).to.be.true; + expect(UserMock.findOne.called).to.be.true; + expect( + UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) + ).to.be.true; + expect(UserMock.count.called).to.be.true; + expect(TokenMock.create.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(201); - const body = res.json.args[0][0]; - const { token, ...info } = body; - expect(info).to.be.deep.equal({ - user: { - email: "jane.doe@email.com", - id: 1, - name: "Jane", - role: "admin", - surname: "Doe", - }, + expect(res.status.args[0][0]).to.be.equal(201); + const body = res.json.args[0][0]; + const { token, ...info } = body; + expect(info).to.be.deep.equal({ + user: { + email: "jane.doe@email.com", + id: 1, + name: "Jane", + role: "admin", + surname: "Doe", + }, + }); + expect(body).to.have.property("token"); }); - expect(body).to.have.property("token"); - }); - it("login - if the password doesn't match, should fail with status 401", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(mocks.validUser); - req.body = { ...mocks.validUser, password: "pass123" }; - await auth.login(req, res); - expect(res.status.args[0][0]).to.be.equal(401); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Invalid credentials", + it("login - if the password doesn't match, should fail with status 401", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(mocks.validUser); + req.body = { ...mocks.validUser, password: "pass123" }; + await auth.login(req, res); + expect(res.status.args[0][0]).to.be.equal(401); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Invalid credentials", + }); + expect(body).not.to.have.property("token"); }); - expect(body).not.to.have.property("token"); - }); - it("login - should return the user and a new Token", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves({ - ...mocks.validUser, - password: "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", - }); - TokenMock.create = sinon.stub(Token, "create").resolves(); - TokenMock.destroy = sinon.stub(Token, "destroy").resolves(); - req.body = { ...mocks.validUser }; - await auth.login(req, res); + it("login - should return the user and a new Token", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves({ + ...mocks.validUser, + password: + "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", + }); + TokenMock.create = sinon.stub(Token, "create").resolves(); + TokenMock.destroy = sinon.stub(Token, "destroy").resolves(); + req.body = { ...mocks.validUser }; + await auth.login(req, res); - expect(UserMock.findOne.called).to.be.true; - expect( - UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) - ).to.be.true; - expect(TokenMock.destroy.called).to.be.true; - expect(TokenMock.create.called).to.be.true; - expect(TokenMock.create.args[0][0]).to.have.property("userId", 1); - expect(TokenMock.create.args[0][0]).to.have.property("type", "auth"); + expect(UserMock.findOne.called).to.be.true; + expect( + UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) + ).to.be.true; + expect(TokenMock.destroy.called).to.be.true; + expect(TokenMock.create.called).to.be.true; + expect(TokenMock.create.args[0][0]).to.have.property("userId", 1); + expect(TokenMock.create.args[0][0]).to.have.property("type", "auth"); - expect(res.status.args[0][0]).to.be.equal(200); - const body = res.json.args[0][0]; - const { token, ...info } = body; - expect(info).to.be.deep.equal({ - user: { - email: "jane.doe@email.com", - id: 1, - name: "Jane", - role: "admin", - surname: "Doe", - picture: "", - }, + expect(res.status.args[0][0]).to.be.equal(200); + const body = res.json.args[0][0]; + const { token, ...info } = body; + expect(info).to.be.deep.equal({ + user: { + email: "jane.doe@email.com", + id: 1, + name: "Jane", + role: "admin", + surname: "Doe", + picture: "", + }, + }); + expect(body).to.have.property("token"); }); - expect(body).to.have.property("token"); - }); - it("login - if something goes wrong, should return status 500", async () => { - UserMock.findOne = sinon.stub(User, "findOne").rejects(); - req.body = { ...mocks.validUser }; - await auth.login(req, res); + it("login - if something goes wrong, should return status 500", async () => { + UserMock.findOne = sinon.stub(User, "findOne").rejects(); + req.body = { ...mocks.validUser }; + await auth.login(req, res); - expect(res.status.args[0][0]).to.be.equal(500); - const body = res.json.args[0][0]; - const { token, ...info } = body; - expect(info).to.be.deep.equal({ - error: "Internal Server Error", + expect(res.status.args[0][0]).to.be.equal(500); + const body = res.json.args[0][0]; + const { token, ...info } = body; + expect(info).to.be.deep.equal({ + error: "Internal Server Error", + }); }); - }); - it("logout - should fail with status 401 if token is wrong", async () => { - req.headers = { - authorization: "", - }; - await auth.logout(req, res); - expect(res.status.args[0][0]).to.be.equal(401); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Invalid token", + it("logout - should fail with status 401 if token is wrong", async () => { + req.headers = { + authorization: "", + }; + await auth.logout(req, res); + expect(res.status.args[0][0]).to.be.equal(401); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Invalid token", + }); }); - }); - it("logout - should fail with status 401 if token in DB is different or missing", async () => { - req.headers = { - authorization: `Bearer ${fakeToken}`, - }; - sinon.stub(jwt, "verify").returns({ id: 1 }); - TokenMock.findOne = sinon.stub(Token, "findOne").resolves(null); - await auth.logout(req, res); - expect(res.status.args[0][0]).to.be.equal(401); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Invalid token", + it("logout - should fail with status 401 if token in DB is different or missing", async () => { + req.headers = { + authorization: `Bearer ${fakeToken}`, + }; + sinon.stub(jwt, "verify").returns({ id: 1 }); + TokenMock.findOne = sinon.stub(Token, "findOne").resolves(null); + await auth.logout(req, res); + expect(res.status.args[0][0]).to.be.equal(401); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Invalid token", + }); }); - }); - it("logout - should delete the token and return status 200", async () => { - req.headers = { - authorization: `Bearer ${fakeToken}`, - }; - const fakeResponseToken = { - token: fakeToken, - userId: 1, - type: "auth", - destroy: sinon.stub(), - }; - TokenMock.findOne = sinon - .stub(Token, "findOne") - .resolves(fakeResponseToken); - sinon.stub(jwt, "verify").returns({ id: 1 }); - await auth.logout(req, res); + it("logout - should delete the token and return status 200", async () => { + req.headers = { + authorization: `Bearer ${fakeToken}`, + }; + const fakeResponseToken = { + token: fakeToken, + userId: 1, + type: "auth", + destroy: sinon.stub(), + }; + TokenMock.findOne = sinon + .stub(Token, "findOne") + .resolves(fakeResponseToken); + sinon.stub(jwt, "verify").returns({ id: 1 }); + await auth.logout(req, res); - expect(TokenMock.findOne.called).to.be.true; + expect(TokenMock.findOne.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - message: "Successfully logged out", + expect(res.status.args[0][0]).to.be.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + message: "Successfully logged out", + }); + expect(body).not.to.have.property("token"); }); - expect(body).not.to.have.property("token"); - }); - it("logout - if something goes wrong, should return status 500", async () => { - req.headers = { - authorization: `Bearer ${fakeToken}`, - }; - TokenMock.findOne = sinon.stub(Token, "findOne").rejects(); - sinon.stub(jwt, "verify").returns({ id: 1 }); - await auth.logout(req, res); + it("logout - if something goes wrong, should return status 500", async () => { + req.headers = { + authorization: `Bearer ${fakeToken}`, + }; + TokenMock.findOne = sinon.stub(Token, "findOne").rejects(); + sinon.stub(jwt, "verify").returns({ id: 1 }); + await auth.logout(req, res); - expect(res.status.args[0][0]).to.be.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", + expect(res.status.args[0][0]).to.be.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + }); }); - }); - it("forgetPassword - should fail with status 400 iif email doesn't match", async () => { - req.body = { - email: "email@email.com", - }; - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - await auth.forgetPassword(req, res); + it("forgetPassword - should fail with status 400 iif email doesn't match", async () => { + req.body = { + email: "email@email.com", + }; + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + await auth.forgetPassword(req, res); - expect(UserMock.findOne.called).to.be.true; + expect(UserMock.findOne.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "User not found", - }); - }); - it("forgetPassword - should create a temporary token, send an email and return status 200", async () => { - req.body = { - email: mocks.validUser.email, - }; - UserMock.findOne = sinon.stub(User, "findOne").resolves({ - ...mocks.validUser, - password: "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", + expect(res.status.args[0][0]).to.be.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "User not found", + }); }); - TokenMock.create = sinon.stub(Token, "create").resolves(); - sinon.spy(emailService, "sendPasswordResetEmail"); - await auth.forgetPassword(req, res); - - expect(UserMock.findOne.called).to.be.true; - expect(Token.create.called).to.be.true; + it("forgetPassword - should create a temporary token, send an email and return status 200", async () => { + req.body = { + email: mocks.validUser.email, + }; + UserMock.findOne = sinon.stub(User, "findOne").resolves({ + ...mocks.validUser, + password: + "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", + }); + TokenMock.create = sinon.stub(Token, "create").resolves(); + sinon.spy(emailService, "sendPasswordResetEmail"); + await auth.forgetPassword(req, res); - expect(res.status.args[0][0]).to.be.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.have.property("message", "Password reset token sent"); - }); - it("forgetPassword - if something goes wrong, should return status 500", async () => { - req.body = { - email: mocks.validUser.email, - }; - UserMock.findOne = sinon.stub(User, "findOne").rejects(); - await auth.forgetPassword(req, res); + expect(UserMock.findOne.called).to.be.true; + expect(Token.create.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", + expect(res.status.args[0][0]).to.be.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.have.property("message", "Password reset token sent"); }); - }); - it("resetPassword - should fail with status 400 if there is no token", async () => { - req.body = { - token: "Bearer", - }; - TokenMock.findOne = sinon.stub(Token, "findOne").resolves({ - token: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNzMzMTkzMzkyfQ.XVYpcKA-qHrZGoDs9LJv042w0oqcBnzZPZTsXPgB0g4', - userId: 1, - type: 'reset', - expiresAt: '2144-11-18' + it("forgetPassword - if something goes wrong, should return status 500", async () => { + req.body = { + email: mocks.validUser.email, + }; + UserMock.findOne = sinon.stub(User, "findOne").rejects(); + await auth.forgetPassword(req, res); + + expect(res.status.args[0][0]).to.be.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + }); }); - await auth.resetPassword(req, res); - expect(res.status.args[0][0]).to.be.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Invalid or expired token", + it("resetPassword - should fail with status 400 if there is no token", async () => { + req.body = { + token: "Bearer", + }; + TokenMock.findOne = sinon.stub(Token, "findOne").resolves({ + token: + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNzMzMTkzMzkyfQ.XVYpcKA-qHrZGoDs9LJv042w0oqcBnzZPZTsXPgB0g4", + userId: 1, + type: "reset", + expiresAt: "2144-11-18", + }); + await auth.resetPassword(req, res); + expect(res.status.args[0][0]).to.be.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Invalid or expired token", + }); }); - }); - it("resetPassword - should fail with status 400 if the token is wrong", async () => { - req.body = { - token: `Bearer ${fakeToken}`, - }; - TokenMock.findOne = sinon.stub(Token, "findOne").resolves(null); - sinon.stub(bcrypt, "compare"); - await auth.resetPassword(req, res); + it("resetPassword - should fail with status 400 if the token is wrong", async () => { + req.body = { + token: `Bearer ${fakeToken}`, + }; + TokenMock.findOne = sinon.stub(Token, "findOne").resolves(null); + sinon.stub(bcrypt, "compare"); + await auth.resetPassword(req, res); - expect(TokenMock.findOne.called).to.be.true; + expect(TokenMock.findOne.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Invalid or expired token", + expect(res.status.args[0][0]).to.be.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Invalid or expired token", + }); + expect(body).not.to.have.property("token"); }); - expect(body).not.to.have.property("token"); - }); - it("resetPassword - should return status 200 and the correct message", async () => { - req.body = { - token: fakeToken, - newPassword: "n3wP@ssword", - }; - const fakeResponseToken = { - token: fakeToken, - userId: 1, - type: "reset", - destroy: sinon.stub(), - expiresAt: "2144-11-18", - }; - TokenMock.findOne = sinon - .stub(Token, "findOne") - .resolves(fakeResponseToken); - sinon.stub(bcrypt, "compare").returns(true); - UserMock.findOne = sinon.stub(User, "findOne").resolves({ - ...mocks.validUser, - password: "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", - save: sinon.stub(), - }); - await auth.resetPassword(req, res); + it("resetPassword - should return status 200 and the correct message", async () => { + req.body = { + token: fakeToken, + newPassword: "n3wP@ssword", + }; + const fakeResponseToken = { + token: fakeToken, + userId: 1, + type: "reset", + destroy: sinon.stub(), + expiresAt: "2144-11-18", + }; + TokenMock.findOne = sinon + .stub(Token, "findOne") + .resolves(fakeResponseToken); + sinon.stub(bcrypt, "compare").returns(true); + UserMock.findOne = sinon.stub(User, "findOne").resolves({ + ...mocks.validUser, + password: + "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", + save: sinon.stub(), + }); + await auth.resetPassword(req, res); - expect(TokenMock.findOne.called).to.be.true; + expect(TokenMock.findOne.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - message: "Password reset successful", + expect(res.status.args[0][0]).to.be.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + message: "Password reset successful", + }); + expect(body).not.to.have.property("token"); }); - expect(body).not.to.have.property("token"); - }); - it("resetPassword - if something goes wrong, should return status 500", async () => { - req.body = { - token: fakeToken, - newPassword: "n3wP@ssword", - }; - TokenMock.findOne = sinon.stub(Token, "findOne").rejects(); - await auth.resetPassword(req, res); + it("resetPassword - if something goes wrong, should return status 500", async () => { + req.body = { + token: fakeToken, + newPassword: "n3wP@ssword", + }; + TokenMock.findOne = sinon.stub(Token, "findOne").rejects(); + await auth.resetPassword(req, res); - expect(res.status.args[0][0]).to.be.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", + expect(res.status.args[0][0]).to.be.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + }); + expect(body).not.to.have.property("token"); }); - expect(body).not.to.have.property("token"); }); -}); +})(); diff --git a/backend/src/test/unit/controllers/banner.test.js b/backend/src/test/unit/controllers/banner.test.js index f184e9bd..1e2c0f09 100644 --- a/backend/src/test/unit/controllers/banner.test.js +++ b/backend/src/test/unit/controllers/banner.test.js @@ -1,402 +1,412 @@ -const { describe, it, afterEach } = require("mocha"); -const { expect } = require("chai"); -const service = require("../../../service/banner.service"); -const sinon = require("sinon"); -const { BannerBuilder, validList } = require("../../mocks/banner.mock.js"); -const controller = require("../../../controllers/banner.controller.js"); +(async () => { + const { describe, it, afterEach } = await import("mocha"); + const { expect } = await import("chai"); + const sinon = await import("sinon"); + const service = require("../../../service/banner.service"); + const { BannerBuilder, validList } = require("../../mocks/banner.mock.js"); + const controller = require("../../../controllers/banner.controller.js"); -const banner = BannerBuilder.banner; + const banner = BannerBuilder.banner; -describe("Test Banner controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - describe("addBanner", () => { - req.user = { id: 1 }; - it("should return status 400 if the position is missing", async () => { - req.body = banner().missingPosition().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "position and closeButtonAction are required", - }, - ], - }); + describe("Test Banner controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - it("should return status 400 if the closeButtonAction is missing", async () => { - req.body = banner().missingCloseButtonAction().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "position and closeButtonAction are required", - }, - ], + afterEach(sinon.restore); + describe("addBanner", () => { + req.user = { id: 1 }; + it("should return status 400 if the position is missing", async () => { + req.body = banner().missingPosition().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "position and closeButtonAction are required", + }, + ], + }); }); - }); - it("should return status 400 if the position is invalid", async () => { - req.body = banner().invalidPosition().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value entered", - }, - ], + it("should return status 400 if the closeButtonAction is missing", async () => { + req.body = banner().missingCloseButtonAction().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "position and closeButtonAction are required", + }, + ], + }); }); - }); - it("should return status 400 if the closeButtonAction is invalid", async () => { - req.body = banner().invalidCloseButtonAction().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value entered", - }, - ], + it("should return status 400 if the position is invalid", async () => { + req.body = banner().invalidPosition().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value entered", + }, + ], + }); }); - }); - it("should return status 400 if backgroundColor is invalid", async () => { - req.body = banner().invalidBackgroundColor().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "backgroundColor must be a valid hex color code", - }, - ], + it("should return status 400 if the closeButtonAction is invalid", async () => { + req.body = banner().invalidCloseButtonAction().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value entered", + }, + ], + }); }); - }); - it("should return status 400 if fontColor is invalid", async () => { - req.body = banner().invalidFontColor().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "fontColor must be a valid hex color code", - }, - ], + it("should return status 400 if backgroundColor is invalid", async () => { + req.body = banner().invalidBackgroundColor().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "backgroundColor must be a valid hex color code", + }, + ], + }); }); - }); - it("should return status 201 and the new banner if everything goes right", async () => { - req.user = { id: 1 }; - req.body = banner().build(); - serviceMock.createBanner = sinon - .stub(service, "createBanner") - .returns(banner().build()); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(201); - expect(body).to.be.deep.equal(banner().build()); - }); - it("should return status 500 if something goes wrong", async () => { - req.user = { id: 1 }; - serviceMock.createBanner = sinon.stub(service, "createBanner").rejects(); - req.body = banner().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_BANNER_ERROR", - message: "Error", + it("should return status 400 if fontColor is invalid", async () => { + req.body = banner().invalidFontColor().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "fontColor must be a valid hex color code", + }, + ], + }); }); - }); - }); - describe("deleteBanner", () => { - it("should return status 400 if the id is missing or is invalid", async () => { - req.params = { id: "one" }; - await controller.deleteBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); - }); - it("should return status 400 if the id is invalid", async () => { - req.params = { id: " " }; - await controller.deleteBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); - }); - it("should return status 400 if the service returns false", async () => { - req.params = { id: "1" }; - serviceMock.deleteBanner = sinon - .stub(service, "deleteBanner") - .resolves(false); - await controller.deleteBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Banner with the specified id does not exist" }], + it("should return status 201 and the new banner if everything goes right", async () => { + req.user = { id: 1 }; + req.body = banner().build(); + serviceMock.createBanner = sinon + .stub(service, "createBanner") + .returns(banner().build()); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(201); + expect(body).to.be.deep.equal(banner().build()); }); - }); - it("should return status 200 if banner is deleted", async () => { - req.params = { id: "1" }; - serviceMock.deleteBanner = sinon - .stub(service, "deleteBanner") - .resolves(true); - await controller.deleteBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal({ - message: "Banner with ID 1 deleted successfully", + it("should return status 500 if something goes wrong", async () => { + req.user = { id: 1 }; + serviceMock.createBanner = sinon + .stub(service, "createBanner") + .rejects(); + req.body = banner().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_BANNER_ERROR", + message: "Error", + }); }); }); - it("should return status 500 if something goes wrong", async () => { - req.params = { id: "1" }; - serviceMock.deleteBanner = sinon.stub(service, "deleteBanner").rejects(); - await controller.deleteBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_BANNER_ERROR", - message: "Error", + describe("deleteBanner", () => { + it("should return status 400 if the id is missing or is invalid", async () => { + req.params = { id: "one" }; + await controller.deleteBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); }); - }); - }); - describe("editBanner", () => { - it("should return status 400 if the position is missing", async () => { - req.body = banner().missingPosition().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "position and closeButtonAction are required", - }, - ], + it("should return status 400 if the id is invalid", async () => { + req.params = { id: " " }; + await controller.deleteBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); }); - }); - it("should return status 400 if the closeButtonAction is missing", async () => { - req.body = banner().missingCloseButtonAction().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "position and closeButtonAction are required", - }, - ], + it("should return status 400 if the service returns false", async () => { + req.params = { id: "1" }; + serviceMock.deleteBanner = sinon + .stub(service, "deleteBanner") + .resolves(false); + await controller.deleteBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Banner with the specified id does not exist" }], + }); }); - }); - it("should return status 400 if the position is invalid", async () => { - req.body = banner().invalidPosition().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value for position", - }, - ], + it("should return status 200 if banner is deleted", async () => { + req.params = { id: "1" }; + serviceMock.deleteBanner = sinon + .stub(service, "deleteBanner") + .resolves(true); + await controller.deleteBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal({ + message: "Banner with ID 1 deleted successfully", + }); }); - }); - it("should return status 400 if the closeButtonAction is invalid", async () => { - req.body = banner().invalidCloseButtonAction().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value for closeButtonAction", - }, - ], + it("should return status 500 if something goes wrong", async () => { + req.params = { id: "1" }; + serviceMock.deleteBanner = sinon + .stub(service, "deleteBanner") + .rejects(); + await controller.deleteBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_BANNER_ERROR", + message: "Error", + }); }); }); - it("should return status 400 if fontColor is invalid", async () => { - req.body = banner().invalidFontColor().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "fontColor must be a valid hex color code", - }, - ], + describe("editBanner", () => { + it("should return status 400 if the position is missing", async () => { + req.body = banner().missingPosition().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "position and closeButtonAction are required", + }, + ], + }); }); - }); - it("should return status 400 if backgroundColor is invalid", async () => { - req.body = banner().invalidBackgroundColor().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "backgroundColor must be a valid hex color code", - }, - ], + it("should return status 400 if the closeButtonAction is missing", async () => { + req.body = banner().missingCloseButtonAction().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "position and closeButtonAction are required", + }, + ], + }); + }); + it("should return status 400 if the position is invalid", async () => { + req.body = banner().invalidPosition().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value for position", + }, + ], + }); + }); + it("should return status 400 if the closeButtonAction is invalid", async () => { + req.body = banner().invalidCloseButtonAction().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value for closeButtonAction", + }, + ], + }); + }); + it("should return status 400 if fontColor is invalid", async () => { + req.body = banner().invalidFontColor().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "fontColor must be a valid hex color code", + }, + ], + }); + }); + it("should return status 400 if backgroundColor is invalid", async () => { + req.body = banner().invalidBackgroundColor().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "backgroundColor must be a valid hex color code", + }, + ], + }); + }); + it("should return status 200 and the updated banner if everything goes right", async () => { + req.body = banner().build(); + serviceMock.updateBanner = sinon + .stub(service, "updateBanner") + .returns(banner().build()); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(banner().build()); + }); + it("should return status 500 if something goes wrong", async () => { + req.body = banner().build(); + serviceMock.updateBanner = sinon + .stub(service, "updateBanner") + .rejects(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "EDIT_BANNER_ERROR", + message: "Error", + }); }); }); - it("should return status 200 and the updated banner if everything goes right", async () => { - req.body = banner().build(); - serviceMock.updateBanner = sinon - .stub(service, "updateBanner") - .returns(banner().build()); - await controller.editBanner(req, res); + it("getAllBanners - should return status 200 and all the banners if everything goes right", async () => { + serviceMock.getAllBanners = sinon + .stub(service, "getAllBanners") + .returns(validList); + await controller.getAllBanners(req, res); const status = res.status.args[0][0]; const body = res.json.args[0][0]; expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(banner().build()); + expect(body).to.be.deep.equal(validList); }); - it("should return status 500 if something goes wrong", async () => { - req.body = banner().build(); - serviceMock.updateBanner = sinon.stub(service, "updateBanner").rejects(); - await controller.editBanner(req, res); + it("getAllBanners - should return status 500 if something goes wrong", async () => { + serviceMock.getAllBanners = sinon + .stub(service, "getAllBanners") + .rejects(); + await controller.getAllBanners(req, res); const status = res.status.args[0][0]; const body = res.json.args[0][0]; expect(status).to.be.equal(500); expect(body).to.be.deep.equal({ error: "Internal Server Error", - errorCode: "EDIT_BANNER_ERROR", + errorCode: "GET_ALL_BANNERS_ERROR", message: "Error", }); }); - }); - it("getAllBanners - should return status 200 and all the banners if everything goes right", async () => { - serviceMock.getAllBanners = sinon - .stub(service, "getAllBanners") - .returns(validList); - await controller.getAllBanners(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(validList); - }); - it("getAllBanners - should return status 500 if something goes wrong", async () => { - serviceMock.getAllBanners = sinon.stub(service, "getAllBanners").rejects(); - await controller.getAllBanners(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_ALL_BANNERS_ERROR", - message: "Error", - }); - }); - it("getBanners - should return status 200 and all the banners created by the user if everything goes right", async () => { - req.user = { id: 1 }; - serviceMock.getBanners = sinon - .stub(service, "getBanners") - .returns(validList); - await controller.getBanners(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(validList); - }); - it("getBanners - should return status 500 if something goes wrong", async () => { - req.user = { id: 1 }; - serviceMock.getBanners = sinon.stub(service, "getBanners").rejects(); - await controller.getBanners(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_BANNERS_ERROR", - message: "Error", - }); - }); - describe("getBannerById", () => { - it("should return status 400 if the id is invalid", async () => { - req.params = { id: "one" }; - await controller.getBannerById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); - }); - it("should return status 400 if the id is missing", async () => { - req.params = { id: "" }; - await controller.getBannerById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); - }); - it("should return status 404 if the service returns null", async () => { - req.params = { id: "1" }; - serviceMock.getBannerById = sinon - .stub(service, "getBannerById") - .resolves(null); - await controller.getBannerById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Banner not found" }], - }); - }); - it("should return status 200 and the banner if everything goes right", async () => { - req.params = { id: "1" }; - serviceMock.getBannerById = sinon - .stub(service, "getBannerById") - .returns(banner().build()); - await controller.getBannerById(req, res); + it("getBanners - should return status 200 and all the banners created by the user if everything goes right", async () => { + req.user = { id: 1 }; + serviceMock.getBanners = sinon + .stub(service, "getBanners") + .returns(validList); + await controller.getBanners(req, res); const status = res.status.args[0][0]; const body = res.json.args[0][0]; expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(banner().build()); + expect(body).to.be.deep.equal(validList); }); - it("should return status 500 if something goes wrong", async () => { - req.params = { id: "1" }; - serviceMock.getBannerById = sinon - .stub(service, "getBannerById") - .rejects(); - await controller.getBannerById(req, res); + it("getBanners - should return status 500 if something goes wrong", async () => { + req.user = { id: 1 }; + serviceMock.getBanners = sinon.stub(service, "getBanners").rejects(); + await controller.getBanners(req, res); const status = res.status.args[0][0]; const body = res.json.args[0][0]; expect(status).to.be.equal(500); expect(body).to.be.deep.equal({ error: "Internal Server Error", - errorCode: "GET_BANNER_BY_ID_ERROR", + errorCode: "GET_BANNERS_ERROR", message: "Error", }); }); + describe("getBannerById", () => { + it("should return status 400 if the id is invalid", async () => { + req.params = { id: "one" }; + await controller.getBannerById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); + }); + it("should return status 400 if the id is missing", async () => { + req.params = { id: "" }; + await controller.getBannerById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); + }); + it("should return status 404 if the service returns null", async () => { + req.params = { id: "1" }; + serviceMock.getBannerById = sinon + .stub(service, "getBannerById") + .resolves(null); + await controller.getBannerById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Banner not found" }], + }); + }); + it("should return status 200 and the banner if everything goes right", async () => { + req.params = { id: "1" }; + serviceMock.getBannerById = sinon + .stub(service, "getBannerById") + .returns(banner().build()); + await controller.getBannerById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(banner().build()); + }); + it("should return status 500 if something goes wrong", async () => { + req.params = { id: "1" }; + serviceMock.getBannerById = sinon + .stub(service, "getBannerById") + .rejects(); + await controller.getBannerById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_BANNER_BY_ID_ERROR", + message: "Error", + }); + }); + }); }); -}); +})(); diff --git a/backend/src/test/unit/controllers/helperLink.test.js b/backend/src/test/unit/controllers/helperLink.test.js index 4ac55065..91e8e2df 100644 --- a/backend/src/test/unit/controllers/helperLink.test.js +++ b/backend/src/test/unit/controllers/helperLink.test.js @@ -1,689 +1,697 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const sinon = require("sinon"); -const { expect } = require("chai"); -const mocks = require("../../mocks/helperLink.mock.js"); -const helperLinks = require("../../../controllers/helperLink.controller.js"); -const service = require("../../../service/helperLink.service.js"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const mocks = require("../../mocks/helperLink.mock.js"); + const helperLinks = require("../../../controllers/helperLink.controller.js"); + const service = require("../../../service/helperLink.service.js"); -const controller = helperLinks.controller; + const controller = helperLinks.controller; -describe("Test helper link controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - describe("addHelper", () => { - it("should return 400 if title is missing", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink().missingTitle().build(); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "header is required" }], - }); - }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidHeaderBackgroundColor() - .build(); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "headerBackgroundColor must be a valid hex color code", - }, - ], - }); - }); - it("should return 400 if linkFontColor is invalid", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidLinkFontColor() - .build(); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "linkFontColor must be a valid hex color code", - }, - ], - }); - }); - it("should return 400 if iconColor is invalid", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidIconColor() - .build(); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "iconColor must be a valid hex color code", - }, - ], - }); - }); - it("should skip colors validation if colors are not provided", async () => { - const validateColors = sinon.spy(helperLinks, "validateColors"); - req.user = { - id: 1, - }; - serviceMock.createHelper = sinon - .stub(service, "createHelper") - .resolves({}); - const { iconColor, headerBackgroundColor, linkFontColor, ...helper } = - mocks.HelperLinkBuilder.helperLink().build(); - req.body = helper; - await controller.addHelper(req, res); - expect(res.status.called).to.be.true; - expect(res.json.called).to.be.true; - expect(validateColors.called).to.be.false; - }); - it("should skip links validation if links are not provided", async () => { - const validateLinks = sinon.spy(helperLinks, "validateLinks"); - req.params = { - id: "1", - }; - serviceMock.createHelper = sinon - .stub(service, "createHelper") - .resolves({}); - const { links, ...helper } = mocks.HelperLinkBuilder.helperLink().build(); - req.body = helper; - await controller.addHelper(req, res); - expect(res.status.called).to.be.true; - expect(res.json.called).to.be.true; - expect(validateLinks.called).to.be.false; - }); - it("should return 400 if link is missing title", async () => { - req.user = { - id: 1, - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().missingTitle().build()], - }; - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); - }); - it("should return 400 if link is missing url", async () => { - req.user = { - id: 1, - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().missingUrl().build()], - }; - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); - }); - it("should return 400 if link has invalid url", async () => { - req.user = { - id: 1, - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidUrl().build()], - }; - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for url" }], - }); - }); - it("should return 400 if link has invalid order value", async () => { - req.user = { - id: 1, - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidOrderValue().build()], - }; - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); - }); - it("should return 400 if link has invalid order type", async () => { - req.user = { - id: 1, - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidOrderType().build()], - }; - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); - }); - it("should return 500 if service throws error", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink().build(); - serviceMock.addHelper = sinon - .stub(service, "createHelper") - .rejects(new Error("Error creating helper")); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_HELPER_ERROR", - message: "Error creating helper", + describe("Test helper link controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + describe("addHelper", () => { + it("should return 400 if title is missing", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink().missingTitle().build(); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "header is required" }], + }); + }); + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidHeaderBackgroundColor() + .build(); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "headerBackgroundColor must be a valid hex color code", + }, + ], + }); + }); + it("should return 400 if linkFontColor is invalid", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidLinkFontColor() + .build(); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "linkFontColor must be a valid hex color code", + }, + ], + }); + }); + it("should return 400 if iconColor is invalid", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidIconColor() + .build(); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "iconColor must be a valid hex color code", + }, + ], + }); + }); + it("should skip colors validation if colors are not provided", async () => { + const validateColors = sinon.spy(helperLinks, "validateColors"); + req.user = { + id: 1, + }; + serviceMock.createHelper = sinon + .stub(service, "createHelper") + .resolves({}); + const { iconColor, headerBackgroundColor, linkFontColor, ...helper } = + mocks.HelperLinkBuilder.helperLink().build(); + req.body = helper; + await controller.addHelper(req, res); + expect(res.status.called).to.be.true; + expect(res.json.called).to.be.true; + expect(validateColors.called).to.be.false; + }); + it("should skip links validation if links are not provided", async () => { + const validateLinks = sinon.spy(helperLinks, "validateLinks"); + req.params = { + id: "1", + }; + serviceMock.createHelper = sinon + .stub(service, "createHelper") + .resolves({}); + const { links, ...helper } = + mocks.HelperLinkBuilder.helperLink().build(); + req.body = helper; + await controller.addHelper(req, res); + expect(res.status.called).to.be.true; + expect(res.json.called).to.be.true; + expect(validateLinks.called).to.be.false; + }); + it("should return 400 if link is missing title", async () => { + req.user = { + id: 1, + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().missingTitle().build()], + }; + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); + }); + it("should return 400 if link is missing url", async () => { + req.user = { + id: 1, + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().missingUrl().build()], + }; + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); + }); + it("should return 400 if link has invalid url", async () => { + req.user = { + id: 1, + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidUrl().build()], + }; + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for url" }], + }); + }); + it("should return 400 if link has invalid order value", async () => { + req.user = { + id: 1, + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidOrderValue().build()], + }; + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); + }); + it("should return 400 if link has invalid order type", async () => { + req.user = { + id: 1, + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidOrderType().build()], + }; + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); + }); + it("should return 500 if service throws error", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink().build(); + serviceMock.addHelper = sinon + .stub(service, "createHelper") + .rejects(new Error("Error creating helper")); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_HELPER_ERROR", + message: "Error creating helper", + }); + }); + it("should return 201 if all data is valid", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink().build(); + serviceMock.createHelper = sinon + .stub(service, "createHelper") + .resolves(req.body); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(201); + expect(body).to.be.deep.equal(req.body); + }); + }); + describe("deleteHelper", () => { + it("should return 400 if id is missing", async () => { + req.params = {}; + await controller.deleteHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 400 if id is invalid", async () => { + req.params = { + id: "id", + }; + await controller.deleteHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 500 if service throws error", async () => { + req.params = { + id: "1", + }; + serviceMock.deleteHelper = sinon + .stub(service, "deleteHelper") + .rejects(); + await controller.deleteHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_HELPER_ERROR", + message: "Error", + }); + }); + it("should return 404 if helper does not exist", async () => { + req.params = { + id: "1", + }; + serviceMock.deleteHelper = sinon + .stub(service, "deleteHelper") + .resolves(false); + await controller.deleteHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Helper with the specified id does not exist" }], + }); + }); + it("should return 200 if helper is deleted", async () => { + req.params = { + id: "1", + }; + serviceMock.deleteHelper = sinon + .stub(service, "deleteHelper") + .resolves(true); + await controller.deleteHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal({ + message: "Helper with ID 1 deleted successfully", + }); + }); + }); + describe("editHelper", () => { + it("should return 400 if id is missing", async () => { + req.params = {}; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 400 if id is invalid", async () => { + req.params = { + id: "id", + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 400 if title is missing", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink().missingTitle().build(); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "header is required" }], + }); + }); + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidHeaderBackgroundColor() + .build(); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "headerBackgroundColor must be a valid hex color code", + }, + ], + }); + }); + it("should return 400 if linkFontColor is invalid", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidLinkFontColor() + .build(); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "linkFontColor must be a valid hex color code", + }, + ], + }); + }); + it("should return 400 if iconColor is invalid", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidIconColor() + .build(); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "iconColor must be a valid hex color code", + }, + ], + }); + }); + it("should skip colors validation if colors are not provided", async () => { + const validateColors = sinon.spy(helperLinks, "validateColors"); + req.user = { + id: 1, + }; + serviceMock.updateHelper = sinon + .stub(service, "updateHelper") + .resolves({}); + const { iconColor, headerBackgroundColor, linkFontColor, ...helper } = + mocks.HelperLinkBuilder.helperLink().build(); + req.body = helper; + await controller.editHelper(req, res); + expect(res.status.called).to.be.true; + expect(res.json.called).to.be.true; + expect(validateColors.called).to.be.false; + }); + it("should skip links validation if links are not provided", async () => { + const validateLinks = sinon.spy(helperLinks, "validateLinks"); + req.params = { + id: "1", + }; + serviceMock.editHelper = sinon + .stub(service, "updateHelper") + .resolves({}); + const { links, ...helper } = + mocks.HelperLinkBuilder.helperLink().build(); + req.body = helper; + await controller.editHelper(req, res); + expect(res.status.called).to.be.true; + expect(res.json.called).to.be.true; + expect(validateLinks.called).to.be.false; + }); + it("should return 400 if link is missing title", async () => { + req.params = { + id: "1", + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().missingTitle().build()], + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); + }); + it("should return 400 if link is missing url", async () => { + req.params = { + id: "1", + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().missingUrl().build()], + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); + }); + it("should return 400 if link has invalid url", async () => { + req.params = { + id: "1", + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidUrl().build()], + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for url" }], + }); + }); + it("should return 400 if link has invalid order value", async () => { + req.params = { + id: "1", + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidOrderValue().build()], + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); + }); + it("should return 400 if link has invalid order type", async () => { + req.params = { + id: "1", + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidOrderType().build()], + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); + }); + it("should return 500 if service throws error", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink().build(); + serviceMock.editHelper = sinon + .stub(service, "updateHelper") + .rejects(new Error("Error updating helper")); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "EDIT_HELPER_ERROR", + message: "Error updating helper", + }); + }); + it("should return 404 if helper does not exist", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink().build(); + serviceMock.editHelper = sinon + .stub(service, "updateHelper") + .resolves(null); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Helper with the specified id does not exist" }], + }); + }); + it("should return 200 if helper is updated", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink().build(); + serviceMock.editHelper = sinon + .stub(service, "updateHelper") + .resolves(req.body); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(req.body); + }); + }); + describe("getAllHelpers", () => { + it("should return 500 if service throws error", async () => { + serviceMock.getAllHelpers = sinon + .stub(service, "getAllHelpers") + .rejects(); + await controller.getAllHelpers(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_ALL_HELPERS_ERROR", + message: "Error", + }); + }); + it("should return 200 if helpers are found", async () => { + const helpers = mocks.HelperLinkList; + serviceMock.getAllHelpers = sinon + .stub(service, "getAllHelpers") + .resolves(helpers); + await controller.getAllHelpers(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(helpers); + }); + }); + describe("getHelpersByUserId", () => { + req.user = { id: 1 }; + it("should return 500 if service throws error", async () => { + serviceMock.getHelpersByUserId = sinon + .stub(service, "getHelpersByUserId") + .rejects(new Error("Error retrieving helper by ID")); + await controller.getHelpersByUserId(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_HELPERS_ERROR", + message: "Error retrieving helper by ID", + }); + }); + it("should return 200 if helpers are found", async () => { + const helpers = mocks.HelperLinkList.filter((h) => h.createdBy === 1); + serviceMock.getHelpersByUserId = sinon + .stub(service, "getHelpersByUserId") + .resolves(helpers); + await controller.getHelpersByUserId(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(helpers); + }); + }); + describe("getHelperById", () => { + it("should return 400 if id is invalid", async () => { + req.params = { + id: "id", + }; + await controller.getHelperById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid helper ID" }], + }); + }); + it("should return 400 if id is missing", async () => { + req.params = {}; + await controller.getHelperById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid helper ID" }], + }); + }); + it("should return 404 if helper does not exist", async () => { + req.params = { + id: "1", + }; + serviceMock.getHelperById = sinon + .stub(service, "getHelperById") + .resolves(null); + await controller.getHelperById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Helper not found" }], + }); + }); + it("should return 500 if service throws error", async () => { + req.params = { + id: "1", + }; + serviceMock.getHelperById = sinon + .stub(service, "getHelperById") + .rejects(new Error("Error retrieving helper by ID")); + await controller.getHelperById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_HELPER_BY_ID_ERROR", + message: "Error retrieving helper by ID", + }); + }); + it("should return 200 if helper is found", async () => { + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.params = { + id: "1", + }; + serviceMock.getHelperById = sinon + .stub(service, "getHelperById") + .resolves(helper); + await controller.getHelperById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(helper); }); }); - it("should return 201 if all data is valid", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink().build(); - serviceMock.createHelper = sinon - .stub(service, "createHelper") - .resolves(req.body); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(201); - expect(body).to.be.deep.equal(req.body); - }); - }); - describe("deleteHelper", () => { - it("should return 400 if id is missing", async () => { - req.params = {}; - await controller.deleteHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 400 if id is invalid", async () => { - req.params = { - id: "id", - }; - await controller.deleteHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 500 if service throws error", async () => { - req.params = { - id: "1", - }; - serviceMock.deleteHelper = sinon.stub(service, "deleteHelper").rejects(); - await controller.deleteHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_HELPER_ERROR", - message: "Error", - }); - }); - it("should return 404 if helper does not exist", async () => { - req.params = { - id: "1", - }; - serviceMock.deleteHelper = sinon - .stub(service, "deleteHelper") - .resolves(false); - await controller.deleteHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Helper with the specified id does not exist" }], - }); - }); - it("should return 200 if helper is deleted", async () => { - req.params = { - id: "1", - }; - serviceMock.deleteHelper = sinon - .stub(service, "deleteHelper") - .resolves(true); - await controller.deleteHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal({ - message: "Helper with ID 1 deleted successfully", - }); - }); - }); - describe("editHelper", () => { - it("should return 400 if id is missing", async () => { - req.params = {}; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 400 if id is invalid", async () => { - req.params = { - id: "id", - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 400 if title is missing", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink().missingTitle().build(); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "header is required" }], - }); - }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidHeaderBackgroundColor() - .build(); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "headerBackgroundColor must be a valid hex color code", - }, - ], - }); - }); - it("should return 400 if linkFontColor is invalid", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidLinkFontColor() - .build(); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "linkFontColor must be a valid hex color code", - }, - ], - }); - }); - it("should return 400 if iconColor is invalid", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidIconColor() - .build(); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "iconColor must be a valid hex color code", - }, - ], - }); - }); - it("should skip colors validation if colors are not provided", async () => { - const validateColors = sinon.spy(helperLinks, "validateColors"); - req.user = { - id: 1, - }; - serviceMock.updateHelper = sinon - .stub(service, "updateHelper") - .resolves({}); - const { iconColor, headerBackgroundColor, linkFontColor, ...helper } = - mocks.HelperLinkBuilder.helperLink().build(); - req.body = helper; - await controller.editHelper(req, res); - expect(res.status.called).to.be.true; - expect(res.json.called).to.be.true; - expect(validateColors.called).to.be.false; - }); - it("should skip links validation if links are not provided", async () => { - const validateLinks = sinon.spy(helperLinks, "validateLinks"); - req.params = { - id: "1", - }; - serviceMock.editHelper = sinon.stub(service, "updateHelper").resolves({}); - const { links, ...helper } = mocks.HelperLinkBuilder.helperLink().build(); - req.body = helper; - await controller.editHelper(req, res); - expect(res.status.called).to.be.true; - expect(res.json.called).to.be.true; - expect(validateLinks.called).to.be.false; - }); - it("should return 400 if link is missing title", async () => { - req.params = { - id: "1", - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().missingTitle().build()], - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); - }); - it("should return 400 if link is missing url", async () => { - req.params = { - id: "1", - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().missingUrl().build()], - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); - }); - it("should return 400 if link has invalid url", async () => { - req.params = { - id: "1", - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidUrl().build()], - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for url" }], - }); - }); - it("should return 400 if link has invalid order value", async () => { - req.params = { - id: "1", - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidOrderValue().build()], - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); - }); - it("should return 400 if link has invalid order type", async () => { - req.params = { - id: "1", - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidOrderType().build()], - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); - }); - it("should return 500 if service throws error", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink().build(); - serviceMock.editHelper = sinon - .stub(service, "updateHelper") - .rejects(new Error("Error updating helper")); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "EDIT_HELPER_ERROR", - message: "Error updating helper", - }); - }); - it("should return 404 if helper does not exist", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink().build(); - serviceMock.editHelper = sinon - .stub(service, "updateHelper") - .resolves(null); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Helper with the specified id does not exist" }], - }); - }); - it("should return 200 if helper is updated", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink().build(); - serviceMock.editHelper = sinon - .stub(service, "updateHelper") - .resolves(req.body); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(req.body); - }); - }); - describe("getAllHelpers", () => { - it("should return 500 if service throws error", async () => { - serviceMock.getAllHelpers = sinon - .stub(service, "getAllHelpers") - .rejects(); - await controller.getAllHelpers(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_ALL_HELPERS_ERROR", - message: "Error", - }); - }); - it("should return 200 if helpers are found", async () => { - const helpers = mocks.HelperLinkList; - serviceMock.getAllHelpers = sinon - .stub(service, "getAllHelpers") - .resolves(helpers); - await controller.getAllHelpers(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(helpers); - }); - }); - describe("getHelpersByUserId", () => { - req.user = { id: 1 }; - it("should return 500 if service throws error", async () => { - serviceMock.getHelpersByUserId = sinon - .stub(service, "getHelpersByUserId") - .rejects(new Error("Error retrieving helper by ID")); - await controller.getHelpersByUserId(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_HELPERS_ERROR", - message: "Error retrieving helper by ID", - }); - }); - it("should return 200 if helpers are found", async () => { - const helpers = mocks.HelperLinkList.filter((h) => h.createdBy === 1); - serviceMock.getHelpersByUserId = sinon - .stub(service, "getHelpersByUserId") - .resolves(helpers); - await controller.getHelpersByUserId(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(helpers); - }); - }); - describe("getHelperById", () => { - it("should return 400 if id is invalid", async () => { - req.params = { - id: "id", - }; - await controller.getHelperById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid helper ID" }], - }); - }); - it("should return 400 if id is missing", async () => { - req.params = {}; - await controller.getHelperById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid helper ID" }], - }); - }); - it("should return 404 if helper does not exist", async () => { - req.params = { - id: "1", - }; - serviceMock.getHelperById = sinon - .stub(service, "getHelperById") - .resolves(null); - await controller.getHelperById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Helper not found" }], - }); - }); - it("should return 500 if service throws error", async () => { - req.params = { - id: "1", - }; - serviceMock.getHelperById = sinon - .stub(service, "getHelperById") - .rejects(new Error("Error retrieving helper by ID")); - await controller.getHelperById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_HELPER_BY_ID_ERROR", - message: "Error retrieving helper by ID", - }); - }); - it("should return 200 if helper is found", async () => { - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.params = { - id: "1", - }; - serviceMock.getHelperById = sinon - .stub(service, "getHelperById") - .resolves(helper); - await controller.getHelperById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(helper); - }); }); -}); +})(); diff --git a/backend/src/test/unit/controllers/hint.test.js b/backend/src/test/unit/controllers/hint.test.js index 8ac899e9..03157dbb 100644 --- a/backend/src/test/unit/controllers/hint.test.js +++ b/backend/src/test/unit/controllers/hint.test.js @@ -1,448 +1,450 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const sinon = require("sinon"); -const mocks = require("../../mocks/hint.mock.js"); -const { expect } = require("chai"); -const hintService = require("../../../service/hint.service.js"); -const hintController = require("../../../controllers/hint.controller.js"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const mocks = require("../../mocks/hint.mock.js"); + const hintService = require("../../../service/hint.service.js"); + const hintController = require("../../../controllers/hint.controller.js"); -const hint = mocks.HintBuilder.hint; -const hintList = mocks.hintList; + const hint = mocks.HintBuilder.hint; + const hintList = mocks.hintList; -describe("Test hint controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - describe("addHint", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if action is missing", async () => { - req.body = hint(1).missingAction().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "action is required" }], + describe("Test hint controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + describe("addHint", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - }); - it("should return 400 if action is invalid", async () => { - req.body = hint(1).invalidAction().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for action" }], + afterEach(sinon.restore); + it("should return 400 if action is missing", async () => { + req.body = hint(1).missingAction().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "action is required" }], + }); }); - }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.body = hint(1).invalidHeaderBackgroundColor().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for headerBackgroundColor" }], + it("should return 400 if action is invalid", async () => { + req.body = hint(1).invalidAction().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for action" }], + }); }); - }); - it("should return 400 if headerColor is invalid", async () => { - req.body = hint(1).invalidHeaderColor().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for headerColor" }], + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.body = hint(1).invalidHeaderBackgroundColor().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for headerBackgroundColor" }], + }); }); - }); - it("should return 400 if textColor is invalid", async () => { - req.body = hint(1).invalidTextColor().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for textColor" }], + it("should return 400 if headerColor is invalid", async () => { + req.body = hint(1).invalidHeaderColor().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for headerColor" }], + }); }); - }); - it("should return 400 if buttonBackgroundColor is invalid", async () => { - req.body = hint(1).invalidButtonBackgroundColor().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for buttonBackgroundColor" }], + it("should return 400 if textColor is invalid", async () => { + req.body = hint(1).invalidTextColor().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for textColor" }], + }); }); - }); - it("should return 400 if buttonTextColor is invalid", async () => { - req.body = hint(1).invalidButtonTextColor().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for buttonTextColor" }], + it("should return 400 if buttonBackgroundColor is invalid", async () => { + req.body = hint(1).invalidButtonBackgroundColor().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for buttonBackgroundColor" }], + }); }); - }); - it("should return 201 if hint is created", async () => { - req.body = hint(1).build(); - serviceMock.createHint = sinon - .stub(hintService, "createHint") - .resolves(hint(1).build()); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(201); - expect(body).to.be.deep.equal(hint(1).build()); - }); - it("should return 500 if an error occurs", async () => { - req.body = hint(1).build(); - serviceMock.createHint = sinon - .stub(hintService, "createHint") - .rejects(new Error("error")); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_HINT_ERROR", - message: "An unexpected error occurred while creating the hint", + it("should return 400 if buttonTextColor is invalid", async () => { + req.body = hint(1).invalidButtonTextColor().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for buttonTextColor" }], + }); }); - }); - }); - describe("getHints", () => { - beforeEach(() => { - req.user = { id: "1" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 if hints created by the user are retrieved", async () => { - serviceMock.getHints = sinon - .stub(hintService, "getHints") - .resolves(hintList.filter((hint) => hint.createdBy === 1)); - await hintController.getHints(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).not.to.be.deep.equal(hintList); - }); - it("should return 500 if an error occurs", async () => { - serviceMock.getHints = sinon - .stub(hintService, "getHints") - .rejects(new Error("error")); - await hintController.getHints(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_HINTS_ERROR", - message: "An unexpected error occurred while retrieving hints", + it("should return 201 if hint is created", async () => { + req.body = hint(1).build(); + serviceMock.createHint = sinon + .stub(hintService, "createHint") + .resolves(hint(1).build()); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(201); + expect(body).to.be.deep.equal(hint(1).build()); }); - }); - }); - describe("getAllHints", () => { - beforeEach(() => { - req.user = { id: "1" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 if hints are retrieved", async () => { - serviceMock.getAllHints = sinon - .stub(hintService, "getAllHints") - .resolves(hintList); - await hintController.getAllHints(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(hintList); - }); - it("should return 500 if an error occurs", async () => { - serviceMock.getAllHints = sinon - .stub(hintService, "getAllHints") - .rejects(new Error("error")); - await hintController.getAllHints(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_ALL_HINTS_ERROR", - message: "An unexpected error occurred while retrieving hints", + it("should return 500 if an error occurs", async () => { + req.body = hint(1).build(); + serviceMock.createHint = sinon + .stub(hintService, "createHint") + .rejects(new Error("error")); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_HINT_ERROR", + message: "An unexpected error occurred while creating the hint", + }); }); }); - }); - describe("getHintById", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if hint id is missing", async () => { - req.params = {}; - await hintController.getHintById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid hint ID" }], + describe("getHints", () => { + beforeEach(() => { + req.user = { id: "1" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - }); - it("should return 400 if hint id is invalid", async () => { - req.params = { hintId: "invalid" }; - await hintController.getHintById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid hint ID" }], + afterEach(sinon.restore); + it("should return 200 if hints created by the user are retrieved", async () => { + serviceMock.getHints = sinon + .stub(hintService, "getHints") + .resolves(hintList.filter((hint) => hint.createdBy === 1)); + await hintController.getHints(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).not.to.be.deep.equal(hintList); }); - }); - it("should return 200 if hint is retrieved", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(hint(1).build()); - await hintController.getHintById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(hint(1).build()); - }); - it("should return 404 if hint is not found", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(null); - await hintController.getHintById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Hint not found" }], + it("should return 500 if an error occurs", async () => { + serviceMock.getHints = sinon + .stub(hintService, "getHints") + .rejects(new Error("error")); + await hintController.getHints(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_HINTS_ERROR", + message: "An unexpected error occurred while retrieving hints", + }); }); }); - it("should return 500 if an error occurs", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .rejects(new Error("error")); - await hintController.getHintById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_HINT_BY_ID_ERROR", - message: "An unexpected error occurred while retrieving the hint", + describe("getAllHints", () => { + beforeEach(() => { + req.user = { id: "1" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - }); - }); - describe("updateHint", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if action is missing", async () => { - req.body = hint(1).missingAction().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "action is required" }], + afterEach(sinon.restore); + it("should return 200 if hints are retrieved", async () => { + serviceMock.getAllHints = sinon + .stub(hintService, "getAllHints") + .resolves(hintList); + await hintController.getAllHints(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(hintList); }); - }); - it("should return 400 if action is invalid", async () => { - req.body = hint(1).invalidAction().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for action" }], + it("should return 500 if an error occurs", async () => { + serviceMock.getAllHints = sinon + .stub(hintService, "getAllHints") + .rejects(new Error("error")); + await hintController.getAllHints(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_ALL_HINTS_ERROR", + message: "An unexpected error occurred while retrieving hints", + }); }); }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.body = hint(1).invalidHeaderBackgroundColor().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for headerBackgroundColor" }], + describe("getHintById", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - }); - it("should return 400 if headerColor is invalid", async () => { - req.body = hint(1).invalidHeaderColor().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for headerColor" }], + afterEach(sinon.restore); + it("should return 400 if hint id is missing", async () => { + req.params = {}; + await hintController.getHintById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid hint ID" }], + }); }); - }); - it("should return 400 if textColor is invalid", async () => { - req.body = hint(1).invalidTextColor().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for textColor" }], + it("should return 400 if hint id is invalid", async () => { + req.params = { hintId: "invalid" }; + await hintController.getHintById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid hint ID" }], + }); }); - }); - it("should return 400 if buttonBackgroundColor is invalid", async () => { - req.body = hint(1).invalidButtonBackgroundColor().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for buttonBackgroundColor" }], + it("should return 200 if hint is retrieved", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(hint(1).build()); + await hintController.getHintById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(hint(1).build()); }); - }); - it("should return 400 if buttonTextColor is invalid", async () => { - req.body = hint(1).invalidButtonTextColor().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for buttonTextColor" }], + it("should return 404 if hint is not found", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(null); + await hintController.getHintById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Hint not found" }], + }); }); - }); - it("should return 404 if hint is not found", async () => { - req.params = { hintId: "1" }; - req.body = hint(1).build(); - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(null); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Hint not found" }], + it("should return 500 if an error occurs", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .rejects(new Error("error")); + await hintController.getHintById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_HINT_BY_ID_ERROR", + message: "An unexpected error occurred while retrieving the hint", + }); }); }); - it("should return 200 if hint is updated", async () => { - req.params = { hintId: "1" }; - req.body = hint(1).build(); - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(hint(1).build()); - serviceMock.updateHint = sinon - .stub(hintService, "updateHint") - .resolves(hint(1).build()); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(hint(1).build()); - }); - it("should return 500 if an error occurs", async () => { - req.params = { hintId: "1" }; - req.body = hint(1).build(); - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .rejects(new Error("error")); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "UPDATE_HINT_ERROR", - message: "An unexpected error occurred while updating the hint", + describe("updateHint", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - }); - }); - describe("deleteHint", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if hint id is missing", async () => { - req.params = {}; - await hintController.deleteHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid hint ID" }], + afterEach(sinon.restore); + it("should return 400 if action is missing", async () => { + req.body = hint(1).missingAction().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "action is required" }], + }); }); - }); - it("should return 400 if hint id is invalid", async () => { - req.params = { hintId: "invalid" }; - await hintController.deleteHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid hint ID" }], + it("should return 400 if action is invalid", async () => { + req.body = hint(1).invalidAction().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for action" }], + }); }); - }); - it("should return 404 if hint is not found", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "deleteHint") - .resolves(null); - await hintController.deleteHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Hint not found" }], + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.body = hint(1).invalidHeaderBackgroundColor().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for headerBackgroundColor" }], + }); }); - }); - it("should return 200 if hint is deleted", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(hint(1).build()); - serviceMock.deleteHint = sinon - .stub(hintService, "deleteHint") - .resolves(hint(1).build()); - await hintController.deleteHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal({ - message: "Hint with ID 1 deleted successfully", + it("should return 400 if headerColor is invalid", async () => { + req.body = hint(1).invalidHeaderColor().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for headerColor" }], + }); + }); + it("should return 400 if textColor is invalid", async () => { + req.body = hint(1).invalidTextColor().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for textColor" }], + }); + }); + it("should return 400 if buttonBackgroundColor is invalid", async () => { + req.body = hint(1).invalidButtonBackgroundColor().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for buttonBackgroundColor" }], + }); + }); + it("should return 400 if buttonTextColor is invalid", async () => { + req.body = hint(1).invalidButtonTextColor().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for buttonTextColor" }], + }); + }); + it("should return 404 if hint is not found", async () => { + req.params = { hintId: "1" }; + req.body = hint(1).build(); + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(null); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Hint not found" }], + }); + }); + it("should return 200 if hint is updated", async () => { + req.params = { hintId: "1" }; + req.body = hint(1).build(); + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(hint(1).build()); + serviceMock.updateHint = sinon + .stub(hintService, "updateHint") + .resolves(hint(1).build()); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(hint(1).build()); + }); + it("should return 500 if an error occurs", async () => { + req.params = { hintId: "1" }; + req.body = hint(1).build(); + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .rejects(new Error("error")); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "UPDATE_HINT_ERROR", + message: "An unexpected error occurred while updating the hint", + }); }); }); - it("should return 500 if an error occurs", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(1); - serviceMock.deleteHint = sinon - .stub(hintService, "deleteHint") - .rejects(new Error("error")); - await hintController.deleteHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_HINT_ERROR", - message: "An unexpected error occurred while deleting the hint", + describe("deleteHint", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if hint id is missing", async () => { + req.params = {}; + await hintController.deleteHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid hint ID" }], + }); + }); + it("should return 400 if hint id is invalid", async () => { + req.params = { hintId: "invalid" }; + await hintController.deleteHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid hint ID" }], + }); + }); + it("should return 404 if hint is not found", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "deleteHint") + .resolves(null); + await hintController.deleteHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Hint not found" }], + }); + }); + it("should return 200 if hint is deleted", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(hint(1).build()); + serviceMock.deleteHint = sinon + .stub(hintService, "deleteHint") + .resolves(hint(1).build()); + await hintController.deleteHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal({ + message: "Hint with ID 1 deleted successfully", + }); + }); + it("should return 500 if an error occurs", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(1); + serviceMock.deleteHint = sinon + .stub(hintService, "deleteHint") + .rejects(new Error("error")); + await hintController.deleteHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_HINT_ERROR", + message: "An unexpected error occurred while deleting the hint", + }); }); }); }); -}); +})(); diff --git a/backend/src/test/unit/controllers/invite.test.js b/backend/src/test/unit/controllers/invite.test.js index 95449595..f791e04a 100644 --- a/backend/src/test/unit/controllers/invite.test.js +++ b/backend/src/test/unit/controllers/invite.test.js @@ -1,81 +1,85 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const sinon = require("sinon"); -const { validList } = require("../../mocks/user.mock.js"); -const { expect } = require("chai"); -const controller = require("../../../controllers/invite.controller.js"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const { validList } = require("../../mocks/user.mock.js"); + const controller = require("../../../controllers/invite.controller.js"); -const service = controller.inviteService; + const service = controller.inviteService; -const validEmailList = validList.map((it) => ({ - invitedBy: 1, - invitedEmail: it.email, - role: "admin", -})); + const validEmailList = validList.map((it) => ({ + invitedBy: 1, + invitedEmail: it.email, + role: "admin", + })); -describe("Test invite controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("sendTeamInvite - should return status 200 if everything works", async () => { - req.user = { id: 1 }; - req.body = { invitedEmail: "email@email.com", role: "admin" }; - serviceMock.sendInvite = sinon.stub(service, "sendInvite").resolves(); + describe("Test invite controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("sendTeamInvite - should return status 200 if everything works", async () => { + req.user = { id: 1 }; + req.body = { invitedEmail: "email@email.com", role: "admin" }; + serviceMock.sendInvite = sinon.stub(service, "sendInvite").resolves(); - await controller.sendTeamInvite(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal({ - data: null, - message: "Invite sent successfully", - status: 200, + await controller.sendTeamInvite(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal({ + data: null, + message: "Invite sent successfully", + status: 200, + }); }); - }); - it("sendTeamInvite - should return status 500 if something goes wrong", async () => { - req.user = { id: 1 }; - req.body = { invitedEmail: "email@email.com", role: "admin" }; - serviceMock.sendInvite = sinon.stub(service, "sendInvite").rejects(); + it("sendTeamInvite - should return status 500 if something goes wrong", async () => { + req.user = { id: 1 }; + req.body = { invitedEmail: "email@email.com", role: "admin" }; + serviceMock.sendInvite = sinon.stub(service, "sendInvite").rejects(); - await controller.sendTeamInvite(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "SEND_INVITE_ERROR", - message: "Error", + await controller.sendTeamInvite(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "SEND_INVITE_ERROR", + message: "Error", + }); }); - }); - it("getAllInvites - should return all the invites", async () => { - serviceMock.getAllInvites = sinon - .stub(service, "getAllInvites") - .resolves(validEmailList); + it("getAllInvites - should return all the invites", async () => { + serviceMock.getAllInvites = sinon + .stub(service, "getAllInvites") + .resolves(validEmailList); - await controller.getAllInvites(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal({ - invites: validEmailList, - message: "Invites Retrieved Successfully", - success: true, + await controller.getAllInvites(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal({ + invites: validEmailList, + message: "Invites Retrieved Successfully", + success: true, + }); }); - }); - it("getAllInvites - should throw an error if something goes wrong", async () => { - serviceMock.getAllInvites = sinon.stub(service, "getAllInvites").rejects(); + it("getAllInvites - should throw an error if something goes wrong", async () => { + serviceMock.getAllInvites = sinon + .stub(service, "getAllInvites") + .rejects(); - await controller.getAllInvites(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - message: "Error", - success: false, + await controller.getAllInvites(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + message: "Error", + success: false, + }); }); }); -}); +})(); diff --git a/backend/src/test/unit/controllers/link.test.js b/backend/src/test/unit/controllers/link.test.js index 22a013c3..65e21a2c 100644 --- a/backend/src/test/unit/controllers/link.test.js +++ b/backend/src/test/unit/controllers/link.test.js @@ -1,516 +1,524 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const sinon = require("sinon"); -const mocks = require("../../mocks/helperLink.mock.js"); -const { expect } = require("chai"); -const linkService = require("../../../service/link.service.js"); -const linkController = require("../../../controllers/link.controller.js"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const mocks = require("../../mocks/helperLink.mock.js"); + const linkService = require("../../../service/link.service.js"); + const linkController = require("../../../controllers/link.controller.js"); -const link = mocks.LinkBuilder.link; + const link = mocks.LinkBuilder.link; -describe("Test link controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - describe("addLink", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if url is missing", async () => { - req.body = link().missingUrl().build(); - await linkController.addLink(req, res); - const params = res.json.getCall(0).args[0]; - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], + describe("Test link controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + describe("addLink", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - }); - it("should return 400 if title is missing", async () => { - req.body = link().missingTitle().build(); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const params = res.json.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], + afterEach(sinon.restore); + it("should return 400 if url is missing", async () => { + req.body = link().missingUrl().build(); + await linkController.addLink(req, res); + const params = res.json.getCall(0).args[0]; + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); }); - }); - it("should return 400 if title is invalid", async () => { - req.body = link().invalidTitle().build(); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for title or url" }], + it("should return 400 if title is missing", async () => { + req.body = link().missingTitle().build(); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const params = res.json.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); }); - }); - it("should return 400 if url is invalid", async () => { - req.body = link().invalidUrl().build(); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const params = res.json.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for title or url" }], + it("should return 400 if title is invalid", async () => { + req.body = link().invalidTitle().build(); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for title or url" }], + }); }); - }); - it("should return 400 if type of order is invalid", async () => { - req.body = link().invalidOrderType().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const params = res.json.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], + it("should return 400 if url is invalid", async () => { + req.body = link().invalidUrl().build(); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const params = res.json.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for title or url" }], + }); }); - }); - it("should return 400 if order is invalid", async () => { - req.body = link().invalidOrderValue().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], + it("should return 400 if type of order is invalid", async () => { + req.body = link().invalidOrderType().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const params = res.json.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); }); - }); - it("should return 201 if link was created", async () => { - req.body = link().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.createLink = sinon - .stub(linkService, "createLink") - .resolves(req.body); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(201); - expect(params).to.be.deep.equal(req.body); - }); - it("should return 201 if order is not provided", async () => { - req.body = link().missingOrder().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.createLink = sinon - .stub(linkService, "createLink") - .resolves(req.body); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(201); - expect(params).to.be.deep.equal(req.body); - const paramsCreateLink = serviceMock.createLink.getCall(0).args[0]; - const { id, order, ...expected } = req.body; - expect(paramsCreateLink).to.be.deep.equal({ ...expected, order: 1 }); - }); - it("should return 201 if target is not provided", async () => { - req.body = link().missingTarget().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.createLink = sinon - .stub(linkService, "createLink") - .resolves(req.body); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(201); - expect(params).to.be.deep.equal(req.body); - const paramsCreateLink = serviceMock.createLink.getCall(0).args[0]; - const { id, target, ...expected } = req.body; - expect(paramsCreateLink).to.be.deep.equal({ ...expected, target: true }); - }); - it("should return 500 if an error occurs", async () => { - req.body = link().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .rejects(new Error()); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_LINK_ERROR", + it("should return 400 if order is invalid", async () => { + req.body = link().invalidOrderValue().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); }); - }); - }); - describe("deleteLink", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if id is invalid", async () => { - req.params = { id: "id" }; - await linkController.deleteLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], + it("should return 201 if link was created", async () => { + req.body = link().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.createLink = sinon + .stub(linkService, "createLink") + .resolves(req.body); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(201); + expect(params).to.be.deep.equal(req.body); }); - }); - it("should return 400 if id is empty", async () => { - req.params = { id: "" }; - await linkController.deleteLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], + it("should return 201 if order is not provided", async () => { + req.body = link().missingOrder().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.createLink = sinon + .stub(linkService, "createLink") + .resolves(req.body); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(201); + expect(params).to.be.deep.equal(req.body); + const paramsCreateLink = serviceMock.createLink.getCall(0).args[0]; + const { id, order, ...expected } = req.body; + expect(paramsCreateLink).to.be.deep.equal({ ...expected, order: 1 }); }); - }); - it("should return 404 if link was not found", async () => { - req.params = { id: "1" }; - serviceMock.deleteLink = sinon - .stub(linkService, "deleteLink") - .resolves(false); - await linkController.deleteLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(404); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Link with the specified id does not exist" }], + it("should return 201 if target is not provided", async () => { + req.body = link().missingTarget().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.createLink = sinon + .stub(linkService, "createLink") + .resolves(req.body); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(201); + expect(params).to.be.deep.equal(req.body); + const paramsCreateLink = serviceMock.createLink.getCall(0).args[0]; + const { id, target, ...expected } = req.body; + expect(paramsCreateLink).to.be.deep.equal({ + ...expected, + target: true, + }); }); - }); - it("should return 200 if link was deleted", async () => { - req.params = { id: "1" }; - serviceMock.deleteLink = sinon - .stub(linkService, "deleteLink") - .resolves(true); - await linkController.deleteLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal({ - message: "Link with ID 1 deleted successfully", + it("should return 500 if an error occurs", async () => { + req.body = link().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .rejects(new Error()); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_LINK_ERROR", + }); }); }); - it("should return 500 if an error occurs", async () => { - req.params = { id: "1" }; - serviceMock.deleteLink = sinon - .stub(linkService, "deleteLink") - .rejects(new Error()); - await linkController.deleteLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_LINK_ERROR", + describe("deleteLink", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - }); - }); - describe("editLink", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if id is invalid", async () => { - req.params = { id: "id" }; - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], + afterEach(sinon.restore); + it("should return 400 if id is invalid", async () => { + req.params = { id: "id" }; + await linkController.deleteLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); }); - }); - it("should return 400 if id is empty", async () => { - req.params = { id: "" }; - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], + it("should return 400 if id is empty", async () => { + req.params = { id: "" }; + await linkController.deleteLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); }); - }); - it("should return 400 if title is missing", async () => { - req.params = { id: "1" }; - req.body = link().missingTitle().build(); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], + it("should return 404 if link was not found", async () => { + req.params = { id: "1" }; + serviceMock.deleteLink = sinon + .stub(linkService, "deleteLink") + .resolves(false); + await linkController.deleteLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(404); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Link with the specified id does not exist" }], + }); }); - }); - it("should return 400 if url is missing", async () => { - req.params = { id: "1" }; - req.body = link().missingUrl().build(); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], + it("should return 200 if link was deleted", async () => { + req.params = { id: "1" }; + serviceMock.deleteLink = sinon + .stub(linkService, "deleteLink") + .resolves(true); + await linkController.deleteLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal({ + message: "Link with ID 1 deleted successfully", + }); }); - }); - it("should return 400 if title is invalid", async () => { - req.params = { id: "1" }; - req.body = link().invalidTitle().build(); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for title or url" }], + it("should return 500 if an error occurs", async () => { + req.params = { id: "1" }; + serviceMock.deleteLink = sinon + .stub(linkService, "deleteLink") + .rejects(new Error()); + await linkController.deleteLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_LINK_ERROR", + }); }); }); - it("should return 400 if url is invalid", async () => { - req.params = { id: "1" }; - req.body = link().invalidUrl().build(); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for title or url" }], + describe("editLink", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - }); - it("should return 400 if order is invalid", async () => { - req.params = { id: "1" }; - req.body = link().invalidOrderValue().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], + afterEach(sinon.restore); + it("should return 400 if id is invalid", async () => { + req.params = { id: "id" }; + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); }); - }); - it("should return 400 if order type is invalid", async () => { - req.params = { id: "1" }; - req.body = link().invalidOrderType().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], + it("should return 400 if id is empty", async () => { + req.params = { id: "" }; + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); }); - }); - it("should return 200 if order is not provided", async () => { - req.body = link().missingOrder().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.updateLink = sinon - .stub(linkService, "updateLink") - .resolves(req.body); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(req.body); - const paramsUpdateLink = serviceMock.updateLink.getCall(0).args[1]; - const { id, order, ...expected } = req.body; - expect(paramsUpdateLink).to.be.deep.equal({ ...expected, order: 1 }); - }); - it("should return 200 if target is not provided", async () => { - req.body = link().missingTarget().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.updateLink = sinon - .stub(linkService, "updateLink") - .resolves(req.body); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(req.body); - const paramsUpdateLink = serviceMock.updateLink.getCall(0).args[1]; - const { id, target, ...expected } = req.body; - expect(paramsUpdateLink).to.be.deep.equal({ ...expected, target: true }); - }); - it("should return 200 if link was updated", async () => { - req.params = { id: "1" }; - req.body = link().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.updateLink = sinon - .stub(linkService, "updateLink") - .resolves(req.body); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(req.body); - }); - it("should return 500 if an error occurs", async () => { - req.params = { id: "1" }; - req.body = link().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .rejects(new Error()); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "EDIT_LINK_ERROR", + it("should return 400 if title is missing", async () => { + req.params = { id: "1" }; + req.body = link().missingTitle().build(); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); }); - }); - }); - describe("getAllLinks", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 if links were found", async () => { - serviceMock.getAllLinks = sinon - .stub(linkService, "getAllLinks") - .resolves(mocks.LinksList); - await linkController.getAllLinks(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(mocks.LinksList); - }); - it("should return 500 if an error occurs", async () => { - serviceMock.getAllLinks = sinon - .stub(linkService, "getAllLinks") - .rejects(new Error()); - await linkController.getAllLinks(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_ALL_LINKS_ERROR", + it("should return 400 if url is missing", async () => { + req.params = { id: "1" }; + req.body = link().missingUrl().build(); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); }); - }); - }); - describe("getLinksByHelperId", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if helperId is invalid", async () => { - req.query = { helperId: "id" }; - await linkController.getLinksByHelperId(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid helperId" }], + it("should return 400 if title is invalid", async () => { + req.params = { id: "1" }; + req.body = link().invalidTitle().build(); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for title or url" }], + }); }); - }); - it("should return 200 if links were found", async () => { - req.query = { helperId: "1" }; - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves(mocks.LinksList); - await linkController.getLinksByHelperId(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(mocks.LinksList); - }); - it("should return 500 if an error occurs", async () => { - req.query = { helperId: "1" }; - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .rejects(new Error()); - await linkController.getLinksByHelperId(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_LINKS_ERROR", + it("should return 400 if url is invalid", async () => { + req.params = { id: "1" }; + req.body = link().invalidUrl().build(); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for title or url" }], + }); }); - }); - }); - describe("getLinksById", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if id is invalid", async () => { - req.params = { id: "id" }; - await linkController.getLinksById(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid link ID" }], + it("should return 400 if order is invalid", async () => { + req.params = { id: "1" }; + req.body = link().invalidOrderValue().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); }); - }); - it("should return 400 if id is empty", async () => { - req.params = { id: "" }; - await linkController.getLinksById(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid link ID" }], + it("should return 400 if order type is invalid", async () => { + req.params = { id: "1" }; + req.body = link().invalidOrderType().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); + }); + it("should return 200 if order is not provided", async () => { + req.body = link().missingOrder().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.updateLink = sinon + .stub(linkService, "updateLink") + .resolves(req.body); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(req.body); + const paramsUpdateLink = serviceMock.updateLink.getCall(0).args[1]; + const { id, order, ...expected } = req.body; + expect(paramsUpdateLink).to.be.deep.equal({ ...expected, order: 1 }); + }); + it("should return 200 if target is not provided", async () => { + req.body = link().missingTarget().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.updateLink = sinon + .stub(linkService, "updateLink") + .resolves(req.body); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(req.body); + const paramsUpdateLink = serviceMock.updateLink.getCall(0).args[1]; + const { id, target, ...expected } = req.body; + expect(paramsUpdateLink).to.be.deep.equal({ + ...expected, + target: true, + }); + }); + it("should return 200 if link was updated", async () => { + req.params = { id: "1" }; + req.body = link().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.updateLink = sinon + .stub(linkService, "updateLink") + .resolves(req.body); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(req.body); + }); + it("should return 500 if an error occurs", async () => { + req.params = { id: "1" }; + req.body = link().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .rejects(new Error()); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "EDIT_LINK_ERROR", + }); }); }); - it("should return 404 if link was not found", async () => { - req.params = { id: "1" }; - serviceMock.getLinkById = sinon - .stub(linkService, "getLinkById") - .resolves(null); - await linkController.getLinksById(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(404); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Link not found" }], + describe("getAllLinks", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if links were found", async () => { + serviceMock.getAllLinks = sinon + .stub(linkService, "getAllLinks") + .resolves(mocks.LinksList); + await linkController.getAllLinks(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(mocks.LinksList); + }); + it("should return 500 if an error occurs", async () => { + serviceMock.getAllLinks = sinon + .stub(linkService, "getAllLinks") + .rejects(new Error()); + await linkController.getAllLinks(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_ALL_LINKS_ERROR", + }); }); }); - it("should return 200 if link was found", async () => { - req.params = { id: "1" }; - serviceMock.getLinkById = sinon - .stub(linkService, "getLinkById") - .resolves(mocks.LinksList[0]); - await linkController.getLinksById(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(mocks.LinksList[0]); + describe("getLinksByHelperId", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if helperId is invalid", async () => { + req.query = { helperId: "id" }; + await linkController.getLinksByHelperId(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid helperId" }], + }); + }); + it("should return 200 if links were found", async () => { + req.query = { helperId: "1" }; + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves(mocks.LinksList); + await linkController.getLinksByHelperId(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(mocks.LinksList); + }); + it("should return 500 if an error occurs", async () => { + req.query = { helperId: "1" }; + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .rejects(new Error()); + await linkController.getLinksByHelperId(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_LINKS_ERROR", + }); + }); }); - it("should return 500 if an error occurs", async () => { - req.params = { id: "1" }; - serviceMock.getLinkById = sinon - .stub(linkService, "getLinkById") - .rejects(new Error()); - await linkController.getLinksById(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_LINK_BY_ID_ERROR", + describe("getLinksById", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if id is invalid", async () => { + req.params = { id: "id" }; + await linkController.getLinksById(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid link ID" }], + }); + }); + it("should return 400 if id is empty", async () => { + req.params = { id: "" }; + await linkController.getLinksById(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid link ID" }], + }); + }); + it("should return 404 if link was not found", async () => { + req.params = { id: "1" }; + serviceMock.getLinkById = sinon + .stub(linkService, "getLinkById") + .resolves(null); + await linkController.getLinksById(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(404); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Link not found" }], + }); + }); + it("should return 200 if link was found", async () => { + req.params = { id: "1" }; + serviceMock.getLinkById = sinon + .stub(linkService, "getLinkById") + .resolves(mocks.LinksList[0]); + await linkController.getLinksById(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(mocks.LinksList[0]); + }); + it("should return 500 if an error occurs", async () => { + req.params = { id: "1" }; + serviceMock.getLinkById = sinon + .stub(linkService, "getLinkById") + .rejects(new Error()); + await linkController.getLinksById(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_LINK_BY_ID_ERROR", + }); }); }); }); -}); +})(); diff --git a/backend/src/test/unit/controllers/onboarding.test.js b/backend/src/test/unit/controllers/onboarding.test.js index 1cb2f887..b5823f28 100644 --- a/backend/src/test/unit/controllers/onboarding.test.js +++ b/backend/src/test/unit/controllers/onboarding.test.js @@ -1,114 +1,116 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const sinon = require("sinon"); -const { expect } = require("chai"); -const onboardingController = require("../../../controllers/onboarding.controller.js"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const onboardingController = require("../../../controllers/onboarding.controller.js"); -describe("Test onboarding controller", () => { - const req = {}; - const res = {}; - describe("popup", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 and a list with one popup when key is A", async () => { - req.query = { key: "A" }; - await onboardingController.popup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.equal(200); - expect(body).to.deep.equal([ - { - action: "close", - actionButtonColor: "#CCCCCC", - actionButtonText: "Kapat/Close", - contentHtml: "tek content", - font: "14px", - fontColor: "#AAAAAA", - headerBg: "#4F9EBF", - headerText: "test header text", - headerTextColor: "#5F5014", - no: 1, - }, - ]); - expect(body).to.have.length(1); - }); - it("should return 200 and a list with two popups when key is B", async () => { - req.query = { key: "B" }; - await onboardingController.popup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.equal(200); - expect(body).to.deep.equal([ - { - action: "close", - actionButtonColor: "#CCCCCC", - actionButtonText: "Kapat/Close1", - contentHtml: "11", - font: "14px", - fontColor: "#AAAAAA", - headerBg: "#A2A2A2", - headerText: "test header text1", - no: 1, - }, - { - action: "close", - actionButtonColor: "#CCCCCC", - actionButtonText: "Kapat/Close2", - contentHtml: "22", - font: "14px", - fontColor: "#AAAAAA", - headerBg: "#A2A2A2", - headerText: "test header text2", - no: 2, - }, - ]); - expect(body).to.have.length(2); - }); - it("should return 200 and an empty list when key is not A or B", async () => { - req.query = { key: "C" }; - await onboardingController.popup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.equal(200); - expect(body).to.deep.equal([]); - }); - }); - describe("onboard", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 and an object with the user info", async () => { - req.body = { userId: "123" }; - await onboardingController.onboard(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.equal(200); - expect(body).to.deep.equal({ - userId: "123", - popupData: [ + describe("Test onboarding controller", () => { + const req = {}; + const res = {}; + describe("popup", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 and a list with one popup when key is A", async () => { + req.query = { key: "A" }; + await onboardingController.popup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.equal(200); + expect(body).to.deep.equal([ { - no: 1, + action: "close", + actionButtonColor: "#CCCCCC", + actionButtonText: "Kapat/Close", + contentHtml: "tek content", + font: "14px", + fontColor: "#AAAAAA", + headerBg: "#4F9EBF", headerText: "test header text", headerTextColor: "#5F5014", - headerBg: "#4F9EBF", - contentHtml: "tek content", + no: 1, + }, + ]); + expect(body).to.have.length(1); + }); + it("should return 200 and a list with two popups when key is B", async () => { + req.query = { key: "B" }; + await onboardingController.popup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.equal(200); + expect(body).to.deep.equal([ + { + action: "close", + actionButtonColor: "#CCCCCC", + actionButtonText: "Kapat/Close1", + contentHtml: "11", font: "14px", fontColor: "#AAAAAA", + headerBg: "#A2A2A2", + headerText: "test header text1", + no: 1, + }, + { action: "close", - actionButtonText: "Kapat/Close", actionButtonColor: "#CCCCCC", + actionButtonText: "Kapat/Close2", + contentHtml: "22", + font: "14px", + fontColor: "#AAAAAA", + headerBg: "#A2A2A2", + headerText: "test header text2", + no: 2, }, - ], - bannerData: undefined, - tourData: undefined, - linkData: undefined, + ]); + expect(body).to.have.length(2); + }); + it("should return 200 and an empty list when key is not A or B", async () => { + req.query = { key: "C" }; + await onboardingController.popup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.equal(200); + expect(body).to.deep.equal([]); + }); + }); + describe("onboard", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 and an object with the user info", async () => { + req.body = { userId: "123" }; + await onboardingController.onboard(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.equal(200); + expect(body).to.deep.equal({ + userId: "123", + popupData: [ + { + no: 1, + headerText: "test header text", + headerTextColor: "#5F5014", + headerBg: "#4F9EBF", + contentHtml: "tek content", + font: "14px", + fontColor: "#AAAAAA", + action: "close", + actionButtonText: "Kapat/Close", + actionButtonColor: "#CCCCCC", + }, + ], + bannerData: undefined, + tourData: undefined, + linkData: undefined, + }); }); }); }); -}); +})(); diff --git a/backend/src/test/unit/controllers/popup.test.js b/backend/src/test/unit/controllers/popup.test.js index b406e558..c0794277 100644 --- a/backend/src/test/unit/controllers/popup.test.js +++ b/backend/src/test/unit/controllers/popup.test.js @@ -1,491 +1,493 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const sinon = require("sinon"); -const mocks = require("../../mocks/popup.mock.js"); -const { expect } = require("chai"); -const popupService = require("../../../service/popup.service.js"); -const popupController = require("../../../controllers/popup.controller.js"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const mocks = require("../../mocks/popup.mock.js"); + const popupService = require("../../../service/popup.service.js"); + const popupController = require("../../../controllers/popup.controller.js"); -const popup = mocks.PopupBuilder.popup; -const popupList = mocks.popupList; + const popup = mocks.PopupBuilder.popup; + const popupList = mocks.popupList; -describe("Test popup controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - describe("addPopup", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if popupSize is not provided", async () => { - req.body = popup().missingPopupSize().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "popupSize and closeButtonAction are required" }], - }); - }); - it("should return 400 if closeButtonAction is not provided", async () => { - req.body = popup().missingCloseButtonAction().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "popupSize and closeButtonAction are required" }], - }); - }); - it("should return 400 if popupSize is invalid", async () => { - req.body = popup().invalidPopupSize().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for popupSize or closeButtonAction" }], - }); - }); - it("should return 400 if closeButtonAction is invalid", async () => { - req.body = popup().invalidCloseButtonAction().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for popupSize or closeButtonAction" }], - }); - }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.body = popup().invalidHeaderBackgroundColor().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { msg: "headerBackgroundColor must be a valid hex color code" }, - ], - }); - }); - it("should return 400 if headerColor is invalid", async () => { - req.body = popup().invalidHeaderColor().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "headerColor must be a valid hex color code" }], - }); - }); - it("should return 400 if textColor is invalid", async () => { - req.body = popup().invalidTextColor().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "textColor must be a valid hex color code" }], - }); - }); - it("should return 400 if buttonBackgroundColor is invalid", async () => { - req.body = popup().invalidButtonBackgroundColor().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { msg: "buttonBackgroundColor must be a valid hex color code" }, - ], - }); - }); - it("should return 400 if buttonTextColor is invalid", async () => { - req.body = popup().invalidButtonTextColor().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "buttonTextColor must be a valid hex color code" }], - }); - }); - it("should return 201 if popup is created", async () => { - req.body = popup().build(); - serviceMock.createPopup = sinon - .stub(popupService, "createPopup") - .resolves(popup().build()); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(201); - expect(body).to.be.deep.equal(popup().build()); - expect(serviceMock.createPopup.getCall(0).args[0]).to.be.deep.equal({ - ...req.body, - createdBy: req.user.id, - }); - }); - it("should return 500 if popup creation fails", async () => { - req.body = popup().build(); - serviceMock.createPopup = sinon - .stub(popupService, "createPopup") - .rejects(new Error("Internal server error")); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_POPUP_ERROR", - message: "Internal server error", - }); - }); - }); - describe("deletePopup", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if id is not provided", async () => { - req.params = {}; - await popupController.deletePopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 400 if id is invalid", async () => { - req.params = { id: "invalid" }; - await popupController.deletePopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 400 if popup is not found", async () => { - req.params = { id: "123" }; - serviceMock.deletePopup = sinon - .stub(popupService, "deletePopup") - .resolves(null); - await popupController.deletePopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Popup with the specified id does not exist" }], - }); - }); - it("should return 200 if popup is deleted", async () => { - req.params = { id: "123" }; - serviceMock.deletePopup = sinon - .stub(popupService, "deletePopup") - .resolves(popup().build()); - await popupController.deletePopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal({ - message: "Popup with ID 123 deleted successfully", - }); - expect(serviceMock.deletePopup.getCall(0).args[0]).to.be.equal("123"); - }); - it("should return 500 if popup deletion fails", async () => { - req.params = { id: "123" }; - serviceMock.deletePopup = sinon - .stub(popupService, "deletePopup") - .rejects(new Error("Internal server error")); - await popupController.deletePopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_POPUP_ERROR", - message: "Internal server error", - }); - }); - }); - describe("editPopup", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if popupSize is not provided", async () => { - req.params = { id: "123" }; - req.body = popup().missingPopupSize().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "popupSize and closeButtonAction are required" }], - }); - }); - it("should return 400 if closeButtonAction is not provided", async () => { - req.params = { id: "123" }; - req.body = popup().missingCloseButtonAction().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "popupSize and closeButtonAction are required" }], - }); - }); - it("should return 400 if popupSize is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidPopupSize().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for popupSize" }], - }); - }); - it("should return 400 if closeButtonAction is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidCloseButtonAction().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for closeButtonAction" }], - }); - }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidHeaderBackgroundColor().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { msg: "headerBackgroundColor must be a valid hex color code" }, - ], - }); - }); - it("should return 400 if headerColor is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidHeaderColor().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "headerColor must be a valid hex color code" }], - }); - }); - it("should return 400 if textColor is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidTextColor().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "textColor must be a valid hex color code" }], - }); - }); - it("should return 400 if buttonBackgroundColor is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidButtonBackgroundColor().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { msg: "buttonBackgroundColor must be a valid hex color code" }, - ], - }); - }); - it("should return 400 if buttonTextColor is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidButtonTextColor().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "buttonTextColor must be a valid hex color code" }], - }); - }); - it("should return 200 if popup is updated", async () => { - req.body = popup().build(); - req.params = { id: "123" }; - serviceMock.updatePopup = sinon - .stub(popupService, "updatePopup") - .resolves(popup().build()); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(popup().build()); - expect(serviceMock.updatePopup.getCall(0).args).to.be.deep.equal([ - "123", - req.body, - ]); - }); - it("should return 500 if popup update fails", async () => { - req.body = popup().build(); - req.params = { id: "123" }; - serviceMock.updatePopup = sinon - .stub(popupService, "updatePopup") - .rejects(new Error("Internal server error")); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "EDIT_POPUP_ERROR", - message: "Internal server error", - }); - }); - }); - describe("getAllPopups", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 if popups are found", async () => { - serviceMock.getAllPopups = sinon - .stub(popupService, "getAllPopups") - .resolves(popupList); - await popupController.getAllPopups(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(popupList); - }); - it("should return 500 if popups retrieval fails", async () => { - serviceMock.getAllPopups = sinon - .stub(popupService, "getAllPopups") - .rejects(new Error("Internal server error")); - await popupController.getAllPopups(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_ALL_POPUPS_ERROR", - message: "Internal server error", - }); - }); - }); - describe("getPopups", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 if popups are found", async () => { - serviceMock.getPopups = sinon - .stub(popupService, "getPopups") - .resolves(popupList); - await popupController.getPopups(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(popupList); - }); - it("should return 500 if popups retrieval fails", async () => { - serviceMock.getPopups = sinon - .stub(popupService, "getPopups") - .rejects(new Error("Internal server error")); - await popupController.getPopups(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_POPUPS_ERROR", - message: "Internal server error", - }); - }); - }); - describe("getPopupById", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if id is not provided", async () => { - req.params = {}; - await popupController.getPopupById(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid popup ID" }], - }); - }); - it("should return 400 if id is invalid", async () => { - req.params = { id: "invalid" }; - await popupController.getPopupById(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid popup ID" }], - }); - }); - it("should return 404 if popup is not found", async () => { - req.params = { id: "123" }; - serviceMock.getPopupById = sinon - .stub(popupService, "getPopupById") - .resolves(null); - await popupController.getPopupById(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Popup not found" }], - }); - }); - it("should return 200 if popup is found", async () => { - req.params = { id: "123" }; - serviceMock.getPopupById = sinon - .stub(popupService, "getPopupById") - .resolves(popup().build()); - await popupController.getPopupById(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(popup().build()); - }); - it("should return 500 if popup retrieval fails", async () => { - req.params = { id: "123" }; - serviceMock.getPopupById = sinon - .stub(popupService, "getPopupById") - .rejects(new Error("Internal server error")); - await popupController.getPopupById(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_POPUP_BY_ID_ERROR", - message: "Internal server error", + describe("Test popup controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + describe("addPopup", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if popupSize is not provided", async () => { + req.body = popup().missingPopupSize().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "popupSize and closeButtonAction are required" }], + }); + }); + it("should return 400 if closeButtonAction is not provided", async () => { + req.body = popup().missingCloseButtonAction().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "popupSize and closeButtonAction are required" }], + }); + }); + it("should return 400 if popupSize is invalid", async () => { + req.body = popup().invalidPopupSize().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for popupSize or closeButtonAction" }], + }); + }); + it("should return 400 if closeButtonAction is invalid", async () => { + req.body = popup().invalidCloseButtonAction().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for popupSize or closeButtonAction" }], + }); + }); + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.body = popup().invalidHeaderBackgroundColor().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { msg: "headerBackgroundColor must be a valid hex color code" }, + ], + }); + }); + it("should return 400 if headerColor is invalid", async () => { + req.body = popup().invalidHeaderColor().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "headerColor must be a valid hex color code" }], + }); + }); + it("should return 400 if textColor is invalid", async () => { + req.body = popup().invalidTextColor().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "textColor must be a valid hex color code" }], + }); + }); + it("should return 400 if buttonBackgroundColor is invalid", async () => { + req.body = popup().invalidButtonBackgroundColor().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { msg: "buttonBackgroundColor must be a valid hex color code" }, + ], + }); + }); + it("should return 400 if buttonTextColor is invalid", async () => { + req.body = popup().invalidButtonTextColor().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "buttonTextColor must be a valid hex color code" }], + }); + }); + it("should return 201 if popup is created", async () => { + req.body = popup().build(); + serviceMock.createPopup = sinon + .stub(popupService, "createPopup") + .resolves(popup().build()); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(201); + expect(body).to.be.deep.equal(popup().build()); + expect(serviceMock.createPopup.getCall(0).args[0]).to.be.deep.equal({ + ...req.body, + createdBy: req.user.id, + }); + }); + it("should return 500 if popup creation fails", async () => { + req.body = popup().build(); + serviceMock.createPopup = sinon + .stub(popupService, "createPopup") + .rejects(new Error("Internal server error")); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_POPUP_ERROR", + message: "Internal server error", + }); + }); + }); + describe("deletePopup", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if id is not provided", async () => { + req.params = {}; + await popupController.deletePopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 400 if id is invalid", async () => { + req.params = { id: "invalid" }; + await popupController.deletePopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 400 if popup is not found", async () => { + req.params = { id: "123" }; + serviceMock.deletePopup = sinon + .stub(popupService, "deletePopup") + .resolves(null); + await popupController.deletePopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Popup with the specified id does not exist" }], + }); + }); + it("should return 200 if popup is deleted", async () => { + req.params = { id: "123" }; + serviceMock.deletePopup = sinon + .stub(popupService, "deletePopup") + .resolves(popup().build()); + await popupController.deletePopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal({ + message: "Popup with ID 123 deleted successfully", + }); + expect(serviceMock.deletePopup.getCall(0).args[0]).to.be.equal("123"); + }); + it("should return 500 if popup deletion fails", async () => { + req.params = { id: "123" }; + serviceMock.deletePopup = sinon + .stub(popupService, "deletePopup") + .rejects(new Error("Internal server error")); + await popupController.deletePopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_POPUP_ERROR", + message: "Internal server error", + }); + }); + }); + describe("editPopup", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if popupSize is not provided", async () => { + req.params = { id: "123" }; + req.body = popup().missingPopupSize().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "popupSize and closeButtonAction are required" }], + }); + }); + it("should return 400 if closeButtonAction is not provided", async () => { + req.params = { id: "123" }; + req.body = popup().missingCloseButtonAction().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "popupSize and closeButtonAction are required" }], + }); + }); + it("should return 400 if popupSize is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidPopupSize().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for popupSize" }], + }); + }); + it("should return 400 if closeButtonAction is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidCloseButtonAction().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for closeButtonAction" }], + }); + }); + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidHeaderBackgroundColor().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { msg: "headerBackgroundColor must be a valid hex color code" }, + ], + }); + }); + it("should return 400 if headerColor is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidHeaderColor().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "headerColor must be a valid hex color code" }], + }); + }); + it("should return 400 if textColor is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidTextColor().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "textColor must be a valid hex color code" }], + }); + }); + it("should return 400 if buttonBackgroundColor is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidButtonBackgroundColor().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { msg: "buttonBackgroundColor must be a valid hex color code" }, + ], + }); + }); + it("should return 400 if buttonTextColor is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidButtonTextColor().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "buttonTextColor must be a valid hex color code" }], + }); + }); + it("should return 200 if popup is updated", async () => { + req.body = popup().build(); + req.params = { id: "123" }; + serviceMock.updatePopup = sinon + .stub(popupService, "updatePopup") + .resolves(popup().build()); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(popup().build()); + expect(serviceMock.updatePopup.getCall(0).args).to.be.deep.equal([ + "123", + req.body, + ]); + }); + it("should return 500 if popup update fails", async () => { + req.body = popup().build(); + req.params = { id: "123" }; + serviceMock.updatePopup = sinon + .stub(popupService, "updatePopup") + .rejects(new Error("Internal server error")); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "EDIT_POPUP_ERROR", + message: "Internal server error", + }); + }); + }); + describe("getAllPopups", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if popups are found", async () => { + serviceMock.getAllPopups = sinon + .stub(popupService, "getAllPopups") + .resolves(popupList); + await popupController.getAllPopups(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(popupList); + }); + it("should return 500 if popups retrieval fails", async () => { + serviceMock.getAllPopups = sinon + .stub(popupService, "getAllPopups") + .rejects(new Error("Internal server error")); + await popupController.getAllPopups(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_ALL_POPUPS_ERROR", + message: "Internal server error", + }); + }); + }); + describe("getPopups", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if popups are found", async () => { + serviceMock.getPopups = sinon + .stub(popupService, "getPopups") + .resolves(popupList); + await popupController.getPopups(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(popupList); + }); + it("should return 500 if popups retrieval fails", async () => { + serviceMock.getPopups = sinon + .stub(popupService, "getPopups") + .rejects(new Error("Internal server error")); + await popupController.getPopups(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_POPUPS_ERROR", + message: "Internal server error", + }); + }); + }); + describe("getPopupById", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if id is not provided", async () => { + req.params = {}; + await popupController.getPopupById(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid popup ID" }], + }); + }); + it("should return 400 if id is invalid", async () => { + req.params = { id: "invalid" }; + await popupController.getPopupById(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid popup ID" }], + }); + }); + it("should return 404 if popup is not found", async () => { + req.params = { id: "123" }; + serviceMock.getPopupById = sinon + .stub(popupService, "getPopupById") + .resolves(null); + await popupController.getPopupById(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Popup not found" }], + }); + }); + it("should return 200 if popup is found", async () => { + req.params = { id: "123" }; + serviceMock.getPopupById = sinon + .stub(popupService, "getPopupById") + .resolves(popup().build()); + await popupController.getPopupById(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(popup().build()); + }); + it("should return 500 if popup retrieval fails", async () => { + req.params = { id: "123" }; + serviceMock.getPopupById = sinon + .stub(popupService, "getPopupById") + .rejects(new Error("Internal server error")); + await popupController.getPopupById(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_POPUP_BY_ID_ERROR", + message: "Internal server error", + }); }); }); }); -}); +})(); diff --git a/backend/src/test/unit/controllers/team.test.js b/backend/src/test/unit/controllers/team.test.js index 9dd8e699..ebba1e3d 100644 --- a/backend/src/test/unit/controllers/team.test.js +++ b/backend/src/test/unit/controllers/team.test.js @@ -1,253 +1,255 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const { expect } = require("chai"); -const controller = require("../../../controllers/team.controller.js"); -const sinon = require("sinon"); -const userMocks = require("../../mocks/user.mock.js"); -const db = require("../../../models/index.js"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const { expect } = await import("chai"); + const sinon = await import("sinon"); + const controller = require("../../../controllers/team.controller.js"); + const userMocks = require("../../mocks/user.mock.js"); + const db = require("../../../models/index.js"); -const Team = db.Team; -const service = controller.teamService; + const Team = db.Team; + const service = controller.teamService; -describe("Unit test team controller", () => { - const req = {}; - const res = {}; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); + describe("Unit test team controller", () => { + const req = {}; + const res = {}; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); - it("setOrganisation - should return status 400 if no name is passed", async () => { - req.body = {}; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Organisation name is required and should be a non-empty string", - }); - }); - it("setOrganisation - should return status 400 if name is invalid", async () => { - req.body = { - name: 12, - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Organisation name is required and should be a non-empty string", - }); - }); - it("setOrganisation - should return status 400 if name is bigger than 100 characters", async () => { - req.body = { - name: "a".repeat(101), - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Organisation name cannot exceed 100 characters", - }); - }); - it("setOrganisation - should return status 400 if name has invalid characters", async () => { - req.body = { - name: "a$", - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Organisation name contains invalid characters", - }); - }); - it("setOrganisation - should return status 400 if a team is already created", async () => { - sinon.stub(Team, "count").returns(1); - req.body = { - name: "Test", - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Cannot create more than one team.", - }); - }); - it("setOrganisation - should return status 201 and the created team if everything goes right", async () => { - sinon.stub(Team, "count").returns(0); - sinon.stub(service, "createTeam").returns({ - id: 1, - name: "Test", - createdAt: new Date(), - }); - req.body = { - name: "Test", - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(201); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - status: 201, - message: "Organisation created successfully", - data: { + it("setOrganisation - should return status 400 if no name is passed", async () => { + req.body = {}; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Organisation name is required and should be a non-empty string", + }); + }); + it("setOrganisation - should return status 400 if name is invalid", async () => { + req.body = { + name: 12, + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Organisation name is required and should be a non-empty string", + }); + }); + it("setOrganisation - should return status 400 if name is bigger than 100 characters", async () => { + req.body = { + name: "a".repeat(101), + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Organisation name cannot exceed 100 characters", + }); + }); + it("setOrganisation - should return status 400 if name has invalid characters", async () => { + req.body = { + name: "a$", + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Organisation name contains invalid characters", + }); + }); + it("setOrganisation - should return status 400 if a team is already created", async () => { + sinon.stub(Team, "count").returns(1); + req.body = { + name: "Test", + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Cannot create more than one team.", + }); + }); + it("setOrganisation - should return status 201 and the created team if everything goes right", async () => { + sinon.stub(Team, "count").returns(0); + sinon.stub(service, "createTeam").returns({ id: 1, name: "Test", - createdAt: new Intl.DateTimeFormat("en-US").format(new Date()), - }, - }); - }); - it("setOrganisation - should return status 500 if something goes wrong", async () => { - sinon.stub(Team, "count").throws(); - req.body = { - name: "Test", - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_ORG_ERROR", - message: "Error", - }); - }); - it("getTeamCount - should return status 200 if everything goes right", async () => { - sinon.stub(service, "getTeamCount").returns({ teamExists: true }); - await controller.getTeamCount(req, res); - expect(res.status.args[0][0]).to.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - teamExists: true, - }); - }); - it("getTeamCount - should return status 500 if something goes wrong", async () => { - sinon.stub(Team, "count").throws(); - await controller.getTeamCount(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_TEAM_COUNT_ERROR", - message: "Failed to get team count", - }); - }); - it("getTeamDetails - should return status 500 if no team was created", async () => { - sinon.stub(service, "getTeam").returns(null); - await controller.getTeamDetails(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_TEAM_ERROR", - message: "Team data not found", - }); - }); - it("getTeamDetails - should return status 200 and the team and list of users if everything goes right", async () => { - sinon.stub(service, "getTeam").resolves({ - team: { + createdAt: new Date(), + }); + req.body = { name: "Test", - }, - users: userMocks.validList, - }); - await controller.getTeamDetails(req, res); - expect(res.status.args[0][0]).to.equal(200); - const body = res.json.args[0][0]; - expect(body.name).to.equal("Test"); - expect(body.users).to.have.lengthOf(userMocks.validList.length); - expect(body.users).not.to.be.deep.equal(userMocks.validList); - }); - it("getTeamDetails - should return status 500 if something goes wrong", async () => { - sinon.stub(service, "getTeam").rejects(); - await controller.getTeamDetails(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_TEAM_ERROR", - message: "Error", - }); - }); - it("updateTeamDetails - should return status 200 if everything goes right", async () => { - req.body = { - name: "Test", - }; - sinon.stub(service, "updateTeam").resolves(); - await controller.updateTeamDetails(req, res); - expect(res.status.args[0][0]).to.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - message: "Team Details Updated Successfully", - }); - }); - it("updateTeamDetails - should return status 500 if something goes wrong", async () => { - req.body = { - name: "Test", - }; - sinon.stub(service, "updateTeam").rejects(); - await controller.updateTeamDetails(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "UPDATE_TEAM_ERROR", - message: "Error", - }); - }); - it("removeMember - should return status 200 if everything goes right", async () => { - req.params = { - memberId: 1, - }; - req.user = { - id: 1, - }; - sinon.stub(service, "removeUserFromTeam").resolves(); - await controller.removeMember(req, res); - expect(res.status.args[0][0]).to.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - message: "User Removed from Team Successfully", - }); - }); - it("removeMember - should return status 500 if something goes wrong", async () => { - req.params = { - memberId: 1, - }; - req.user = { - id: 1, - }; - sinon.stub(service, "removeUserFromTeam").rejects(); - await controller.removeMember(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "REMOVE_USER_ERROR", - message: "Error", - }); - }); - it("changeRole - should return status 200 if everything goes right", async () => { - req.body = { - userId: 1, - role: "member", - }; - sinon.stub(service, "updateUserRole").resolves(); - await controller.changeRole(req, res); - expect(res.status.args[0][0]).to.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - message: "User Role Updated Successfully", - }); - }); - it("changeRole - should return status 500 if something goes wrong", async () => { - req.body = { - userId: 1, - role: "member", - }; - sinon.stub(service, "updateUserRole").rejects(); - await controller.changeRole(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CHANGE_ROLE_ERROR", - message: "Error", - }); - }); -}); + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(201); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + status: 201, + message: "Organisation created successfully", + data: { + id: 1, + name: "Test", + createdAt: new Intl.DateTimeFormat("en-US").format(new Date()), + }, + }); + }); + it("setOrganisation - should return status 500 if something goes wrong", async () => { + sinon.stub(Team, "count").throws(); + req.body = { + name: "Test", + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_ORG_ERROR", + message: "Error", + }); + }); + it("getTeamCount - should return status 200 if everything goes right", async () => { + sinon.stub(service, "getTeamCount").returns({ teamExists: true }); + await controller.getTeamCount(req, res); + expect(res.status.args[0][0]).to.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + teamExists: true, + }); + }); + it("getTeamCount - should return status 500 if something goes wrong", async () => { + sinon.stub(Team, "count").throws(); + await controller.getTeamCount(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_TEAM_COUNT_ERROR", + message: "Failed to get team count", + }); + }); + it("getTeamDetails - should return status 500 if no team was created", async () => { + sinon.stub(service, "getTeam").returns(null); + await controller.getTeamDetails(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_TEAM_ERROR", + message: "Team data not found", + }); + }); + it("getTeamDetails - should return status 200 and the team and list of users if everything goes right", async () => { + sinon.stub(service, "getTeam").resolves({ + team: { + name: "Test", + }, + users: userMocks.validList, + }); + await controller.getTeamDetails(req, res); + expect(res.status.args[0][0]).to.equal(200); + const body = res.json.args[0][0]; + expect(body.name).to.equal("Test"); + expect(body.users).to.have.lengthOf(userMocks.validList.length); + expect(body.users).not.to.be.deep.equal(userMocks.validList); + }); + it("getTeamDetails - should return status 500 if something goes wrong", async () => { + sinon.stub(service, "getTeam").rejects(); + await controller.getTeamDetails(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_TEAM_ERROR", + message: "Error", + }); + }); + it("updateTeamDetails - should return status 200 if everything goes right", async () => { + req.body = { + name: "Test", + }; + sinon.stub(service, "updateTeam").resolves(); + await controller.updateTeamDetails(req, res); + expect(res.status.args[0][0]).to.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + message: "Team Details Updated Successfully", + }); + }); + it("updateTeamDetails - should return status 500 if something goes wrong", async () => { + req.body = { + name: "Test", + }; + sinon.stub(service, "updateTeam").rejects(); + await controller.updateTeamDetails(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "UPDATE_TEAM_ERROR", + message: "Error", + }); + }); + it("removeMember - should return status 200 if everything goes right", async () => { + req.params = { + memberId: 1, + }; + req.user = { + id: 1, + }; + sinon.stub(service, "removeUserFromTeam").resolves(); + await controller.removeMember(req, res); + expect(res.status.args[0][0]).to.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + message: "User Removed from Team Successfully", + }); + }); + it("removeMember - should return status 500 if something goes wrong", async () => { + req.params = { + memberId: 1, + }; + req.user = { + id: 1, + }; + sinon.stub(service, "removeUserFromTeam").rejects(); + await controller.removeMember(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "REMOVE_USER_ERROR", + message: "Error", + }); + }); + it("changeRole - should return status 200 if everything goes right", async () => { + req.body = { + userId: 1, + role: "member", + }; + sinon.stub(service, "updateUserRole").resolves(); + await controller.changeRole(req, res); + expect(res.status.args[0][0]).to.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + message: "User Role Updated Successfully", + }); + }); + it("changeRole - should return status 500 if something goes wrong", async () => { + req.body = { + userId: 1, + role: "member", + }; + sinon.stub(service, "updateUserRole").rejects(); + await controller.changeRole(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CHANGE_ROLE_ERROR", + message: "Error", + }); + }); + }); +})(); diff --git a/backend/src/test/unit/controllers/tour.test.js b/backend/src/test/unit/controllers/tour.test.js index 65bfa015..0fb603c0 100644 --- a/backend/src/test/unit/controllers/tour.test.js +++ b/backend/src/test/unit/controllers/tour.test.js @@ -1,342 +1,344 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const sinon = require("sinon"); -const mocks = require("../../mocks/tour.mock.js"); -const { expect } = require("chai"); -const tourService = require("../../../service/tour.service.js"); -const tourController = require("../../../controllers/tour.controller.js"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const mocks = require("../../mocks/tour.mock.js"); + const tourService = require("../../../service/tour.service.js"); + const tourController = require("../../../controllers/tour.controller.js"); -const tour = mocks.TourBuilder.tour; + const tour = mocks.TourBuilder.tour; -describe("Test tour controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - describe("addTour", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if title is not provided", async () => { - req.body = tour().missingTitle().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "title, pageTargeting, theme, and triggeringFrequency are required", - }, - ], + describe("Test tour controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + describe("addTour", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - }); - it("should return 400 if pageTargeting is not provided", async () => { - req.body = tour().missingPageTargeting().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "title, pageTargeting, theme, and triggeringFrequency are required", - }, - ], + afterEach(sinon.restore); + it("should return 400 if title is not provided", async () => { + req.body = tour().missingTitle().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "title, pageTargeting, theme, and triggeringFrequency are required", + }, + ], + }); }); - }); - it("should return 400 if theme is not provided", async () => { - req.body = tour().missingTheme().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "title, pageTargeting, theme, and triggeringFrequency are required", - }, - ], + it("should return 400 if pageTargeting is not provided", async () => { + req.body = tour().missingPageTargeting().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "title, pageTargeting, theme, and triggeringFrequency are required", + }, + ], + }); }); - }); - it("should return 400 if triggeringFrequency is not provided", async () => { - req.body = tour().missingTriggeringFrequency().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "title, pageTargeting, theme, and triggeringFrequency are required", - }, - ], + it("should return 400 if theme is not provided", async () => { + req.body = tour().missingTheme().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "title, pageTargeting, theme, and triggeringFrequency are required", + }, + ], + }); }); - }); - it("should return 400 if pageTargeting is invalid", async () => { - req.body = tour().invalidPageTargeting().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", - }, - ], + it("should return 400 if triggeringFrequency is not provided", async () => { + req.body = tour().missingTriggeringFrequency().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "title, pageTargeting, theme, and triggeringFrequency are required", + }, + ], + }); }); - }); - it("should return 400 if theme is invalid", async () => { - req.body = tour().invalidTheme().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", - }, - ], + it("should return 400 if pageTargeting is invalid", async () => { + req.body = tour().invalidPageTargeting().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", + }, + ], + }); }); - }); - it("should return 400 if triggeringFrequency is invalid", async () => { - req.body = tour().invalidTriggeringFrequency().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", - }, - ], + it("should return 400 if theme is invalid", async () => { + req.body = tour().invalidTheme().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", + }, + ], + }); }); - }); - it("should return 201 if all required fields are provided", async () => { - req.body = tour().build(); - serviceMock.createTour = sinon - .stub(tourService, "createTour") - .resolves(tour().build()); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(201); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal(tour().build()); - }); - it("should return 500 if an error occurs", async () => { - req.body = tour().build(); - serviceMock.createTour = sinon - .stub(tourService, "createTour") - .rejects(new Error("error")); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_TOUR_ERROR", - message: "error", + it("should return 400 if triggeringFrequency is invalid", async () => { + req.body = tour().invalidTriggeringFrequency().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", + }, + ], + }); }); - }); - }); - describe("deleteTour", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 404 if tour is not found", async () => { - req.params = { id: "123" }; - serviceMock.deleteTour = sinon - .stub(tourService, "deleteTour") - .resolves(null); - await tourController.deleteTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(404); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ msg: "Tour not found" }); - }); - it("should return 200 if tour is found", async () => { - req.params = { id: "123" }; - serviceMock.deleteTour = sinon - .stub(tourService, "deleteTour") - .resolves(tour().build()); - await tourController.deleteTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(200); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ msg: "Tour deleted successfully" }); - }); - it("should return 500 if an error occurs", async () => { - req.params = { id: "123" }; - serviceMock.deleteTour = sinon - .stub(tourService, "deleteTour") - .rejects(new Error("error")); - await tourController.deleteTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_TOUR_ERROR", - message: "error", + it("should return 201 if all required fields are provided", async () => { + req.body = tour().build(); + serviceMock.createTour = sinon + .stub(tourService, "createTour") + .resolves(tour().build()); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(201); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal(tour().build()); }); - }); - }); - describe("editTour", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 if all required fields are provided", async () => { - req.body = tour().build(); - serviceMock.updateTour = sinon - .stub(tourService, "updateTour") - .resolves(tour().build()); - await tourController.editTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(200); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal(tour().build()); - }); - it("should return 404 if tour is not found", async () => { - req.body = tour().build(); - serviceMock.updateTour = sinon - .stub(tourService, "updateTour") - .resolves(null); - await tourController.editTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(404); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ msg: "Tour not found" }); - }); - it("should return 500 if an error occurs", async () => { - req.body = tour().build(); - serviceMock.updateTour = sinon - .stub(tourService, "updateTour") - .rejects(new Error("error")); - await tourController.editTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "EDIT_TOUR_ERROR", - message: "error", + it("should return 500 if an error occurs", async () => { + req.body = tour().build(); + serviceMock.createTour = sinon + .stub(tourService, "createTour") + .rejects(new Error("error")); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_TOUR_ERROR", + message: "error", + }); }); }); - }); - describe("getAllTours", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 if tours are found", async () => { - serviceMock.getAllTours = sinon - .stub(tourService, "getAllTours") - .resolves(mocks.toursList); - await tourController.getAllTours(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(200); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal(mocks.toursList); - }); - it("should return 500 if an error occurs", async () => { - serviceMock.getAllTours = sinon - .stub(tourService, "getAllTours") - .rejects(new Error("error")); - await tourController.getAllTours(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_TOURS_ERROR", - message: "error", + describe("deleteTour", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - }); - }); - describe("getTours", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 if tours are found", async () => { - req.user = { id: "123" }; - serviceMock.getTours = sinon - .stub(tourService, "getTours") - .resolves(mocks.toursList); - await tourController.getTours(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(200); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal(mocks.toursList); - }); - it("should return 500 if an error occurs", async () => { - req.user = { id: "123" }; - serviceMock.getTours = sinon - .stub(tourService, "getTours") - .rejects(new Error("error")); - await tourController.getTours(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_USER_TOURS_ERROR", - message: "error", + afterEach(sinon.restore); + it("should return 404 if tour is not found", async () => { + req.params = { id: "123" }; + serviceMock.deleteTour = sinon + .stub(tourService, "deleteTour") + .resolves(null); + await tourController.deleteTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(404); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ msg: "Tour not found" }); + }); + it("should return 200 if tour is found", async () => { + req.params = { id: "123" }; + serviceMock.deleteTour = sinon + .stub(tourService, "deleteTour") + .resolves(tour().build()); + await tourController.deleteTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(200); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ msg: "Tour deleted successfully" }); + }); + it("should return 500 if an error occurs", async () => { + req.params = { id: "123" }; + serviceMock.deleteTour = sinon + .stub(tourService, "deleteTour") + .rejects(new Error("error")); + await tourController.deleteTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_TOUR_ERROR", + message: "error", + }); }); }); - }); - describe("getTourById", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + describe("editTour", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if all required fields are provided", async () => { + req.body = tour().build(); + serviceMock.updateTour = sinon + .stub(tourService, "updateTour") + .resolves(tour().build()); + await tourController.editTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(200); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal(tour().build()); + }); + it("should return 404 if tour is not found", async () => { + req.body = tour().build(); + serviceMock.updateTour = sinon + .stub(tourService, "updateTour") + .resolves(null); + await tourController.editTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(404); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ msg: "Tour not found" }); + }); + it("should return 500 if an error occurs", async () => { + req.body = tour().build(); + serviceMock.updateTour = sinon + .stub(tourService, "updateTour") + .rejects(new Error("error")); + await tourController.editTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "EDIT_TOUR_ERROR", + message: "error", + }); + }); }); - afterEach(sinon.restore); - it("should return 404 if tour is not found", async () => { - req.params = { id: "123" }; - serviceMock.getTourById = sinon - .stub(tourService, "getTourById") - .resolves(null); - await tourController.getTourById(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(404); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ msg: "Tour not found" }); + describe("getAllTours", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if tours are found", async () => { + serviceMock.getAllTours = sinon + .stub(tourService, "getAllTours") + .resolves(mocks.toursList); + await tourController.getAllTours(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(200); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal(mocks.toursList); + }); + it("should return 500 if an error occurs", async () => { + serviceMock.getAllTours = sinon + .stub(tourService, "getAllTours") + .rejects(new Error("error")); + await tourController.getAllTours(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_TOURS_ERROR", + message: "error", + }); + }); }); - it("should return 200 if tour is found", async () => { - req.params = { id: "123" }; - serviceMock.getTourById = sinon - .stub(tourService, "getTourById") - .resolves(tour().build()); - await tourController.getTourById(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(200); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal(tour().build()); + describe("getTours", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if tours are found", async () => { + req.user = { id: "123" }; + serviceMock.getTours = sinon + .stub(tourService, "getTours") + .resolves(mocks.toursList); + await tourController.getTours(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(200); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal(mocks.toursList); + }); + it("should return 500 if an error occurs", async () => { + req.user = { id: "123" }; + serviceMock.getTours = sinon + .stub(tourService, "getTours") + .rejects(new Error("error")); + await tourController.getTours(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_USER_TOURS_ERROR", + message: "error", + }); + }); }); - it("should return 500 if an error occurs", async () => { - req.params = { id: "123" }; - serviceMock.getTourById = sinon - .stub(tourService, "getTourById") - .rejects(new Error("error")); - await tourController.getTourById(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_TOUR_BY_ID_ERROR", - message: "error", + describe("getTourById", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 404 if tour is not found", async () => { + req.params = { id: "123" }; + serviceMock.getTourById = sinon + .stub(tourService, "getTourById") + .resolves(null); + await tourController.getTourById(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(404); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ msg: "Tour not found" }); + }); + it("should return 200 if tour is found", async () => { + req.params = { id: "123" }; + serviceMock.getTourById = sinon + .stub(tourService, "getTourById") + .resolves(tour().build()); + await tourController.getTourById(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(200); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal(tour().build()); + }); + it("should return 500 if an error occurs", async () => { + req.params = { id: "123" }; + serviceMock.getTourById = sinon + .stub(tourService, "getTourById") + .rejects(new Error("error")); + await tourController.getTourById(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_TOUR_BY_ID_ERROR", + message: "error", + }); }); }); }); -}); +})(); diff --git a/backend/src/test/unit/controllers/user.test.js b/backend/src/test/unit/controllers/user.test.js index 2d10c2f2..738c5fb8 100644 --- a/backend/src/test/unit/controllers/user.test.js +++ b/backend/src/test/unit/controllers/user.test.js @@ -1,171 +1,175 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const { expect } = require("chai"); -const { userService } = require("../../../controllers/user.controller.js"); -const controller = require("../../../controllers/user.controller.js"); -const sinon = require("sinon"); -const mocks = require("../../mocks/user.mock.js"); -const settings = require("../../../../config/settings.js"); -const { validationResult } = require("express-validator"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const { expect } = await import("chai"); + const sinon = await import("sinon"); + const { userService } = require("../../../controllers/user.controller.js"); + const controller = require("../../../controllers/user.controller.js"); + const mocks = require("../../mocks/user.mock.js"); + const settings = require("../../../../config/settings.js"); -describe("Unit test user controller", () => { - const req = {}; - const res = {}; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("getUsersList - if everything goes right, should return a list of users with pagination and status code 200", async () => { - const users = sinon - .stub(userService, "getUsers") - .resolves({ rows: mocks.validList.slice(0, 2), count: 5 }); - req.query = { page: 1, limit: 2, search: "Jane" }; - await controller.getUsersList(req, res); - expect(users.calledWith({ page: 1, limit: 2, search: "Jane" })).to.be.true; - expect(res.status.args[0][0]).to.be.equal(200); - expect(res.json.args[0][0]).to.be.deep.equal({ - users: mocks.validList.slice(0, 2).map((user) => ({ - name: user.name, - surname: user.surname, - email: user.email, - role: settings.user.roleName[user.role], - })), - totalPages: 3, - currentPage: 1, - totalUsers: 5, + describe("Unit test user controller", () => { + const req = {}; + const res = {}; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - }); - it("getUsersList - if something goes wrong, should return status code 500 and the title error code GET_USER_LIST_ERROR", async () => { - sinon.stub(userService, "getUsers").rejects(); - req.query = { page: 1, limit: 2, search: "Jane" }; - await controller.getUsersList(req, res); - expect(res.status.args[0][0]).to.be.equal(500); - expect(res.json.args[0][0]).to.be.deep.equal({ - error: "Internal Server Error", - message: "Error", - errorCode: "GET_USER_LIST_ERROR", + afterEach(sinon.restore); + it("getUsersList - if everything goes right, should return a list of users with pagination and status code 200", async () => { + const users = sinon + .stub(userService, "getUsers") + .resolves({ rows: mocks.validList.slice(0, 2), count: 5 }); + req.query = { page: 1, limit: 2, search: "Jane" }; + await controller.getUsersList(req, res); + expect(users.calledWith({ page: 1, limit: 2, search: "Jane" })).to.be + .true; + expect(res.status.args[0][0]).to.be.equal(200); + expect(res.json.args[0][0]).to.be.deep.equal({ + users: mocks.validList.slice(0, 2).map((user) => ({ + name: user.name, + surname: user.surname, + email: user.email, + role: settings.user.roleName[user.role], + })), + totalPages: 3, + currentPage: 1, + totalUsers: 5, + }); }); - }); - it("getCurrentUser - if everything goes right, should return the user without the password", async () => { - const users = sinon.stub(userService, "getUser").resolves(mocks.validUser); - req.user = mocks.validUser; - await controller.getCurrentUser(req, res); - expect(users.calledWith(1)).to.be.true; - expect(res.status.args[0][0]).to.be.equal(200); - expect(res.json.args[0][0]).not.to.be.deep.equal(mocks.validUser); - expect(res.json.args[0][0]).not.to.have.property("password"); - }); - it("getCurrentUser - if the user is not found, should return status code 400 and the error 'User not found'", async () => { - const users = sinon.stub(userService, "getUser").resolves(null); - req.user = mocks.validUser; - await controller.getCurrentUser(req, res); - expect(users.calledWith(1)).to.be.true; - expect(res.status.args[0][0]).to.be.equal(400); - expect(res.json.args[0][0]).to.be.deep.equal({ error: "User not found" }); - }); - it("getCurrentUser - if something goes wrong, should return status code 500 and the title error code GET_USER_ERROR", async () => { - const users = sinon.stub(userService, "getUser").rejects(); - req.user = mocks.validUser; - await controller.getCurrentUser(req, res); - expect(users.calledWith(1)).to.be.true; - expect(res.status.args[0][0]).to.be.equal(500); - expect(res.json.args[0][0]).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_USER_ERROR", - message: "Error", + it("getUsersList - if something goes wrong, should return status code 500 and the title error code GET_USER_LIST_ERROR", async () => { + sinon.stub(userService, "getUsers").rejects(); + req.query = { page: 1, limit: 2, search: "Jane" }; + await controller.getUsersList(req, res); + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + message: "Error", + errorCode: "GET_USER_LIST_ERROR", + }); }); - }); - it("updateUserDetails - if everything goes right, should return the updated user without the password", async () => { - const users = sinon - .stub(userService, "updateUser") - .resolves(mocks.validUser); - req.user = mocks.validUser; - req.body = { - name: "Joana", - surname: "D'ark", - }; - await controller.updateUserDetails(req, res); - expect(users.args[0]).to.be.deep.equal([ - 1, - { name: "Joana", surname: "D'ark" }, - ]); - expect(res.status.args[0][0]).to.be.equal(200); - expect(res.json.args[0][0]).to.be.deep.equal({ - updated: true, - user: { - name: "Jane", - surname: "Doe", - }, + it("getCurrentUser - if everything goes right, should return the user without the password", async () => { + const users = sinon + .stub(userService, "getUser") + .resolves(mocks.validUser); + req.user = mocks.validUser; + await controller.getCurrentUser(req, res); + expect(users.calledWith(1)).to.be.true; + expect(res.status.args[0][0]).to.be.equal(200); + expect(res.json.args[0][0]).not.to.be.deep.equal(mocks.validUser); + expect(res.json.args[0][0]).not.to.have.property("password"); }); - }); - it("updateUserDetails - if something goes wrong, should return status code 500 and the title error code UPDATE_USER_ERROR", async () => { - const users = sinon.stub(userService, "updateUser").rejects(); - req.user = mocks.validUser; - req.body = { - name: "Joana", - surname: "D'ark", - }; - await controller.updateUserDetails(req, res); - expect(users.args[0]).to.be.deep.equal([ - 1, - { name: "Joana", surname: "D'ark" }, - ]); - expect(res.status.args[0][0]).to.be.equal(500); - expect(res.json.args[0][0]).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "UPDATE_USER_ERROR", - message: "Error", + it("getCurrentUser - if the user is not found, should return status code 400 and the error 'User not found'", async () => { + const users = sinon.stub(userService, "getUser").resolves(null); + req.user = mocks.validUser; + await controller.getCurrentUser(req, res); + expect(users.calledWith(1)).to.be.true; + expect(res.status.args[0][0]).to.be.equal(400); + expect(res.json.args[0][0]).to.be.deep.equal({ error: "User not found" }); }); - }); - it("deleteUser - if everything goes right, should return the message 'User deleted successfully'", async () => { - const users = sinon.stub(userService, "deleteUser").resolves(); - req.user = mocks.validUser; - await controller.deleteUser(req, res); - expect(users.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(200); - expect(res.json.args[0][0]).to.be.deep.equal({ - message: "User deleted successfully", + it("getCurrentUser - if something goes wrong, should return status code 500 and the title error code GET_USER_ERROR", async () => { + const users = sinon.stub(userService, "getUser").rejects(); + req.user = mocks.validUser; + await controller.getCurrentUser(req, res); + expect(users.calledWith(1)).to.be.true; + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_USER_ERROR", + message: "Error", + }); }); - }); - it("deleteUser - if something goes wrong, should return status code 500 and the title error code DELETE_USER_ERROR", async () => { - const users = sinon.stub(userService, "deleteUser").rejects(); - req.user = mocks.validUser; - await controller.deleteUser(req, res); - expect(users.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(500); - expect(res.json.args[0][0]).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_USER_ERROR", - message: "Error", + it("updateUserDetails - if everything goes right, should return the updated user without the password", async () => { + const users = sinon + .stub(userService, "updateUser") + .resolves(mocks.validUser); + req.user = mocks.validUser; + req.body = { + name: "Joana", + surname: "D'ark", + }; + await controller.updateUserDetails(req, res); + expect(users.args[0]).to.be.deep.equal([ + 1, + { name: "Joana", surname: "D'ark" }, + ]); + expect(res.status.args[0][0]).to.be.equal(200); + expect(res.json.args[0][0]).to.be.deep.equal({ + updated: true, + user: { + name: "Jane", + surname: "Doe", + }, + }); }); - }); - describe("test the user middlewares", () => { - let next; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + it("updateUserDetails - if something goes wrong, should return status code 500 and the title error code UPDATE_USER_ERROR", async () => { + const users = sinon.stub(userService, "updateUser").rejects(); + req.user = mocks.validUser; + req.body = { + name: "Joana", + surname: "D'ark", + }; + await controller.updateUserDetails(req, res); + expect(users.args[0]).to.be.deep.equal([ + 1, + { name: "Joana", surname: "D'ark" }, + ]); + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "UPDATE_USER_ERROR", + message: "Error", + }); }); - afterEach(sinon.restore); - it("checkAtLeastOneField - should return status 400 if all of 'name', 'surname' and 'picture' are empty", async () => { - next = sinon.stub(); + it("deleteUser - if everything goes right, should return the message 'User deleted successfully'", async () => { + const users = sinon.stub(userService, "deleteUser").resolves(); req.user = mocks.validUser; - req.body = {}; - await controller.checkAtLeastOneField(req, res); - expect(res.status.args[0][0]).to.be.equal(400); + await controller.deleteUser(req, res); + expect(users.called).to.be.true; + expect(res.status.args[0][0]).to.be.equal(200); expect(res.json.args[0][0]).to.be.deep.equal({ - updated: false, - error: "Error, no value(s) provided to update", + message: "User deleted successfully", }); - expect(next.called).to.be.false; }); - it("checkAtLeastOneField - should move on if one of the fields is provided", async () => { - next = sinon.stub(); + it("deleteUser - if something goes wrong, should return status code 500 and the title error code DELETE_USER_ERROR", async () => { + const users = sinon.stub(userService, "deleteUser").rejects(); req.user = mocks.validUser; - req.body = { name: "Jane" }; - await controller.checkAtLeastOneField(req, res, next); - expect(res.status.called).to.be.false; - expect(res.json.called).to.be.false; - expect(next.called).to.be.true; + await controller.deleteUser(req, res); + expect(users.called).to.be.true; + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_USER_ERROR", + message: "Error", + }); + }); + describe("test the user middlewares", () => { + let next; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("checkAtLeastOneField - should return status 400 if all of 'name', 'surname' and 'picture' are empty", async () => { + next = sinon.stub(); + req.user = mocks.validUser; + req.body = {}; + await controller.checkAtLeastOneField(req, res); + expect(res.status.args[0][0]).to.be.equal(400); + expect(res.json.args[0][0]).to.be.deep.equal({ + updated: false, + error: "Error, no value(s) provided to update", + }); + expect(next.called).to.be.false; + }); + it("checkAtLeastOneField - should move on if one of the fields is provided", async () => { + next = sinon.stub(); + req.user = mocks.validUser; + req.body = { name: "Jane" }; + await controller.checkAtLeastOneField(req, res, next); + expect(res.status.called).to.be.false; + expect(res.json.called).to.be.false; + expect(next.called).to.be.true; + }); }); }); -}); +})(); From 18302dd12a93838e2b4214a8d11493e1e5cc6ca0 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Fri, 6 Dec 2024 13:31:02 -0800 Subject: [PATCH 117/178] test: add dynamic import to service tests --- backend/src/test/unit/services/banner.test.js | 200 +++---- backend/src/test/unit/services/email.test.js | 188 +++---- .../src/test/unit/services/helperLink.test.js | 482 ++++++++--------- backend/src/test/unit/services/hint.test.js | 315 ++++++----- backend/src/test/unit/services/invite.test.js | 158 +++--- backend/src/test/unit/services/link.test.js | 247 ++++----- backend/src/test/unit/services/popup.test.js | 250 ++++----- backend/src/test/unit/services/team.test.js | 380 ++++++------- backend/src/test/unit/services/tour.test.js | 214 ++++---- backend/src/test/unit/services/user.test.js | 497 +++++++++--------- 10 files changed, 1499 insertions(+), 1432 deletions(-) diff --git a/backend/src/test/unit/services/banner.test.js b/backend/src/test/unit/services/banner.test.js index a1fa1724..d740f963 100644 --- a/backend/src/test/unit/services/banner.test.js +++ b/backend/src/test/unit/services/banner.test.js @@ -1,105 +1,109 @@ -const { describe, it, afterEach } = require("mocha"); -const { expect } = require("chai"); -const db = require("../../../models/index.js"); -const service = require("../../../service/banner.service"); -const sinon = require("sinon"); -const { BannerBuilder, validList } = require("../../mocks/banner.mock.js"); +(async () => { + const { describe, it, afterEach } = await import("mocha"); + const { expect } = await import("chai"); + const sinon = await import("sinon"); + const db = require("../../../models/index.js"); + const service = require("../../../service/banner.service"); + const { BannerBuilder, validList } = require("../../mocks/banner.mock.js"); -const Banner = db.Banner; -const banner = BannerBuilder.banner; + const Banner = db.Banner; + const banner = BannerBuilder.banner; -describe("Test Banner service", () => { - const BannerMock = {}; - afterEach(sinon.restore); - it("getAllBanners - should return all the banners", async () => { - BannerMock.findAll = sinon.stub(Banner, "findAll").resolves(validList); - const result = await service.getAllBanners(); - expect(result).to.be.deep.equal(validList); - const params = BannerMock.findAll.args[0][0]; - expect(params).to.be.deep.equal({ - include: [{ model: db.User, as: "creator" }], + describe("Test Banner service", () => { + const BannerMock = {}; + afterEach(sinon.restore); + it("getAllBanners - should return all the banners", async () => { + BannerMock.findAll = sinon.stub(Banner, "findAll").resolves(validList); + const result = await service.getAllBanners(); + expect(result).to.be.deep.equal(validList); + const params = BannerMock.findAll.args[0][0]; + expect(params).to.be.deep.equal({ + include: [{ model: db.User, as: "creator" }], + }); }); - }); - it("getBanners - should return the banners created by the userId", async () => { - BannerMock.findAll = sinon - .stub(Banner, "findAll") - .resolves(validList.filter((it) => it.createdBy === 2)); - const result = await service.getBanners(2); - expect(result).not.to.be.deep.equal(validList); - const params = BannerMock.findAll.args[0][0]; - expect(params).to.be.deep.equal({ - where: { - createdBy: 2, - }, - include: [{ model: db.User, as: "creator" }], + it("getBanners - should return the banners created by the userId", async () => { + BannerMock.findAll = sinon + .stub(Banner, "findAll") + .resolves(validList.filter((it) => it.createdBy === 2)); + const result = await service.getBanners(2); + expect(result).not.to.be.deep.equal(validList); + const params = BannerMock.findAll.args[0][0]; + expect(params).to.be.deep.equal({ + where: { + createdBy: 2, + }, + include: [{ model: db.User, as: "creator" }], + }); }); - }); - it("createBanner - should return the created banner", async () => { - BannerMock.create = sinon.stub(Banner, "create").resolves(banner().build()); - const result = await service.createBanner({ bannerText: "hello world" }); - expect(result).to.be.deep.equal(banner().build()); - const params = BannerMock.create.args[0][0]; - expect(params).to.be.deep.equal({ bannerText: "hello world" }); - }); - it("deleteBanner - should return true if the banner is deleted", async () => { - BannerMock.destroy = sinon.stub(Banner, "destroy").resolves(1); - const result = await service.deleteBanner(1); - expect(result).to.be.true; - const params = BannerMock.destroy.args[0][0]; - expect(params).to.be.deep.equal({ where: { id: 1 } }); - }); - it("deleteBanner - should return false if the banner is not deleted", async () => { - BannerMock.destroy = sinon.stub(Banner, "destroy").resolves(0); - const result = await service.deleteBanner(1); - expect(result).to.be.false; - const params = BannerMock.destroy.args[0][0]; - expect(params).to.be.deep.equal({ where: { id: 1 } }); - }); - it("updateBanner - should return null if no banners are updated", async () => { - BannerMock.update = sinon.stub(Banner, "update").resolves([0, [null]]); - const data = { bannerText: "hello world" }; - const result = await service.updateBanner(1, data); - expect(result).to.be.null; - const params = BannerMock.update.args[0]; - expect(params).to.be.deep.equal([ - data, - { where: { id: 1 }, returning: true } - ]); - }); - it("updateBanner - should return the updated banner", async () => { - BannerMock.update = sinon - .stub(Banner, "update") - .resolves([1, [banner().build()]]); - const data = { bannerText: "hello world" }; - const result = await service.updateBanner(1, data); - expect(result).to.be.deep.equal(banner().build()); - const params = BannerMock.update.args[0]; - expect(params).to.be.deep.equal([ - data, - { + it("createBanner - should return the created banner", async () => { + BannerMock.create = sinon + .stub(Banner, "create") + .resolves(banner().build()); + const result = await service.createBanner({ bannerText: "hello world" }); + expect(result).to.be.deep.equal(banner().build()); + const params = BannerMock.create.args[0][0]; + expect(params).to.be.deep.equal({ bannerText: "hello world" }); + }); + it("deleteBanner - should return true if the banner is deleted", async () => { + BannerMock.destroy = sinon.stub(Banner, "destroy").resolves(1); + const result = await service.deleteBanner(1); + expect(result).to.be.true; + const params = BannerMock.destroy.args[0][0]; + expect(params).to.be.deep.equal({ where: { id: 1 } }); + }); + it("deleteBanner - should return false if the banner is not deleted", async () => { + BannerMock.destroy = sinon.stub(Banner, "destroy").resolves(0); + const result = await service.deleteBanner(1); + expect(result).to.be.false; + const params = BannerMock.destroy.args[0][0]; + expect(params).to.be.deep.equal({ where: { id: 1 } }); + }); + it("updateBanner - should return null if no banners are updated", async () => { + BannerMock.update = sinon.stub(Banner, "update").resolves([0, [null]]); + const data = { bannerText: "hello world" }; + const result = await service.updateBanner(1, data); + expect(result).to.be.null; + const params = BannerMock.update.args[0]; + expect(params).to.be.deep.equal([ + data, + { where: { id: 1 }, returning: true }, + ]); + }); + it("updateBanner - should return the updated banner", async () => { + BannerMock.update = sinon + .stub(Banner, "update") + .resolves([1, [banner().build()]]); + const data = { bannerText: "hello world" }; + const result = await service.updateBanner(1, data); + expect(result).to.be.deep.equal(banner().build()); + const params = BannerMock.update.args[0]; + expect(params).to.be.deep.equal([ + data, + { + where: { id: 1 }, + returning: true, + }, + ]); + }); + it("getBannerById - should return the found banner", async () => { + BannerMock.findOne = sinon + .stub(Banner, "findOne") + .resolves(banner().build()); + const result = await service.getBannerById(1); + expect(result).to.be.deep.equal(banner().build()); + const params = BannerMock.findOne.args[0][0]; + expect(params).to.be.deep.equal({ where: { id: 1 }, - returning: true, - }, - ]); - }); - it("getBannerById - should return the found banner", async () => { - BannerMock.findOne = sinon - .stub(Banner, "findOne") - .resolves(banner().build()); - const result = await service.getBannerById(1); - expect(result).to.be.deep.equal(banner().build()); - const params = BannerMock.findOne.args[0][0]; - expect(params).to.be.deep.equal({ - where: { id: 1 }, + }); + }); + it("getBannerById - if something goes wrong, should throw an error", async () => { + BannerMock.findOne = sinon.stub(Banner, "findOne").rejects(); + try { + await service.getBannerById(1); + } catch (error) { + expect(error).to.be.instanceOf(Error); + expect(error.message).to.be.equal("Error retrieving banner by ID"); + } }); }); - it("getBannerById - if something goes wrong, should throw an error", async () => { - BannerMock.findOne = sinon.stub(Banner, "findOne").rejects(); - try { - await service.getBannerById(1); - } catch (error) { - expect(error).to.be.instanceOf(Error); - expect(error.message).to.be.equal("Error retrieving banner by ID"); - } - }); -}); +})(); diff --git a/backend/src/test/unit/services/email.test.js b/backend/src/test/unit/services/email.test.js index 45689d25..658c7e42 100644 --- a/backend/src/test/unit/services/email.test.js +++ b/backend/src/test/unit/services/email.test.js @@ -1,99 +1,101 @@ -const { describe, it, afterEach, beforeEach, before, after } = require("mocha"); -const { expect } = require("chai"); -const sinon = require("sinon"); -const service = require("../../../service/email.service.js"); -const fs = require("fs"); -const path = require("path"); -const { UserBuilder } = require("../../mocks/user.mock.js"); -const handlebars = require("handlebars"); +(async () => { + const { describe, it, afterEach, beforeEach, before, after } = await import("mocha"); + const { expect } = await import("chai"); + const sinon = await import("sinon"); + const service = require("../../../service/email.service.js"); + const fs = require("fs"); + const path = require("path"); + const { UserBuilder } = require("../../mocks/user.mock.js"); + const handlebars = require("handlebars"); -const db = require("../../../models/index.js"); -const User = db.User; -const user = UserBuilder.user; + const db = require("../../../models/index.js"); + const User = db.User; + const user = UserBuilder.user; -describe("Test email service", () => { - let readFile; - let transporterMock; - let envOrig; - before(() => { - envOrig = JSON.stringify(process.env); - }); + describe("Test email service", () => { + let readFile; + let transporterMock; + let envOrig; + before(() => { + envOrig = JSON.stringify(process.env); + }); - after(() => { - process.env = JSON.parse(envOrig); - }); - beforeEach(() => { - readFile = sinon.stub(fs, "readFileSync"); - transporterMock = sinon.stub(service.transporter, "sendMail"); - sinon.stub(path, "join").callsFake((...args) => args.join("/")); - sinon - .stub(handlebars, "compile") - .callsFake((html) => (replacements) => html); - }); - afterEach(sinon.restore); - it("findUserByEmail - should return the user if it is found", async () => { - User.findOne = sinon.stub(User, "findOne").resolves(user().build()); - const result = await service.findUserByEmail(user().build().email); - expect(result).to.deep.equal(user().build()); - const params = User.findOne.getCall(0).args[0]; - expect(params).to.deep.equal({ where: { email: user().build().email } }); - }); - it("findUserByEmail - should return null if it isn't found", async () => { - User.findOne = sinon.stub(User, "findOne").resolves(null); - const result = await service.findUserByEmail(user().build().email); - expect(result).to.be.null; - const params = User.findOne.getCall(0).args[0]; - expect(params).to.deep.equal({ where: { email: user().build().email } }); - }); - it("sendSignupEmail - if email is not enabled, should return undefined", async () => { - process.env.EMAIL_ENABLE = "false"; - const result = await service.sendSignupEmail( - user().build().email, - user().build().name - ); - expect(result).to.be.undefined; - expect(readFile.called).to.be.false; - }); - it("sendSignupEmail - should send the email with the sing up content", async () => { - process.env.EMAIL_ENABLE = "true"; - await readFile.resolves("html"); - await service.sendSignupEmail(user().build().email, user().build().name); - expect(readFile.called).to.be.true; - const params = transporterMock.getCall(0).args[0]; - expect(transporterMock.called).to.be.true; - expect(params).to.deep.equal({ - from: process.env.EMAIL, - to: user().build().email, - subject: "Welcome to Our Service", - html: "html", + after(() => { + process.env = JSON.parse(envOrig); }); - }); - it("sendPasswordResetEmail - if email is not enabled, should return undefined", async () => { - process.env.EMAIL_ENABLE = "false"; - const result = await service.sendPasswordResetEmail( - user().build().email, - user().build().name, - "token" - ); - expect(result).to.be.undefined; - expect(readFile.called).to.be.false; - }); - it("sendPasswordResetEmail - should send the email with the reset password content", async () => { - process.env.EMAIL_ENABLE = "true"; - await readFile.resolves("html"); - await service.sendPasswordResetEmail( - user().build().email, - user().build().name, - "token" - ); - expect(readFile.called).to.be.true; - const params = transporterMock.getCall(0).args[0]; - expect(transporterMock.called).to.be.true; - expect(params).to.deep.equal({ - from: process.env.EMAIL, - to: user().build().email, - subject: "Password Reset", - html: "html", + beforeEach(() => { + readFile = sinon.stub(fs, "readFileSync"); + transporterMock = sinon.stub(service.transporter, "sendMail"); + sinon.stub(path, "join").callsFake((...args) => args.join("/")); + sinon + .stub(handlebars, "compile") + .callsFake((html) => (replacements) => html); + }); + afterEach(sinon.restore); + it("findUserByEmail - should return the user if it is found", async () => { + User.findOne = sinon.stub(User, "findOne").resolves(user().build()); + const result = await service.findUserByEmail(user().build().email); + expect(result).to.deep.equal(user().build()); + const params = User.findOne.getCall(0).args[0]; + expect(params).to.deep.equal({ where: { email: user().build().email } }); + }); + it("findUserByEmail - should return null if it isn't found", async () => { + User.findOne = sinon.stub(User, "findOne").resolves(null); + const result = await service.findUserByEmail(user().build().email); + expect(result).to.be.null; + const params = User.findOne.getCall(0).args[0]; + expect(params).to.deep.equal({ where: { email: user().build().email } }); + }); + it("sendSignupEmail - if email is not enabled, should return undefined", async () => { + process.env.EMAIL_ENABLE = "false"; + const result = await service.sendSignupEmail( + user().build().email, + user().build().name + ); + expect(result).to.be.undefined; + expect(readFile.called).to.be.false; + }); + it("sendSignupEmail - should send the email with the sing up content", async () => { + process.env.EMAIL_ENABLE = "true"; + await readFile.resolves("html"); + await service.sendSignupEmail(user().build().email, user().build().name); + expect(readFile.called).to.be.true; + const params = transporterMock.getCall(0).args[0]; + expect(transporterMock.called).to.be.true; + expect(params).to.deep.equal({ + from: process.env.EMAIL, + to: user().build().email, + subject: "Welcome to Our Service", + html: "html", + }); + }); + it("sendPasswordResetEmail - if email is not enabled, should return undefined", async () => { + process.env.EMAIL_ENABLE = "false"; + const result = await service.sendPasswordResetEmail( + user().build().email, + user().build().name, + "token" + ); + expect(result).to.be.undefined; + expect(readFile.called).to.be.false; + }); + it("sendPasswordResetEmail - should send the email with the reset password content", async () => { + process.env.EMAIL_ENABLE = "true"; + await readFile.resolves("html"); + await service.sendPasswordResetEmail( + user().build().email, + user().build().name, + "token" + ); + expect(readFile.called).to.be.true; + const params = transporterMock.getCall(0).args[0]; + expect(transporterMock.called).to.be.true; + expect(params).to.deep.equal({ + from: process.env.EMAIL, + to: user().build().email, + subject: "Password Reset", + html: "html", + }); }); }); -}); +})(); diff --git a/backend/src/test/unit/services/helperLink.test.js b/backend/src/test/unit/services/helperLink.test.js index 6f3b9f9a..af61e411 100644 --- a/backend/src/test/unit/services/helperLink.test.js +++ b/backend/src/test/unit/services/helperLink.test.js @@ -1,252 +1,266 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const db = require("../../../models/index.js"); -const sinon = require("sinon"); -const mocks = require("../../mocks/helperLink.mock.js"); -const { expect } = require("chai"); -const helperLinkService = require("../../../service/helperLink.service.js"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const db = require("../../../models/index.js"); + const mocks = require("../../mocks/helperLink.mock.js"); + const helperLinkService = require("../../../service/helperLink.service.js"); -const HelperLink = db.HelperLink; -const Link = db.Link; + const HelperLink = db.HelperLink; + const Link = db.Link; -describe("Test helper link service", () => { - const HelperLinkMock = {}; - const LinkMock = {}; - let commit; - let rollback; - beforeEach(() => { - commit = sinon.spy(); - rollback = sinon.spy(); - sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ - commit, - rollback, - })); - }); - afterEach(sinon.restore); - it("getAllHelpers - should return all the helper links with it's user without the password", async () => { - HelperLinkMock.findAll = sinon - .stub(HelperLink, "findAll") - .resolves(mocks.HelperLinkList); - const result = await helperLinkService.getAllHelpers(); - expect(result).to.deep.equal(mocks.HelperLinkList); - const params = HelperLinkMock.findAll.getCall(0).args; - expect(params).to.deep.equal([ - { - include: [ - { - model: db.User, - as: "creator", - attributes: { - exclude: ["password"], + describe("Test helper link service", () => { + const HelperLinkMock = {}; + const LinkMock = {}; + let commit; + let rollback; + beforeEach(() => { + commit = sinon.spy(); + rollback = sinon.spy(); + sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ + commit, + rollback, + })); + }); + afterEach(sinon.restore); + it("getAllHelpers - should return all the helper links with it's user without the password", async () => { + HelperLinkMock.findAll = sinon + .stub(HelperLink, "findAll") + .resolves(mocks.HelperLinkList); + const result = await helperLinkService.getAllHelpers(); + expect(result).to.deep.equal(mocks.HelperLinkList); + const params = HelperLinkMock.findAll.getCall(0).args; + expect(params).to.deep.equal([ + { + include: [ + { + model: db.User, + as: "creator", + attributes: { + exclude: ["password"], + }, }, - }, - ], - }, - ]); - }); - it("getHelpersByUserId - should return all the helper links of one user without the password", async () => { - HelperLinkMock.findAll = sinon - .stub(HelperLink, "findAll") - .resolves(mocks.HelperLinkList.filter((it) => it.createdBy === 1)); - const result = await helperLinkService.getHelpersByUserId(1); - expect(result).to.deep.equal( - mocks.HelperLinkList.filter((it) => it.createdBy === 1) - ); - const params = HelperLinkMock.findAll.getCall(0).args; - expect(params).to.deep.equal([ - { - where: { - createdBy: 1, + ], }, - include: [ - { - model: db.User, - as: "creator", - attributes: { - exclude: ["password"], - }, + ]); + }); + it("getHelpersByUserId - should return all the helper links of one user without the password", async () => { + HelperLinkMock.findAll = sinon + .stub(HelperLink, "findAll") + .resolves(mocks.HelperLinkList.filter((it) => it.createdBy === 1)); + const result = await helperLinkService.getHelpersByUserId(1); + expect(result).to.deep.equal( + mocks.HelperLinkList.filter((it) => it.createdBy === 1) + ); + const params = HelperLinkMock.findAll.getCall(0).args; + expect(params).to.deep.equal([ + { + where: { + createdBy: 1, }, - ], - }, - ]); - }); - it("createHelper - should create the helper link and it's links", async () => { - HelperLinkMock.create = sinon - .stub(HelperLink, "create") - .resolves(mocks.HelperLinkBuilder.helperLink(1).build()); - LinkMock.create = sinon - .stub(Link, "create") - .resolves(mocks.LinkBuilder.link(1).build()); - const result = await helperLinkService.createHelper( - mocks.HelperLinkBuilder.helperLink(1).build(), - mocks.LinksList - ); - expect(result).to.deep.equal(mocks.HelperLinkBuilder.helperLink(1).build()); - const paramsHelper = HelperLinkMock.create.getCall(0).args; - expect(paramsHelper[0]).to.deep.equal( - mocks.HelperLinkBuilder.helperLink(1).build() - ); - expect(paramsHelper[1]).to.have.property("returning", true); - const paramsLink = LinkMock.create.getCall(0).args; - expect(paramsLink[0]).to.deep.equal(mocks.LinkBuilder.link(1).build()); - expect(commit.called).to.be.true; - expect(rollback.called).to.be.false; - }); - it("createHelper - should throw an error if something goes wrong", async () => { - HelperLinkMock.create = sinon.stub(HelperLink, "create").rejects(); - LinkMock.create = sinon.stub(Link, "create").resolves(); - try { - await helperLinkService.createHelper( + include: [ + { + model: db.User, + as: "creator", + attributes: { + exclude: ["password"], + }, + }, + ], + }, + ]); + }); + it("createHelper - should create the helper link and it's links", async () => { + HelperLinkMock.create = sinon + .stub(HelperLink, "create") + .resolves(mocks.HelperLinkBuilder.helperLink(1).build()); + LinkMock.create = sinon + .stub(Link, "create") + .resolves(mocks.LinkBuilder.link(1).build()); + const result = await helperLinkService.createHelper( mocks.HelperLinkBuilder.helperLink(1).build(), mocks.LinksList ); - } catch (e) { - expect(e.message).to.equal("Error creating helper"); - } - expect(commit.called).to.be.false; - expect(rollback.called).to.be.true; - }); - it("deleteHelper - should return true if the helper was deleted", async () => { - HelperLinkMock.destroy = sinon.stub(HelperLink, "destroy").resolves(1); - const result = await helperLinkService.deleteHelper(1); - expect(result).to.be.true; - const params = HelperLinkMock.destroy.getCall(0).args; - expect(params).to.deep.equal([{ where: { id: 1 } }]); - }); - it("deleteHelper - should return false if the helper wasn't deleted", async () => { - HelperLinkMock.destroy = sinon.stub(HelperLink, "destroy").resolves(0); - const result = await helperLinkService.deleteHelper(1); - expect(result).to.be.false; - const params = HelperLinkMock.destroy.getCall(0).args; - expect(params).to.deep.equal([{ where: { id: 1 } }]); - }); - it("updateHelper - should return null if no helper is updated", async () => { - HelperLinkMock.update = sinon.stub(HelperLink, "update").resolves([0, []]); - const result = await helperLinkService.updateHelper(1, {}, []); - expect(result).to.be.null; - const params = HelperLinkMock.update.getCall(0).args; - expect(params[0]).to.deep.equal({}); - expect(params[1]).to.deep.equal({ - transaction: { commit, rollback }, - where: { id: 1 }, - returning: true, + expect(result).to.deep.equal( + mocks.HelperLinkBuilder.helperLink(1).build() + ); + const paramsHelper = HelperLinkMock.create.getCall(0).args; + expect(paramsHelper[0]).to.deep.equal( + mocks.HelperLinkBuilder.helperLink(1).build() + ); + expect(paramsHelper[1]).to.have.property("returning", true); + const paramsLink = LinkMock.create.getCall(0).args; + expect(paramsLink[0]).to.deep.equal(mocks.LinkBuilder.link(1).build()); + expect(commit.called).to.be.true; + expect(rollback.called).to.be.false; }); - }); - it("updateHelper - should return the updated helper is everything goes right", async () => { - HelperLinkMock.update = sinon - .stub(HelperLink, "update") - .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); - LinkMock.update = sinon.stub(Link, "update").resolves(); - LinkMock.create = sinon.stub(Link, "create").resolves(); - const result = await helperLinkService.updateHelper( - 1, - mocks.HelperLinkBuilder.helperLink(1).build(), - mocks.LinksList - ); - expect(result).to.deep.equal(mocks.HelperLinkBuilder.helperLink(1).build()); - const paramsHelper = HelperLinkMock.update.getCall(0).args; - expect(paramsHelper[0]).to.deep.equal( - mocks.HelperLinkBuilder.helperLink(1).build() - ); - expect(paramsHelper[1]).to.deep.equal({ - transaction: { commit, rollback }, - where: { id: 1 }, - returning: true, + it("createHelper - should throw an error if something goes wrong", async () => { + HelperLinkMock.create = sinon.stub(HelperLink, "create").rejects(); + LinkMock.create = sinon.stub(Link, "create").resolves(); + try { + await helperLinkService.createHelper( + mocks.HelperLinkBuilder.helperLink(1).build(), + mocks.LinksList + ); + } catch (e) { + expect(e.message).to.equal("Error creating helper"); + } + expect(commit.called).to.be.false; + expect(rollback.called).to.be.true; }); - const paramsLink = LinkMock.update.getCall(0).args; - const { id, ...link } = mocks.LinksList[0]; - expect(paramsLink[0]).to.deep.equal(link); - expect(paramsLink[1]).to.deep.equal({ - transaction: { commit, rollback }, - where: { id: 1 }, + it("deleteHelper - should return true if the helper was deleted", async () => { + HelperLinkMock.destroy = sinon.stub(HelperLink, "destroy").resolves(1); + const result = await helperLinkService.deleteHelper(1); + expect(result).to.be.true; + const params = HelperLinkMock.destroy.getCall(0).args; + expect(params).to.deep.equal([{ where: { id: 1 } }]); }); - expect(commit.called).to.be.true; - expect(rollback.called).to.be.false; - }); - it("updateHelper - should update a link if it exists", async () => { - HelperLinkMock.update = sinon - .stub(HelperLink, "update") - .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); - LinkMock.update = sinon.stub(Link, "update").resolves(); - LinkMock.create = sinon.stub(Link, "create").resolves(); - const result = await helperLinkService.updateHelper( - 1, - mocks.HelperLinkBuilder.helperLink(1).build(), - mocks.LinksList - ); - expect(result).to.deep.equal(mocks.HelperLinkBuilder.helperLink(1).build()); - expect(LinkMock.update.called).to.be.true; - expect(LinkMock.create.called).to.be.false; - expect(commit.called).to.be.true; - expect(rollback.called).to.be.false; - }); - it("updateHelper - should create a link if it doesn't exist", async () => { - HelperLinkMock.update = sinon - .stub(HelperLink, "update") - .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); - LinkMock.update = sinon.stub(Link, "update").resolves(); - LinkMock.create = sinon.stub(Link, "create").resolves(); - const result = await helperLinkService.updateHelper( - 1, - mocks.HelperLinkBuilder.helperLink(1).build(), - mocks.LinksList.map((it) => { - const { id, ...link } = it; - return link; - }) - ); - expect(result).to.deep.equal(mocks.HelperLinkBuilder.helperLink(1).build()); - expect(LinkMock.update.called).to.be.false; - expect(LinkMock.create.called).to.be.true; - expect(commit.called).to.be.true; - expect(rollback.called).to.be.false; - }); - it("updateHelper - should throw an error if something goes wrong", async () => { - HelperLinkMock.update = sinon.stub(HelperLink, "update").rejects(); - try { - await helperLinkService.updateHelper( + it("deleteHelper - should return false if the helper wasn't deleted", async () => { + HelperLinkMock.destroy = sinon.stub(HelperLink, "destroy").resolves(0); + const result = await helperLinkService.deleteHelper(1); + expect(result).to.be.false; + const params = HelperLinkMock.destroy.getCall(0).args; + expect(params).to.deep.equal([{ where: { id: 1 } }]); + }); + it("updateHelper - should return null if no helper is updated", async () => { + HelperLinkMock.update = sinon + .stub(HelperLink, "update") + .resolves([0, []]); + const result = await helperLinkService.updateHelper(1, {}, []); + expect(result).to.be.null; + const params = HelperLinkMock.update.getCall(0).args; + expect(params[0]).to.deep.equal({}); + expect(params[1]).to.deep.equal({ + transaction: { commit, rollback }, + where: { id: 1 }, + returning: true, + }); + }); + it("updateHelper - should return the updated helper is everything goes right", async () => { + HelperLinkMock.update = sinon + .stub(HelperLink, "update") + .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); + LinkMock.update = sinon.stub(Link, "update").resolves(); + LinkMock.create = sinon.stub(Link, "create").resolves(); + const result = await helperLinkService.updateHelper( 1, mocks.HelperLinkBuilder.helperLink(1).build(), mocks.LinksList ); - } catch (e) { - expect(e.message).to.equal("Error updating helper"); - expect(e).to.be.an.instanceof(Error); - } - expect(commit.called).to.be.false; - expect(rollback.called).to.be.true; - }); - it("getHelperById - should return the helperLink and it's user without the password", async () => { - HelperLinkMock.findOne = sinon - .stub(HelperLink, "findOne") - .resolves(mocks.HelperLinkBuilder.helperLink(1).build()); - const result = await helperLinkService.getHelperById(1); - expect(result).to.deep.equal(mocks.HelperLinkBuilder.helperLink(1).build()); - const params = HelperLinkMock.findOne.getCall(0).args; - expect(params).to.deep.equal([ - { + expect(result).to.deep.equal( + mocks.HelperLinkBuilder.helperLink(1).build() + ); + const paramsHelper = HelperLinkMock.update.getCall(0).args; + expect(paramsHelper[0]).to.deep.equal( + mocks.HelperLinkBuilder.helperLink(1).build() + ); + expect(paramsHelper[1]).to.deep.equal({ + transaction: { commit, rollback }, + where: { id: 1 }, + returning: true, + }); + const paramsLink = LinkMock.update.getCall(0).args; + const { id, ...link } = mocks.LinksList[0]; + expect(paramsLink[0]).to.deep.equal(link); + expect(paramsLink[1]).to.deep.equal({ + transaction: { commit, rollback }, where: { id: 1 }, - include: [ - { - model: db.User, - as: "creator", - attributes: { - exclude: ["password"], + }); + expect(commit.called).to.be.true; + expect(rollback.called).to.be.false; + }); + it("updateHelper - should update a link if it exists", async () => { + HelperLinkMock.update = sinon + .stub(HelperLink, "update") + .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); + LinkMock.update = sinon.stub(Link, "update").resolves(); + LinkMock.create = sinon.stub(Link, "create").resolves(); + const result = await helperLinkService.updateHelper( + 1, + mocks.HelperLinkBuilder.helperLink(1).build(), + mocks.LinksList + ); + expect(result).to.deep.equal( + mocks.HelperLinkBuilder.helperLink(1).build() + ); + expect(LinkMock.update.called).to.be.true; + expect(LinkMock.create.called).to.be.false; + expect(commit.called).to.be.true; + expect(rollback.called).to.be.false; + }); + it("updateHelper - should create a link if it doesn't exist", async () => { + HelperLinkMock.update = sinon + .stub(HelperLink, "update") + .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); + LinkMock.update = sinon.stub(Link, "update").resolves(); + LinkMock.create = sinon.stub(Link, "create").resolves(); + const result = await helperLinkService.updateHelper( + 1, + mocks.HelperLinkBuilder.helperLink(1).build(), + mocks.LinksList.map((it) => { + const { id, ...link } = it; + return link; + }) + ); + expect(result).to.deep.equal( + mocks.HelperLinkBuilder.helperLink(1).build() + ); + expect(LinkMock.update.called).to.be.false; + expect(LinkMock.create.called).to.be.true; + expect(commit.called).to.be.true; + expect(rollback.called).to.be.false; + }); + it("updateHelper - should throw an error if something goes wrong", async () => { + HelperLinkMock.update = sinon.stub(HelperLink, "update").rejects(); + try { + await helperLinkService.updateHelper( + 1, + mocks.HelperLinkBuilder.helperLink(1).build(), + mocks.LinksList + ); + } catch (e) { + expect(e.message).to.equal("Error updating helper"); + expect(e).to.be.an.instanceof(Error); + } + expect(commit.called).to.be.false; + expect(rollback.called).to.be.true; + }); + it("getHelperById - should return the helperLink and it's user without the password", async () => { + HelperLinkMock.findOne = sinon + .stub(HelperLink, "findOne") + .resolves(mocks.HelperLinkBuilder.helperLink(1).build()); + const result = await helperLinkService.getHelperById(1); + expect(result).to.deep.equal( + mocks.HelperLinkBuilder.helperLink(1).build() + ); + const params = HelperLinkMock.findOne.getCall(0).args; + expect(params).to.deep.equal([ + { + where: { id: 1 }, + include: [ + { + model: db.User, + as: "creator", + attributes: { + exclude: ["password"], + }, }, - }, - { - model: db.Link, - as: "links", - }, - ], - }, - ]); - }); - it("getHelperById - should throw an error if the user is not found", async () => { - HelperLinkMock.findOne = sinon.stub(HelperLink, "findOne").rejects(); - try { - await helperLinkService.getHelperById(1); - } catch (e) { - expect(e.message).to.equal("Error retrieving helper by ID"); - expect(e).to.be.an.instanceof(Error); - } + { + model: db.Link, + as: "links", + }, + ], + }, + ]); + }); + it("getHelperById - should throw an error if the user is not found", async () => { + HelperLinkMock.findOne = sinon.stub(HelperLink, "findOne").rejects(); + try { + await helperLinkService.getHelperById(1); + } catch (e) { + expect(e.message).to.equal("Error retrieving helper by ID"); + expect(e).to.be.an.instanceof(Error); + } + }); }); -}); +})(); diff --git a/backend/src/test/unit/services/hint.test.js b/backend/src/test/unit/services/hint.test.js index 0cfd55f2..761ec9d6 100644 --- a/backend/src/test/unit/services/hint.test.js +++ b/backend/src/test/unit/services/hint.test.js @@ -1,155 +1,178 @@ -const { describe, it, afterEach } = require("mocha"); -const db = require("../../../models/index.js"); -const sinon = require("sinon"); -const mocks = require("../../mocks/hint.mock.js"); -const hintService = require("../../../service/hint.service.js"); -const { expect } = require("chai"); +(async () => { + const { describe, it, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const db = require("../../../models/index.js"); + const mocks = require("../../mocks/hint.mock.js"); + const hintService = require("../../../service/hint.service.js"); -const Hint = db.Hint; -const hint = mocks.HintBuilder.hint; -const hintList = mocks.hintList; + const Hint = db.Hint; + const hint = mocks.HintBuilder.hint; + const hintList = mocks.hintList; -describe("Test hint service", () => { - const HintMock = {}; - afterEach(sinon.restore); - it("getAllHints - should return the list of hints", async () => { - HintMock.findAll = sinon.stub(Hint, "findAll").resolves(hintList); - const hints = await hintService.getAllHints(); - expect(hints).to.deep.equal(hintList); - const params = HintMock.findAll.getCall(0).args[0]; - expect(params).to.deep.equal({ - include: [{ model: db.User, as: "creator" }], + describe("Test hint service", () => { + const HintMock = {}; + afterEach(sinon.restore); + it("getAllHints - should return the list of hints", async () => { + HintMock.findAll = sinon.stub(Hint, "findAll").resolves(hintList); + const hints = await hintService.getAllHints(); + expect(hints).to.deep.equal(hintList); + const params = HintMock.findAll.getCall(0).args[0]; + expect(params).to.deep.equal({ + include: [{ model: db.User, as: "creator" }], + }); }); - }); - it("getAllHints - should throw an error if something goes wrong", async () => { - HintMock.findAll = sinon.stub(Hint, "findAll").rejects(new Error("Something went wrong")); - try { - await hintService.getAllHints(); - } catch (error) { - expect(error.message).to.equal("Error retrieving hints: Something went wrong"); - } - const params = HintMock.findAll.getCall(0).args[0]; - expect(params).to.deep.equal({ - include: [{ model: db.User, as: "creator" }], + it("getAllHints - should throw an error if something goes wrong", async () => { + HintMock.findAll = sinon + .stub(Hint, "findAll") + .rejects(new Error("Something went wrong")); + try { + await hintService.getAllHints(); + } catch (error) { + expect(error.message).to.equal( + "Error retrieving hints: Something went wrong" + ); + } + const params = HintMock.findAll.getCall(0).args[0]; + expect(params).to.deep.equal({ + include: [{ model: db.User, as: "creator" }], + }); }); - }); - it("getHints - should return the list of hints created by the userId", async () => { - HintMock.findAll = sinon.stub(Hint, "findAll").resolves(hintList); - const hints = await hintService.getHints(1); - expect(hints).to.deep.equal(hintList); - const params = HintMock.findAll.getCall(0).args[0]; - expect(params).to.deep.equal({ - where: { - createdBy: 1, - }, - include: [{ model: db.User, as: "creator" }], + it("getHints - should return the list of hints created by the userId", async () => { + HintMock.findAll = sinon.stub(Hint, "findAll").resolves(hintList); + const hints = await hintService.getHints(1); + expect(hints).to.deep.equal(hintList); + const params = HintMock.findAll.getCall(0).args[0]; + expect(params).to.deep.equal({ + where: { + createdBy: 1, + }, + include: [{ model: db.User, as: "creator" }], + }); }); - }); - it("getHints - should throw an error if something goes wrong", async () => { - HintMock.findAll = sinon.stub(Hint, "findAll").rejects(new Error("Something went wrong")); - try { - await hintService.getHints(1); - } catch (error) { - expect(error.message).to.equal("Error retrieving hints: Something went wrong"); - } - const params = HintMock.findAll.getCall(0).args[0]; - expect(params).to.deep.equal({ - where: { - createdBy: 1, - }, - include: [{ model: db.User, as: "creator" }], + it("getHints - should throw an error if something goes wrong", async () => { + HintMock.findAll = sinon + .stub(Hint, "findAll") + .rejects(new Error("Something went wrong")); + try { + await hintService.getHints(1); + } catch (error) { + expect(error.message).to.equal( + "Error retrieving hints: Something went wrong" + ); + } + const params = HintMock.findAll.getCall(0).args[0]; + expect(params).to.deep.equal({ + where: { + createdBy: 1, + }, + include: [{ model: db.User, as: "creator" }], + }); }); - }); - it("createHint - should return the created hint", async () => { - HintMock.create = sinon.stub(Hint, "create").resolves(hint().build()); - const newHint = await hintService.createHint(hint().build()); - expect(newHint).to.deep.equal(hint().build()); - const params = HintMock.create.getCall(0).args[0]; - expect(params).to.deep.equal(hint().build()); - }); - it("createHint - should throw an error if something goes wrong", async () => { - HintMock.create = sinon.stub(Hint, "create").rejects(new Error("Something went wrong")); - try { - await hintService.createHint(hint().build()); - } catch (error) { - expect(error.message).to.equal("Error creating hint: Something went wrong"); - } - const params = HintMock.create.getCall(0).args[0]; - expect(params).to.deep.equal(hint().build()); - }); - it("deleteHint - should return false if no hint is deleted", async () => { - HintMock.destroy = sinon.stub(Hint, "destroy").resolves(0); - const result = await hintService.deleteHint(1); - expect(result).to.equal(false); - const params = HintMock.destroy.getCall(0).args[0]; - expect(params).to.deep.equal({ where: { id: 1 } }); - }); - it("deleteHint - should return true if the hint is deleted", async () => { - HintMock.destroy = sinon.stub(Hint, "destroy").resolves(1); - const result = await hintService.deleteHint(1); - expect(result).to.equal(true); - const params = HintMock.destroy.getCall(0).args[0]; - expect(params).to.deep.equal({ where: { id: 1 } }); - }); - it("deleteHint - should throw an error if something goes wrong", async () => { - HintMock.destroy = sinon.stub(Hint, "destroy").rejects(new Error("Something went wrong")); - try { - await hintService.deleteHint(1); - } catch (error) { - expect(error.message).to.equal("Error deleting hint: Something went wrong"); - } - const params = HintMock.destroy.getCall(0).args[0]; - expect(params).to.deep.equal({ where: { id: 1 } }); - }); - it("updateHint - should return null if no hint is updated", async () => { - HintMock.update = sinon.stub(Hint, "update").resolves([0, []]); - const updatedHint = await hintService.updateHint(1, hint().build()); - expect(updatedHint).to.equal(null); - const params = HintMock.update.getCall(0).args; - expect(params[0]).to.deep.equal(hint().build()); - expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); - }); - it("updateHint - should return the updated hint", async () => { - HintMock.update = sinon.stub(Hint, "update").resolves([1, [hint().build()]]); - const updatedHint = await hintService.updateHint(1, hint().build()); - expect(updatedHint).to.deep.equal(hint().build()); - const params = HintMock.update.getCall(0).args; - expect(params[0]).to.deep.equal(hint().build()); - expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); - - }); - it("updateHint - should throw an error if something goes wrong", async () => { - HintMock.update = sinon.stub(Hint, "update").rejects(new Error("Something went wrong")); - try { - await hintService.updateHint(1, hint().build()); - } catch (error) { - expect(error.message).to.equal("Error updating hint: Something went wrong"); - } - const params = HintMock.update.getCall(0).args; - expect(params[0]).to.deep.equal(hint().build()); - expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); - }); - it("getHintById - should return the found hint", async () => { - HintMock.findOne = sinon.stub(Hint, "findOne").resolves(hint().build()); - const foundHint = await hintService.getHintById(1); - expect(foundHint).to.deep.equal(hint().build()); - const params = HintMock.findOne.getCall(0).args[0]; - expect(params).to.deep.equal({ - where: { id: 1 }, - include: [{ model: db.User, as: "creator" }], + it("createHint - should return the created hint", async () => { + HintMock.create = sinon.stub(Hint, "create").resolves(hint().build()); + const newHint = await hintService.createHint(hint().build()); + expect(newHint).to.deep.equal(hint().build()); + const params = HintMock.create.getCall(0).args[0]; + expect(params).to.deep.equal(hint().build()); }); - }); - it("getHintById - should throw an error if the hint is not found", async () => { - HintMock.findOne = sinon.stub(Hint, "findOne").rejects(); - try { - await hintService.getHintById(1); - } catch (error) { - expect(error.message).to.equal("Error retrieving hint by ID: Error"); - } - const params = HintMock.findOne.getCall(0).args[0]; - expect(params).to.deep.equal({ - where: { id: 1 }, - include: [{ model: db.User, as: "creator" }], + it("createHint - should throw an error if something goes wrong", async () => { + HintMock.create = sinon + .stub(Hint, "create") + .rejects(new Error("Something went wrong")); + try { + await hintService.createHint(hint().build()); + } catch (error) { + expect(error.message).to.equal( + "Error creating hint: Something went wrong" + ); + } + const params = HintMock.create.getCall(0).args[0]; + expect(params).to.deep.equal(hint().build()); + }); + it("deleteHint - should return false if no hint is deleted", async () => { + HintMock.destroy = sinon.stub(Hint, "destroy").resolves(0); + const result = await hintService.deleteHint(1); + expect(result).to.equal(false); + const params = HintMock.destroy.getCall(0).args[0]; + expect(params).to.deep.equal({ where: { id: 1 } }); + }); + it("deleteHint - should return true if the hint is deleted", async () => { + HintMock.destroy = sinon.stub(Hint, "destroy").resolves(1); + const result = await hintService.deleteHint(1); + expect(result).to.equal(true); + const params = HintMock.destroy.getCall(0).args[0]; + expect(params).to.deep.equal({ where: { id: 1 } }); + }); + it("deleteHint - should throw an error if something goes wrong", async () => { + HintMock.destroy = sinon + .stub(Hint, "destroy") + .rejects(new Error("Something went wrong")); + try { + await hintService.deleteHint(1); + } catch (error) { + expect(error.message).to.equal( + "Error deleting hint: Something went wrong" + ); + } + const params = HintMock.destroy.getCall(0).args[0]; + expect(params).to.deep.equal({ where: { id: 1 } }); + }); + it("updateHint - should return null if no hint is updated", async () => { + HintMock.update = sinon.stub(Hint, "update").resolves([0, []]); + const updatedHint = await hintService.updateHint(1, hint().build()); + expect(updatedHint).to.equal(null); + const params = HintMock.update.getCall(0).args; + expect(params[0]).to.deep.equal(hint().build()); + expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("updateHint - should return the updated hint", async () => { + HintMock.update = sinon + .stub(Hint, "update") + .resolves([1, [hint().build()]]); + const updatedHint = await hintService.updateHint(1, hint().build()); + expect(updatedHint).to.deep.equal(hint().build()); + const params = HintMock.update.getCall(0).args; + expect(params[0]).to.deep.equal(hint().build()); + expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("updateHint - should throw an error if something goes wrong", async () => { + HintMock.update = sinon + .stub(Hint, "update") + .rejects(new Error("Something went wrong")); + try { + await hintService.updateHint(1, hint().build()); + } catch (error) { + expect(error.message).to.equal( + "Error updating hint: Something went wrong" + ); + } + const params = HintMock.update.getCall(0).args; + expect(params[0]).to.deep.equal(hint().build()); + expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("getHintById - should return the found hint", async () => { + HintMock.findOne = sinon.stub(Hint, "findOne").resolves(hint().build()); + const foundHint = await hintService.getHintById(1); + expect(foundHint).to.deep.equal(hint().build()); + const params = HintMock.findOne.getCall(0).args[0]; + expect(params).to.deep.equal({ + where: { id: 1 }, + include: [{ model: db.User, as: "creator" }], + }); + }); + it("getHintById - should throw an error if the hint is not found", async () => { + HintMock.findOne = sinon.stub(Hint, "findOne").rejects(); + try { + await hintService.getHintById(1); + } catch (error) { + expect(error.message).to.equal("Error retrieving hint by ID: Error"); + } + const params = HintMock.findOne.getCall(0).args[0]; + expect(params).to.deep.equal({ + where: { id: 1 }, + include: [{ model: db.User, as: "creator" }], + }); }); }); -}); +})(); diff --git a/backend/src/test/unit/services/invite.test.js b/backend/src/test/unit/services/invite.test.js index 21788dee..66bfbb70 100644 --- a/backend/src/test/unit/services/invite.test.js +++ b/backend/src/test/unit/services/invite.test.js @@ -1,83 +1,87 @@ -const { describe, it, beforeEach } = require("mocha"); -const db = require("../../../models/index.js"); -const sinon = require("sinon"); -const { UserBuilder, validList } = require("../../mocks/user.mock.js"); -const InviteService = require("../../../service/invite.service"); -const { expect } = require("chai"); +(async () => { + const { describe, it, beforeEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const db = require("../../../models/index.js"); + const { UserBuilder, validList } = require("../../mocks/user.mock.js"); + const InviteService = require("../../../service/invite.service"); -const validEmailList = validList.map((it) => ({ - invitedBy: 1, - invitedEmail: it.email, - role: "admin", -})); -const Invite = db.Invite; -const User = db.User; -const user = UserBuilder.user; -const service = new InviteService(); + const validEmailList = validList.map((it) => ({ + invitedBy: 1, + invitedEmail: it.email, + role: "admin", + })); + const Invite = db.Invite; + const User = db.User; + const user = UserBuilder.user; + const service = new InviteService(); -describe("Test invite service", () => { - const UserMock = {}; - const InviteMock = {}; - beforeEach(sinon.restore); - it("sendInvite - should throw an error if the email is already registered", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - try { - await service.sendInvite(1, "email@email.com", "admin"); - } catch (e) { - expect(e).to.be.instanceOf(Error); - expect(e.message).to.be.equal( - "Error Sending Invite ~ Invited User already exists in team" - ); - } - }); - it("sendInvite - should update the invite if the email was invited but not registered", async () => { - const update = sinon.stub(); - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - InviteMock.findOne = sinon - .stub(Invite, "findOne") - .resolves({ ...user().build(), update }); - await service.sendInvite(1, "email@email.com", "admin"); - expect(update.called).to.be.true; - expect(update.args[0][0]).to.deep.equal({ - invitedBy: 1, - role: "1", + describe("Test invite service", () => { + const UserMock = {}; + const InviteMock = {}; + beforeEach(sinon.restore); + it("sendInvite - should throw an error if the email is already registered", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + try { + await service.sendInvite(1, "email@email.com", "admin"); + } catch (e) { + expect(e).to.be.instanceOf(Error); + expect(e.message).to.be.equal( + "Error Sending Invite ~ Invited User already exists in team" + ); + } }); - }); - it("sendInvite - should create an invite if the email was not invited yet.", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - InviteMock.findOne = sinon.stub(Invite, "findOne").resolves(null); - InviteMock.create = sinon.stub(Invite, "create").resolves(); - await service.sendInvite(1, "email@email.com", "admin"); - expect(InviteMock.create.called).to.be.true; - expect(InviteMock.create.args[0][0]).to.deep.equal({ - invitedBy: 1, - role: "1", - invitedEmail: "email@email.com", + it("sendInvite - should update the invite if the email was invited but not registered", async () => { + const update = sinon.stub(); + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + InviteMock.findOne = sinon + .stub(Invite, "findOne") + .resolves({ ...user().build(), update }); + await service.sendInvite(1, "email@email.com", "admin"); + expect(update.called).to.be.true; + expect(update.args[0][0]).to.deep.equal({ + invitedBy: 1, + role: "1", + }); }); - }); - it("sendInvite - should throw an error if something goes wrong", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - InviteMock.findOne = sinon.stub(Invite, "findOne").rejects(); - try { + it("sendInvite - should create an invite if the email was not invited yet.", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + InviteMock.findOne = sinon.stub(Invite, "findOne").resolves(null); + InviteMock.create = sinon.stub(Invite, "create").resolves(); await service.sendInvite(1, "email@email.com", "admin"); - } catch (e) { - expect(e).to.be.instanceOf(Error); - expect(e.message).to.be.equal("Error Sending Invite ~ Error"); - } - }); - it("getAllInvites - should return all the invites", async () => { - InviteMock.findAll = sinon.stub(Invite, "findAll").resolves(validEmailList); - const result = await service.getAllInvites(); - expect(result).to.be.deep.equal(validEmailList); - expect(InviteMock.findAll.called).to.be.true; - }); - it("getAllInvites - should throw an error if something goes wrong", async () => { - InviteMock.findAll = sinon.stub(Invite, "findAll").rejects(); - try { - await service.getAllInvites(); - } catch (e) { - expect(e).to.be.instanceOf(Error); - expect(e.message).to.be.equal("Failed to fetch invites"); - } + expect(InviteMock.create.called).to.be.true; + expect(InviteMock.create.args[0][0]).to.deep.equal({ + invitedBy: 1, + role: "1", + invitedEmail: "email@email.com", + }); + }); + it("sendInvite - should throw an error if something goes wrong", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + InviteMock.findOne = sinon.stub(Invite, "findOne").rejects(); + try { + await service.sendInvite(1, "email@email.com", "admin"); + } catch (e) { + expect(e).to.be.instanceOf(Error); + expect(e.message).to.be.equal("Error Sending Invite ~ Error"); + } + }); + it("getAllInvites - should return all the invites", async () => { + InviteMock.findAll = sinon + .stub(Invite, "findAll") + .resolves(validEmailList); + const result = await service.getAllInvites(); + expect(result).to.be.deep.equal(validEmailList); + expect(InviteMock.findAll.called).to.be.true; + }); + it("getAllInvites - should throw an error if something goes wrong", async () => { + InviteMock.findAll = sinon.stub(Invite, "findAll").rejects(); + try { + await service.getAllInvites(); + } catch (e) { + expect(e).to.be.instanceOf(Error); + expect(e.message).to.be.equal("Failed to fetch invites"); + } + }); }); -}); +})(); diff --git a/backend/src/test/unit/services/link.test.js b/backend/src/test/unit/services/link.test.js index 03e56cba..82237369 100644 --- a/backend/src/test/unit/services/link.test.js +++ b/backend/src/test/unit/services/link.test.js @@ -1,128 +1,135 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const db = require("../../../models/index.js"); -const sinon = require("sinon"); -const mocks = require("../../mocks/helperLink.mock.js"); -const { expect } = require("chai"); -const linkService = require("../../../service/link.service.js"); +(async () => { + const { describe, it, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const db = require("../../../models/index.js"); + const mocks = require("../../mocks/helperLink.mock.js"); + const linkService = require("../../../service/link.service.js"); -const Link = db.Link; + const Link = db.Link; -describe("Test link service", () => { - const LinkMock = {}; - afterEach(sinon.restore); - it("getAllLinks - should return a list of links with it's respective helper", async () => { - LinkMock.findAll = sinon.stub(Link, "findAll").resolves(mocks.LinksList); - const links = await linkService.getAllLinks(); - expect(links).to.deep.equal(mocks.LinksList); - expect(LinkMock.findAll.called).to.be.true; - const params = LinkMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - include: [ - { - model: db.HelperLink, - as: "helper", - }, - ], + describe("Test link service", () => { + const LinkMock = {}; + afterEach(sinon.restore); + it("getAllLinks - should return a list of links with it's respective helper", async () => { + LinkMock.findAll = sinon.stub(Link, "findAll").resolves(mocks.LinksList); + const links = await linkService.getAllLinks(); + expect(links).to.deep.equal(mocks.LinksList); + expect(LinkMock.findAll.called).to.be.true; + const params = LinkMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + include: [ + { + model: db.HelperLink, + as: "helper", + }, + ], + }); }); - }); - it("getLinksByHelperId - should return only the links related to the helper id", async () => { - LinkMock.findAll = sinon.stub(Link, "findAll").resolves(mocks.LinksList); - const links = await linkService.getLinksByHelperId(1); - expect(links).to.deep.equal(mocks.LinksList); - expect(LinkMock.findAll.called).to.be.true; - const params = LinkMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { - helperId: 1, - }, - include: [ - { - model: db.HelperLink, - as: "helper", + it("getLinksByHelperId - should return only the links related to the helper id", async () => { + LinkMock.findAll = sinon.stub(Link, "findAll").resolves(mocks.LinksList); + const links = await linkService.getLinksByHelperId(1); + expect(links).to.deep.equal(mocks.LinksList); + expect(LinkMock.findAll.called).to.be.true; + const params = LinkMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { + helperId: 1, }, - ], + include: [ + { + model: db.HelperLink, + as: "helper", + }, + ], + }); }); - }); - it("createLink - should return the link created", async () => { - const linkToCreate = mocks.LinkBuilder.link().build(); - LinkMock.create = sinon.stub(Link, "create").resolves(linkToCreate); - const link = await linkService.createLink(linkToCreate); - expect(link).to.deep.equal(linkToCreate); - expect(LinkMock.create.called).to.be.true; - const params = LinkMock.create.getCall(0).args[0]; - expect(params).to.be.deep.equal(linkToCreate); - }); - it("deleteLink - should return true if the link was deleted", async () => { - LinkMock.destroy = sinon.stub(Link, "destroy").resolves(1); - const result = await linkService.deleteLink(1); - expect(result).to.be.true; - expect(LinkMock.destroy.called).to.be.true; - const params = LinkMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id: 1 } }); - }); - it("deleteLink - should return false if the link wasn't deleted", async () => { - LinkMock.destroy = sinon.stub(Link, "destroy").resolves(0); - const result = await linkService.deleteLink(1); - expect(result).to.be.false; - expect(LinkMock.destroy.called).to.be.true; - const params = LinkMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id: 1 } }); - }); - it("updateLink - if no links are updated, should return null", async () => { - LinkMock.update = sinon.stub(Link, "update").resolves([0, []]); - const link = await linkService.updateLink(1, {}); - expect(link).to.be.null; - expect(LinkMock.update.called).to.be.true; - const params = LinkMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal({}); - expect(params[1]).to.be.deep.equal({ where: { id: 1 }, returning: true }); - }); - it("updateLink - should return the updated link", async () => { - const linkToUpdate = mocks.LinkBuilder.link().build(); - LinkMock.update = sinon.stub(Link, "update").resolves([1, [linkToUpdate]]); - const link = await linkService.updateLink(1, linkToUpdate); - expect(link).to.deep.equal(linkToUpdate); - expect(LinkMock.update.called).to.be.true; - const params = LinkMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal(linkToUpdate); - expect(params[1]).to.be.deep.equal({ where: { id: 1 }, returning: true }); - }); - it("getLinkById - should return the link with it's helper", async () => { - LinkMock.findOne = sinon - .stub(Link, "findOne") - .resolves(mocks.LinkBuilder.link().build()); - const link = await linkService.getLinkById(1); - expect(link).to.deep.equal(mocks.LinkBuilder.link().build()); - expect(LinkMock.findOne.called).to.be.true; - const params = LinkMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: 1 }, - include: [ - { - model: db.HelperLink, - as: "helper", - }, - ], + it("createLink - should return the link created", async () => { + const linkToCreate = mocks.LinkBuilder.link().build(); + LinkMock.create = sinon.stub(Link, "create").resolves(linkToCreate); + const link = await linkService.createLink(linkToCreate); + expect(link).to.deep.equal(linkToCreate); + expect(LinkMock.create.called).to.be.true; + const params = LinkMock.create.getCall(0).args[0]; + expect(params).to.be.deep.equal(linkToCreate); }); - }); - it("getLinkById - should throw an error if the link is not found", async () => { - LinkMock.findOne = sinon.stub(Link, "findOne").rejects(); - try { - await linkService.getLinkById(1); - } catch (error) { - expect(error).to.have.property("message", "Error retrieving link by ID"); - expect(error).to.be.instanceOf(Error); - } - expect(LinkMock.findOne.called).to.be.true; - const params = LinkMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: 1 }, - include: [ - { - model: db.HelperLink, - as: "helper", - }, - ], + it("deleteLink - should return true if the link was deleted", async () => { + LinkMock.destroy = sinon.stub(Link, "destroy").resolves(1); + const result = await linkService.deleteLink(1); + expect(result).to.be.true; + expect(LinkMock.destroy.called).to.be.true; + const params = LinkMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id: 1 } }); + }); + it("deleteLink - should return false if the link wasn't deleted", async () => { + LinkMock.destroy = sinon.stub(Link, "destroy").resolves(0); + const result = await linkService.deleteLink(1); + expect(result).to.be.false; + expect(LinkMock.destroy.called).to.be.true; + const params = LinkMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id: 1 } }); + }); + it("updateLink - if no links are updated, should return null", async () => { + LinkMock.update = sinon.stub(Link, "update").resolves([0, []]); + const link = await linkService.updateLink(1, {}); + expect(link).to.be.null; + expect(LinkMock.update.called).to.be.true; + const params = LinkMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal({}); + expect(params[1]).to.be.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("updateLink - should return the updated link", async () => { + const linkToUpdate = mocks.LinkBuilder.link().build(); + LinkMock.update = sinon + .stub(Link, "update") + .resolves([1, [linkToUpdate]]); + const link = await linkService.updateLink(1, linkToUpdate); + expect(link).to.deep.equal(linkToUpdate); + expect(LinkMock.update.called).to.be.true; + const params = LinkMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal(linkToUpdate); + expect(params[1]).to.be.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("getLinkById - should return the link with it's helper", async () => { + LinkMock.findOne = sinon + .stub(Link, "findOne") + .resolves(mocks.LinkBuilder.link().build()); + const link = await linkService.getLinkById(1); + expect(link).to.deep.equal(mocks.LinkBuilder.link().build()); + expect(LinkMock.findOne.called).to.be.true; + const params = LinkMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: 1 }, + include: [ + { + model: db.HelperLink, + as: "helper", + }, + ], + }); + }); + it("getLinkById - should throw an error if the link is not found", async () => { + LinkMock.findOne = sinon.stub(Link, "findOne").rejects(); + try { + await linkService.getLinkById(1); + } catch (error) { + expect(error).to.have.property( + "message", + "Error retrieving link by ID" + ); + expect(error).to.be.instanceOf(Error); + } + expect(LinkMock.findOne.called).to.be.true; + const params = LinkMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: 1 }, + include: [ + { + model: db.HelperLink, + as: "helper", + }, + ], + }); }); }); -}); +})(); diff --git a/backend/src/test/unit/services/popup.test.js b/backend/src/test/unit/services/popup.test.js index 02127d98..700d9c7a 100644 --- a/backend/src/test/unit/services/popup.test.js +++ b/backend/src/test/unit/services/popup.test.js @@ -1,133 +1,135 @@ -const { describe, it, afterEach } = require("mocha"); -const db = require("../../../models/index.js"); -const sinon = require("sinon"); -const mocks = require("../../mocks/popup.mock.js"); -const { expect } = require("chai"); -const popupService = require("../../../service/popup.service.js"); +(async () => { + const { describe, it, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const db = require("../../../models/index.js"); + const mocks = require("../../mocks/popup.mock.js"); + const popupService = require("../../../service/popup.service.js"); -const Popup = db.Popup; -const popup = mocks.PopupBuilder.popup; -const popupList = mocks.popupList; + const Popup = db.Popup; + const popup = mocks.PopupBuilder.popup; + const popupList = mocks.popupList; -describe("Test popup service", () => { - const PopupMock = {}; - afterEach(sinon.restore); - it("getAllPopups - should return all the popups with the user", async () => { - PopupMock.findAll = sinon.stub(Popup, "findAll").resolves(popupList); - const popups = await popupService.getAllPopups(); - expect(popups).to.deep.equal(popupList); - const params = PopupMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - include: [{ model: db.User, as: "creator" }], + describe("Test popup service", () => { + const PopupMock = {}; + afterEach(sinon.restore); + it("getAllPopups - should return all the popups with the user", async () => { + PopupMock.findAll = sinon.stub(Popup, "findAll").resolves(popupList); + const popups = await popupService.getAllPopups(); + expect(popups).to.deep.equal(popupList); + const params = PopupMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + include: [{ model: db.User, as: "creator" }], + }); + expect(PopupMock.findAll.called).to.be.true; }); - expect(PopupMock.findAll.called).to.be.true; - }); - it("getPopups - should return only the popups created by the userId", async () => { - const userId = 2; - PopupMock.findAll = sinon - .stub(Popup, "findAll") - .resolves(popupList.filter((popup) => popup.createdBy === userId)); - const popups = await popupService.getPopups(userId); - expect(popups).not.to.deep.equal(popupList); - const params = PopupMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { - createdBy: userId, - }, - include: [{ model: db.User, as: "creator" }], + it("getPopups - should return only the popups created by the userId", async () => { + const userId = 2; + PopupMock.findAll = sinon + .stub(Popup, "findAll") + .resolves(popupList.filter((popup) => popup.createdBy === userId)); + const popups = await popupService.getPopups(userId); + expect(popups).not.to.deep.equal(popupList); + const params = PopupMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { + createdBy: userId, + }, + include: [{ model: db.User, as: "creator" }], + }); + expect(PopupMock.findAll.called).to.be.true; }); - expect(PopupMock.findAll.called).to.be.true; - }); - it("createPopup - should return the created popup", async () => { - const newPopup = popup().build(); - PopupMock.create = sinon.stub(Popup, "create").resolves(newPopup); - const createdPopup = await popupService.createPopup(newPopup); - expect(createdPopup).to.deep.equal(newPopup); - const params = PopupMock.create.getCall(0).args[0]; - expect(params).to.be.deep.equal(newPopup); - expect(PopupMock.create.called).to.be.true; - }); - it("deletePopup - should return false if no popup is deleted", async () => { - const popupId = 1; - PopupMock.destroy = sinon.stub(Popup, "destroy").resolves(0); - const isDeleted = await popupService.deletePopup(popupId); - expect(isDeleted).to.be.false; - const params = PopupMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id: popupId } }); - expect(PopupMock.destroy.called).to.be.true; - }); - it("deletePopup - should return true if the popup is deleted", async () => { - const popupId = 1; - PopupMock.destroy = sinon.stub(Popup, "destroy").resolves(1); - const isDeleted = await popupService.deletePopup(popupId); - expect(isDeleted).to.be.true; - const params = PopupMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id: popupId } }); - expect(PopupMock.destroy.called).to.be.true; - }); - it("updatePopup - should return null if no popup is updated", async () => { - const popupId = 1; - PopupMock.update = sinon.stub(Popup, "update").resolves([0, []]); - const popupData = { header: "new header" }; - const updatedPopupResult = await popupService.updatePopup( - popupId, - popupData - ); - expect(updatedPopupResult).to.be.null; - const params = PopupMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal(popupData); - expect(params[1]).to.be.deep.equal({ - where: { id: popupId }, - returning: true, + it("createPopup - should return the created popup", async () => { + const newPopup = popup().build(); + PopupMock.create = sinon.stub(Popup, "create").resolves(newPopup); + const createdPopup = await popupService.createPopup(newPopup); + expect(createdPopup).to.deep.equal(newPopup); + const params = PopupMock.create.getCall(0).args[0]; + expect(params).to.be.deep.equal(newPopup); + expect(PopupMock.create.called).to.be.true; }); - expect(PopupMock.update.called).to.be.true; - }); - it("updatePopup - should return the updated popup", async () => { - const popupId = 1; - const updatedPopup = popup(popupId).build(); - PopupMock.update = sinon - .stub(Popup, "update") - .resolves([1, [updatedPopup]]); - const popupData = { header: "new header" }; - const updatedPopupResult = await popupService.updatePopup( - popupId, - popupData - ); - expect(updatedPopupResult).to.be.deep.equal(updatedPopup); - const params = PopupMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal(popupData); - expect(params[1]).to.be.deep.equal({ - where: { id: popupId }, - returning: true, + it("deletePopup - should return false if no popup is deleted", async () => { + const popupId = 1; + PopupMock.destroy = sinon.stub(Popup, "destroy").resolves(0); + const isDeleted = await popupService.deletePopup(popupId); + expect(isDeleted).to.be.false; + const params = PopupMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id: popupId } }); + expect(PopupMock.destroy.called).to.be.true; }); - expect(PopupMock.update.called).to.be.true; - }); - it("getPopupById - should return the found popup", async () => { - const popupId = 1; - const foundPopup = popup(popupId).build(); - PopupMock.findOne = sinon.stub(Popup, "findOne").resolves(foundPopup); - const popupResult = await popupService.getPopupById(popupId); - expect(popupResult).to.be.deep.equal(foundPopup); - const params = PopupMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: popupId }, - include: [{ model: db.User, as: "creator" }], + it("deletePopup - should return true if the popup is deleted", async () => { + const popupId = 1; + PopupMock.destroy = sinon.stub(Popup, "destroy").resolves(1); + const isDeleted = await popupService.deletePopup(popupId); + expect(isDeleted).to.be.true; + const params = PopupMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id: popupId } }); + expect(PopupMock.destroy.called).to.be.true; }); - expect(PopupMock.findOne.called).to.be.true; - }); - it("getPopupById - should throw an error if the popup is not found", async () => { - const popupId = 1; - PopupMock.findOne = sinon.stub(Popup, "findOne").rejects(); - try { - await popupService.getPopupById(popupId); - } catch (error) { - expect(error.message).to.be.equal("Error retrieving popup by ID"); - } - const params = PopupMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: popupId }, - include: [{ model: db.User, as: "creator" }], + it("updatePopup - should return null if no popup is updated", async () => { + const popupId = 1; + PopupMock.update = sinon.stub(Popup, "update").resolves([0, []]); + const popupData = { header: "new header" }; + const updatedPopupResult = await popupService.updatePopup( + popupId, + popupData + ); + expect(updatedPopupResult).to.be.null; + const params = PopupMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal(popupData); + expect(params[1]).to.be.deep.equal({ + where: { id: popupId }, + returning: true, + }); + expect(PopupMock.update.called).to.be.true; + }); + it("updatePopup - should return the updated popup", async () => { + const popupId = 1; + const updatedPopup = popup(popupId).build(); + PopupMock.update = sinon + .stub(Popup, "update") + .resolves([1, [updatedPopup]]); + const popupData = { header: "new header" }; + const updatedPopupResult = await popupService.updatePopup( + popupId, + popupData + ); + expect(updatedPopupResult).to.be.deep.equal(updatedPopup); + const params = PopupMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal(popupData); + expect(params[1]).to.be.deep.equal({ + where: { id: popupId }, + returning: true, + }); + expect(PopupMock.update.called).to.be.true; + }); + it("getPopupById - should return the found popup", async () => { + const popupId = 1; + const foundPopup = popup(popupId).build(); + PopupMock.findOne = sinon.stub(Popup, "findOne").resolves(foundPopup); + const popupResult = await popupService.getPopupById(popupId); + expect(popupResult).to.be.deep.equal(foundPopup); + const params = PopupMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: popupId }, + include: [{ model: db.User, as: "creator" }], + }); + expect(PopupMock.findOne.called).to.be.true; + }); + it("getPopupById - should throw an error if the popup is not found", async () => { + const popupId = 1; + PopupMock.findOne = sinon.stub(Popup, "findOne").rejects(); + try { + await popupService.getPopupById(popupId); + } catch (error) { + expect(error.message).to.be.equal("Error retrieving popup by ID"); + } + const params = PopupMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: popupId }, + include: [{ model: db.User, as: "creator" }], + }); + expect(PopupMock.findOne.called).to.be.true; }); - expect(PopupMock.findOne.called).to.be.true; }); -}); +})(); diff --git a/backend/src/test/unit/services/team.test.js b/backend/src/test/unit/services/team.test.js index 12ac0023..04a3f124 100644 --- a/backend/src/test/unit/services/team.test.js +++ b/backend/src/test/unit/services/team.test.js @@ -1,200 +1,200 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const db = require("../../../models/index.js"); -const sinon = require("sinon"); -const { UserBuilder, validList } = require("../../mocks/user.mock.js"); -const { expect } = require("chai"); -const TeamService = require("../../../service/team.service.js"); +(async () => { + const { describe, it, beforeEach, afterEach } = await import("mocha"); + const sinon = await import("sinon"); + const { expect } = await import("chai"); + const db = require("../../../models/index.js"); + const { UserBuilder, validList } = require("../../mocks/user.mock.js"); + const TeamService = require("../../../service/team.service.js"); -const Invite = db.Invite; -const User = db.User; -const Team = db.Team; -const Token = db.Token; -const user = UserBuilder.user; -const service = new TeamService(); + const Invite = db.Invite; + const User = db.User; + const Team = db.Team; + const Token = db.Token; + const user = UserBuilder.user; + const service = new TeamService(); -describe("Test team service", () => { - const UserMock = {}; - const TeamMock = {}; - const InviteMock = {}; - const TokenMock = {}; - let commit; - let rollback; - beforeEach(() => { - commit = sinon.spy(); - rollback = sinon.spy(); - sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ - commit, - rollback, - })); - }); - afterEach(sinon.restore); - it("createTeam - should create the team", async () => { - TeamMock.create = sinon - .stub(Team, "create") - .resolves({ id: 1, name: "team" }); - const team = await service.createTeam("team"); - expect(team).to.deep.equal({ id: 1, name: "team" }); - expect(commit.called).to.be.true; - }); - it("createTeam - should rollback the transaction and throw an error if something goes wrong", async () => { - TeamMock.create = sinon.stub(Team, "create").rejects(); - try { - await service.createTeam("team"); - } catch (err) { - expect(rollback.called).to.be.true; - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal("Failed to create team"); - } - }); - it("getTeam - should return the team and the users on the team if every thing goes right", async () => { - TeamMock.findOne = sinon - .stub(Team, "findOne") - .resolves({ id: 1, name: "team" }); - UserMock.findAll = sinon.stub(User, "findAll").resolves(validList); - const team = await service.getTeam(); - expect(team).to.deep.equal({ - team: { id: 1, name: "team" }, - users: validList, + describe("Test team service", () => { + const UserMock = {}; + const TeamMock = {}; + const InviteMock = {}; + const TokenMock = {}; + let commit; + let rollback; + beforeEach(() => { + commit = sinon.spy(); + rollback = sinon.spy(); + sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ + commit, + rollback, + })); }); - }); - it("getTeam - should throw an error if something goes wrong", async () => { - TeamMock.findOne = sinon.stub(Team, "findOne").rejects(); - try { - await service.getTeam(); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal("Failed to retrieve team"); - } - }); - it("getTeamCount - should return an object with a boolean if the teamCount is bigger than 0", async () => { - TeamMock.count = sinon.stub(Team, "count").resolves(1); - const teamCount = await service.getTeamCount(); - expect(teamCount).to.deep.equal({ teamExists: true }); - }); - it("getTeamCount - should throw an error if something goes wrong", async () => { - TeamMock.count = sinon.stub(Team, "count").rejects(); - try { - await service.getTeamCount(); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal("Failed to get team count"); - } - }); - it("updateTeam - should update the teams name", async () => { - TeamMock.update = sinon.stub(Team, "update").resolves(1); - await service.updateTeam("newName"); - expect(commit.called).to.be.true; - const params = TeamMock.update.getCall(0).args; - expect(params[0]).to.deep.equal({ - name: "newName", + afterEach(sinon.restore); + it("createTeam - should create the team", async () => { + TeamMock.create = sinon + .stub(Team, "create") + .resolves({ id: 1, name: "team" }); + const team = await service.createTeam("team"); + expect(team).to.deep.equal({ id: 1, name: "team" }); + expect(commit.called).to.be.true; }); - expect(params[1]).to.deep.equal({ - where: {}, + it("createTeam - should rollback the transaction and throw an error if something goes wrong", async () => { + TeamMock.create = sinon.stub(Team, "create").rejects(); + try { + await service.createTeam("team"); + } catch (err) { + expect(rollback.called).to.be.true; + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Failed to create team"); + } }); - }); - it("updateTeam - should throw an error if something goes wrong", async () => { - TeamMock.update = sinon.stub(Team, "update").rejects(); - try { + it("getTeam - should return the team and the users on the team if every thing goes right", async () => { + TeamMock.findOne = sinon + .stub(Team, "findOne") + .resolves({ id: 1, name: "team" }); + UserMock.findAll = sinon.stub(User, "findAll").resolves(validList); + const team = await service.getTeam(); + expect(team).to.deep.equal({ + team: { id: 1, name: "team" }, + users: validList, + }); + }); + it("getTeam - should throw an error if something goes wrong", async () => { + TeamMock.findOne = sinon.stub(Team, "findOne").rejects(); + try { + await service.getTeam(); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Failed to retrieve team"); + } + }); + it("getTeamCount - should return an object with a boolean if the teamCount is bigger than 0", async () => { + TeamMock.count = sinon.stub(Team, "count").resolves(1); + const teamCount = await service.getTeamCount(); + expect(teamCount).to.deep.equal({ teamExists: true }); + }); + it("getTeamCount - should throw an error if something goes wrong", async () => { + TeamMock.count = sinon.stub(Team, "count").rejects(); + try { + await service.getTeamCount(); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Failed to get team count"); + } + }); + it("updateTeam - should update the teams name", async () => { + TeamMock.update = sinon.stub(Team, "update").resolves(1); await service.updateTeam("newName"); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal("Error Updating Team"); - } - }); - it("removeUserFromTeam - should throw an error if the userId is equal to the memberId", async () => { - try { - await service.removeUserFromTeam(1, 1); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal( - "Failed to remove user from team ~ User can't remove itself through team list" - ); - } - }); - it("removeUserFromTeam - should throw an error if the user to be removed is not found", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - try { - await service.removeUserFromTeam(1, 2); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal( - "Failed to remove user from team ~ User to be removed not found" - ); - } - }); - it("removeUserFromTeam - should remove the user, the invite and the token if everything goes right", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - InviteMock.destroy = sinon.stub(Invite, "destroy").resolves(1); - UserMock.destroy = sinon.stub(User, "destroy").resolves(1); - TokenMock.destroy = sinon.stub(Token, "destroy").resolves(1); - await service.removeUserFromTeam(1, 2); - expect(commit.called).to.be.true; - }); - it("removeUserFromTeam - should throw an error if something goes wrong", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - UserMock.destroy = sinon.stub(User, "destroy").rejects(); - try { + expect(commit.called).to.be.true; + const params = TeamMock.update.getCall(0).args; + expect(params[0]).to.deep.equal({ + name: "newName", + }); + expect(params[1]).to.deep.equal({ + where: {}, + }); + }); + it("updateTeam - should throw an error if something goes wrong", async () => { + TeamMock.update = sinon.stub(Team, "update").rejects(); + try { + await service.updateTeam("newName"); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Error Updating Team"); + } + }); + it("removeUserFromTeam - should throw an error if the userId is equal to the memberId", async () => { + try { + await service.removeUserFromTeam(1, 1); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal( + "Failed to remove user from team ~ User can't remove itself through team list" + ); + } + }); + it("removeUserFromTeam - should throw an error if the user to be removed is not found", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + try { + await service.removeUserFromTeam(1, 2); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal( + "Failed to remove user from team ~ User to be removed not found" + ); + } + }); + it("removeUserFromTeam - should remove the user, the invite and the token if everything goes right", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + InviteMock.destroy = sinon.stub(Invite, "destroy").resolves(1); + UserMock.destroy = sinon.stub(User, "destroy").resolves(1); + TokenMock.destroy = sinon.stub(Token, "destroy").resolves(1); await service.removeUserFromTeam(1, 2); - } catch (err) { - expect(rollback.called).to.be.true; - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal( - "Failed to remove user from team ~ Error" - ); - } - }); - it("updateUserRole - should throw an error if the member is not found", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - try { - await service.updateUserRole(1, "member"); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal( - "Failed to update user role ~ User Not Found" - ); - expect(rollback.called).to.be.true; - } - }); - it("updateUserRole - should throw an error if the team has only one admin", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - UserMock.count = sinon.stub(User, "count").resolves(1); - try { - await service.updateUserRole(1, "member"); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal( - "Failed to update user role ~ " - ); - expect(rollback.called).to.be.true; - } - }); - it("updateUserRole - should update the role", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - UserMock.count = sinon.stub(User, "count").resolves(2); - UserMock.update = sinon - .stub(User, "update") - .resolves({ ...user().build(), role: "member" }); - await service.updateUserRole(1, "member"); - expect(commit.called).to.be.true; - expect(UserMock.update.called).to.be.true; - const params = UserMock.update.getCall(0).args; - expect(params[0]).to.deep.equal({ - role: "2", - }); - expect(params[1]).to.deep.equal({ - where: { id: 1 }, + expect(commit.called).to.be.true; }); - }); - it("updateUserRole - should throw an error if something goes wrong", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - UserMock.count = sinon.stub(User, "count").resolves(2); - UserMock.update = sinon.stub(User, "update").rejects(); - try { + it("removeUserFromTeam - should throw an error if something goes wrong", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + UserMock.destroy = sinon.stub(User, "destroy").rejects(); + try { + await service.removeUserFromTeam(1, 2); + } catch (err) { + expect(rollback.called).to.be.true; + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal( + "Failed to remove user from team ~ Error" + ); + } + }); + it("updateUserRole - should throw an error if the member is not found", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + try { + await service.updateUserRole(1, "member"); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal( + "Failed to update user role ~ User Not Found" + ); + expect(rollback.called).to.be.true; + } + }); + it("updateUserRole - should throw an error if the team has only one admin", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + UserMock.count = sinon.stub(User, "count").resolves(1); + try { + await service.updateUserRole(1, "member"); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Failed to update user role ~ "); + expect(rollback.called).to.be.true; + } + }); + it("updateUserRole - should update the role", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + UserMock.count = sinon.stub(User, "count").resolves(2); + UserMock.update = sinon + .stub(User, "update") + .resolves({ ...user().build(), role: "member" }); await service.updateUserRole(1, "member"); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal("Failed to update user role ~ Error"); - expect(rollback.called).to.be.true; - } + expect(commit.called).to.be.true; + expect(UserMock.update.called).to.be.true; + const params = UserMock.update.getCall(0).args; + expect(params[0]).to.deep.equal({ + role: "2", + }); + expect(params[1]).to.deep.equal({ + where: { id: 1 }, + }); + }); + it("updateUserRole - should throw an error if something goes wrong", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + UserMock.count = sinon.stub(User, "count").resolves(2); + UserMock.update = sinon.stub(User, "update").rejects(); + try { + await service.updateUserRole(1, "member"); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Failed to update user role ~ Error"); + expect(rollback.called).to.be.true; + } + }); }); -}); +})(); diff --git a/backend/src/test/unit/services/tour.test.js b/backend/src/test/unit/services/tour.test.js index ab25a43b..99e0635d 100644 --- a/backend/src/test/unit/services/tour.test.js +++ b/backend/src/test/unit/services/tour.test.js @@ -1,113 +1,115 @@ -const { describe, it, beforeEach, afterEach } = require("mocha"); -const db = require("../../../models/index.js"); -const sinon = require("sinon"); -const mocks = require("../../mocks/tour.mock.js"); -const { expect } = require("chai"); -const tourService = require("../../../service/tour.service.js"); +(async () => { + const { describe, it, afterEach } = await import("mocha"); + const { expect } = await import("chai"); + const sinon = await import("sinon"); + const db = require("../../../models/index.js"); + const mocks = require("../../mocks/tour.mock.js"); + const tourService = require("../../../service/tour.service.js"); -const Tour = db.Tour; -const tour = mocks.TourBuilder.tour; + const Tour = db.Tour; + const tour = mocks.TourBuilder.tour; -describe("Test tour service", () => { - const TourMock = {}; - afterEach(sinon.restore); - it("getAllTours - should return all tours with it's users", async () => { - TourMock.findAll = sinon.stub(Tour, "findAll").resolves(mocks.toursList); - const tours = await tourService.getAllTours(); - expect(tours).to.be.deep.equal(mocks.toursList); - expect(TourMock.findAll.called).to.be.true; - const params = TourMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - include: [{ model: db.User, as: "creator" }], + describe("Test tour service", () => { + const TourMock = {}; + afterEach(sinon.restore); + it("getAllTours - should return all tours with it's users", async () => { + TourMock.findAll = sinon.stub(Tour, "findAll").resolves(mocks.toursList); + const tours = await tourService.getAllTours(); + expect(tours).to.be.deep.equal(mocks.toursList); + expect(TourMock.findAll.called).to.be.true; + const params = TourMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + include: [{ model: db.User, as: "creator" }], + }); }); - }); - it("getTours - should return only the tours created by the specific user", async () => { - const userId = 1; - TourMock.findAll = sinon.stub(Tour, "findAll").resolves(mocks.toursList); - const tours = await tourService.getTours(userId); - expect(tours).to.be.deep.equal(mocks.toursList); - expect(TourMock.findAll.called).to.be.true; - const params = TourMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { createdBy: userId }, - include: [{ model: db.User, as: "creator" }], + it("getTours - should return only the tours created by the specific user", async () => { + const userId = 1; + TourMock.findAll = sinon.stub(Tour, "findAll").resolves(mocks.toursList); + const tours = await tourService.getTours(userId); + expect(tours).to.be.deep.equal(mocks.toursList); + expect(TourMock.findAll.called).to.be.true; + const params = TourMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { createdBy: userId }, + include: [{ model: db.User, as: "creator" }], + }); }); - }); - it("createTour - should return the tour created", async () => { - const newTour = tour(1).build(); - TourMock.create = sinon.stub(Tour, "create").resolves(newTour); - const createdTour = await tourService.createTour(newTour); - expect(createdTour).to.be.deep.equal(newTour); - expect(TourMock.create.called).to.be.true; - const params = TourMock.create.getCall(0).args[0]; - expect(params).to.be.deep.equal(newTour); - }); - it("deleteTour - if no tour is deleted, should return false", async () => { - const id = 1; - TourMock.destroy = sinon.stub(Tour, "destroy").resolves(0); - const isDeleted = await tourService.deleteTour(id); - expect(isDeleted).to.be.false; - expect(TourMock.destroy.called).to.be.true; - const params = TourMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id } }); - }); - it("deleteTour - if a tour is deleted, should return true", async () => { - const id = 1; - TourMock.destroy = sinon.stub(Tour, "destroy").resolves(1); - const isDeleted = await tourService.deleteTour(id); - expect(isDeleted).to.be.true; - expect(TourMock.destroy.called).to.be.true; - const params = TourMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id } }); - }); - it("updateTour - should return null if no tour is updated", async () => { - const id = 1; - const data = tour(1).build(); - TourMock.update = sinon.stub(Tour, "update").resolves([0, []]); - const updatedTour = await tourService.updateTour(id, data); - expect(updatedTour).to.be.null; - expect(TourMock.update.called).to.be.true; - const params = TourMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal(data); - expect(params[1]).to.be.deep.equal({ where: { id }, returning: true }); - }); - it("updateTour - should return the updated tour", async () => { - const id = 1; - const data = tour(1).build(); - TourMock.update = sinon.stub(Tour, "update").resolves([1, [data]]); - const updatedTour = await tourService.updateTour(id, data); - expect(updatedTour).to.be.deep.equal(data); - expect(TourMock.update.called).to.be.true; - const params = TourMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal(data); - expect(params[1]).to.be.deep.equal({ where: { id }, returning: true }); - }); - it("getTourById - should return the found tour", async () => { - const tourId = 1; - const expectedTour = tour(1).build(); - TourMock.findOne = sinon.stub(Tour, "findOne").resolves(expectedTour); - const foundTour = await tourService.getTourById(tourId); - expect(foundTour).to.be.deep.equal(expectedTour); - expect(TourMock.findOne.called).to.be.true; - const params = TourMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: tourId }, - include: [{ model: db.User, as: "creator" }], + it("createTour - should return the tour created", async () => { + const newTour = tour(1).build(); + TourMock.create = sinon.stub(Tour, "create").resolves(newTour); + const createdTour = await tourService.createTour(newTour); + expect(createdTour).to.be.deep.equal(newTour); + expect(TourMock.create.called).to.be.true; + const params = TourMock.create.getCall(0).args[0]; + expect(params).to.be.deep.equal(newTour); }); - }); - it("getTourById - should throw an error if the tour is not found", async () => { - const tourId = 1; - TourMock.findOne = sinon.stub(Tour, "findOne").rejects(); - try { - await tourService.getTourById(tourId); - } catch (error) { - expect(error.message).to.be.equal("Error retrieving tour by ID"); - } - expect(TourMock.findOne.called).to.be.true; - const params = TourMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: tourId }, - include: [{ model: db.User, as: "creator" }], + it("deleteTour - if no tour is deleted, should return false", async () => { + const id = 1; + TourMock.destroy = sinon.stub(Tour, "destroy").resolves(0); + const isDeleted = await tourService.deleteTour(id); + expect(isDeleted).to.be.false; + expect(TourMock.destroy.called).to.be.true; + const params = TourMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id } }); + }); + it("deleteTour - if a tour is deleted, should return true", async () => { + const id = 1; + TourMock.destroy = sinon.stub(Tour, "destroy").resolves(1); + const isDeleted = await tourService.deleteTour(id); + expect(isDeleted).to.be.true; + expect(TourMock.destroy.called).to.be.true; + const params = TourMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id } }); + }); + it("updateTour - should return null if no tour is updated", async () => { + const id = 1; + const data = tour(1).build(); + TourMock.update = sinon.stub(Tour, "update").resolves([0, []]); + const updatedTour = await tourService.updateTour(id, data); + expect(updatedTour).to.be.null; + expect(TourMock.update.called).to.be.true; + const params = TourMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal(data); + expect(params[1]).to.be.deep.equal({ where: { id }, returning: true }); + }); + it("updateTour - should return the updated tour", async () => { + const id = 1; + const data = tour(1).build(); + TourMock.update = sinon.stub(Tour, "update").resolves([1, [data]]); + const updatedTour = await tourService.updateTour(id, data); + expect(updatedTour).to.be.deep.equal(data); + expect(TourMock.update.called).to.be.true; + const params = TourMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal(data); + expect(params[1]).to.be.deep.equal({ where: { id }, returning: true }); + }); + it("getTourById - should return the found tour", async () => { + const tourId = 1; + const expectedTour = tour(1).build(); + TourMock.findOne = sinon.stub(Tour, "findOne").resolves(expectedTour); + const foundTour = await tourService.getTourById(tourId); + expect(foundTour).to.be.deep.equal(expectedTour); + expect(TourMock.findOne.called).to.be.true; + const params = TourMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: tourId }, + include: [{ model: db.User, as: "creator" }], + }); + }); + it("getTourById - should throw an error if the tour is not found", async () => { + const tourId = 1; + TourMock.findOne = sinon.stub(Tour, "findOne").rejects(); + try { + await tourService.getTourById(tourId); + } catch (error) { + expect(error.message).to.be.equal("Error retrieving tour by ID"); + } + expect(TourMock.findOne.called).to.be.true; + const params = TourMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: tourId }, + include: [{ model: db.User, as: "creator" }], + }); }); }); -}); +})(); diff --git a/backend/src/test/unit/services/user.test.js b/backend/src/test/unit/services/user.test.js index 416ff18d..871a3831 100644 --- a/backend/src/test/unit/services/user.test.js +++ b/backend/src/test/unit/services/user.test.js @@ -1,264 +1,273 @@ -const { describe, it, afterEach } = require("mocha"); -const { expect } = require("chai"); -const sinon = require("sinon"); -const db = require("../../../models/index.js"); -const UserService = require("../../../service/user.service.js"); -const mocks = require("../../mocks/user.mock.js"); +(async () => { + const { describe, it, afterEach } = await import("mocha"); + const { expect } = await import("chai"); + const sinon = await import("sinon"); + const db = require("../../../models/index.js"); + const UserService = require("../../../service/user.service.js"); + const mocks = require("../../mocks/user.mock.js"); -const service = new UserService(); + const service = new UserService(); -describe("Unit test user service", () => { - let User; - let Invite; - let Token; - let Sequelize; - let commit; - let rollback; - beforeEach(() => { - commit = sinon.spy(); - rollback = sinon.spy(); - sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ - commit, - rollback, - })); - Sequelize = sinon.spy(db, "Sequelize"); - }); - afterEach(() => { - sinon.restore(); - }); - it("getUser - should throw an error if something goes wrong", async () => { - User = sinon.stub(db.User, "findOne").rejects(); - try { - await service.getUser(1); - } catch (err) { - expect(err).to.have.property("message", "Error retrieving User by ID"); - expect(err).to.be.instanceOf(Error); - } - expect(User.callCount).to.be.equal(1); - expect( - User.calledWith({ - where: { id: 1 }, - }) - ).to.be.true; - }); - it("getUser - should return the user if everything is ok", async () => { - User = sinon.stub(db.User, "findOne").resolves(mocks.validUser); - const user = await service.getUser(1); - expect(User.threw()).to.be.false; - expect(User.callCount).to.be.equal(1); - expect( - User.calledWith({ - where: { id: 1 }, - }) - ).to.be.true; - expect(user).to.be.equal(mocks.validUser); - }); - it("getUsers - should return all the users if the search param is an empty string", async () => { - User = sinon - .stub(db.User, "findAndCountAll") - .resolves(mocks.validList.slice(0, 2)); - const users = await service.getUsers({ search: "", page: 1, limit: 2 }); + describe("Unit test user service", () => { + let User; + let Invite; + let Token; + let Sequelize; + let commit; + let rollback; + beforeEach(() => { + commit = sinon.spy(); + rollback = sinon.spy(); + sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ + commit, + rollback, + })); + Sequelize = sinon.spy(db, "Sequelize"); + }); + afterEach(() => { + sinon.restore(); + }); + it("getUser - should throw an error if something goes wrong", async () => { + User = sinon.stub(db.User, "findOne").rejects(); + try { + await service.getUser(1); + } catch (err) { + expect(err).to.have.property("message", "Error retrieving User by ID"); + expect(err).to.be.instanceOf(Error); + } + expect(User.callCount).to.be.equal(1); + expect( + User.calledWith({ + where: { id: 1 }, + }) + ).to.be.true; + }); + it("getUser - should return the user if everything is ok", async () => { + User = sinon.stub(db.User, "findOne").resolves(mocks.validUser); + const user = await service.getUser(1); + expect(User.threw()).to.be.false; + expect(User.callCount).to.be.equal(1); + expect( + User.calledWith({ + where: { id: 1 }, + }) + ).to.be.true; + expect(user).to.be.equal(mocks.validUser); + }); + it("getUsers - should return all the users if the search param is an empty string", async () => { + User = sinon + .stub(db.User, "findAndCountAll") + .resolves(mocks.validList.slice(0, 2)); + const users = await service.getUsers({ search: "", page: 1, limit: 2 }); - expect( - User.calledWith({ - where: { - [Sequelize.Op.or]: [ - { - name: { - [Sequelize.Op.like]: `%%`, + expect( + User.calledWith({ + where: { + [Sequelize.Op.or]: [ + { + name: { + [Sequelize.Op.like]: `%%`, + }, }, - }, - { - surname: { - [Sequelize.Op.like]: `%%`, + { + surname: { + [Sequelize.Op.like]: `%%`, + }, }, - }, - ], - }, - limit: 2, - offset: 0, - }) - ).to.be.true; - expect(users).not.to.be.equal(mocks.validList); - expect(users).to.have.length(2); - }); - it("getUsers - should filter users when search param is provided", async () => { - User = sinon - .stub(db.User, "findAndCountAll") - .resolves(mocks.validList.filter((u) => u.name.includes("Harry"))); - await service.getUsers({ search: "Harry", page: 1, limit: 2 }); - const params = User.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { - [Sequelize.Op.or]: [ - { name: { [Sequelize.Op.like]: `%Harry%` } }, - { surname: { [Sequelize.Op.like]: `%Harry%` } }, - ], - }, - limit: 2, - offset: 0, + ], + }, + limit: 2, + offset: 0, + }) + ).to.be.true; + expect(users).not.to.be.equal(mocks.validList); + expect(users).to.have.length(2); }); - }); - it("getUsers - should return the correct pagination when the page changes", async () => { - User = sinon - .stub(db.User, "findAndCountAll") - .onFirstCall() - .resolves(mocks.validList.slice(0, 2)) - .onSecondCall() - .resolves(mocks.validList.slice(2, 4)); - const firstList = await service.getUsers({ search: "", page: 1, limit: 2 }); - expect( - User.calledWith({ + it("getUsers - should filter users when search param is provided", async () => { + User = sinon + .stub(db.User, "findAndCountAll") + .resolves(mocks.validList.filter((u) => u.name.includes("Harry"))); + await service.getUsers({ search: "Harry", page: 1, limit: 2 }); + const params = User.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { [Sequelize.Op.or]: [ - { - name: { - [Sequelize.Op.like]: `%%`, - }, - }, - { - surname: { - [Sequelize.Op.like]: `%%`, - }, - }, + { name: { [Sequelize.Op.like]: `%Harry%` } }, + { surname: { [Sequelize.Op.like]: `%Harry%` } }, ], }, limit: 2, offset: 0, - }) - ).to.be.true; - expect(firstList).not.to.be.equal(mocks.validList); - expect(firstList).to.have.length(2); - const secondList = await service.getUsers({ - search: "", - page: 2, - limit: 2, + }); }); - expect( - User.calledWith({ - where: { - [Sequelize.Op.or]: [ - { - name: { - [Sequelize.Op.like]: `%%`, + it("getUsers - should return the correct pagination when the page changes", async () => { + User = sinon + .stub(db.User, "findAndCountAll") + .onFirstCall() + .resolves(mocks.validList.slice(0, 2)) + .onSecondCall() + .resolves(mocks.validList.slice(2, 4)); + const firstList = await service.getUsers({ + search: "", + page: 1, + limit: 2, + }); + expect( + User.calledWith({ + where: { + [Sequelize.Op.or]: [ + { + name: { + [Sequelize.Op.like]: `%%`, + }, }, - }, - { - surname: { - [Sequelize.Op.like]: `%%`, + { + surname: { + [Sequelize.Op.like]: `%%`, + }, }, - }, - ], - }, + ], + }, + limit: 2, + offset: 0, + }) + ).to.be.true; + expect(firstList).not.to.be.equal(mocks.validList); + expect(firstList).to.have.length(2); + const secondList = await service.getUsers({ + search: "", + page: 2, limit: 2, - offset: 2, - }) - ).to.be.true; - expect(secondList).to.have.length(2); - expect(secondList).not.to.be.equal(firstList); - }); - it("getUsers - should throw the error message 'Error retrieving users list' if something goes wrong", async () => { - User = sinon.stub(db.User, "findAndCountAll").rejects({}); - try { - await service.getUsers({ search: "", page: 1, limit: 2 }); - } catch (error) { - expect(error).to.have.property("message", "Error retrieving users list"); - expect(error).to.be.instanceOf(Error); - } - expect( - User.calledWith({ - where: { - [Sequelize.Op.or]: [ - { - name: { - [Sequelize.Op.like]: `%%`, + }); + expect( + User.calledWith({ + where: { + [Sequelize.Op.or]: [ + { + name: { + [Sequelize.Op.like]: `%%`, + }, }, - }, - { - surname: { - [Sequelize.Op.like]: `%%`, + { + surname: { + [Sequelize.Op.like]: `%%`, + }, }, - }, - ], - }, - limit: 2, - offset: 0, - }) - ).to.be.true; - expect(User.callCount).to.be.equal(1); - }); - it("updateUser - if the user is updated, should return the updated user", async () => { - const details = { - name: "Harry", - surname: "Potter", - email: "harry.potter@wizards.com", - }; - User = sinon - .stub(db.User, "update") - .resolves([1, [{ ...mocks.validUser, ...details }]]); - const user = await service.updateUser(1, details); - expect( - User.calledWith(details, { - where: { id: 1 }, - returning: true, - }) - ).to.be.true; - expect(user).not.to.equal(mocks.validUser); - expect(user).to.have.property("name", "Harry"); - }); - it("updateUser - if something goes wrong, should throw an error 'Error updating user'", async () => { - const details = { - name: "Harry", - surname: "Potter", - email: "harry.potter@wizards.com", - }; - User = sinon.stub(db.User, "update").rejects(); - try { - await service.updateUser(1, details); - } catch (error) { - expect(error).to.have.property("message", "Error updating user"); - expect(error).to.be.instanceOf(Error); - } - expect( - User.calledWith(details, { - where: { id: 1 }, - returning: true, - }) - ).to.be.true; - }); - it("deleteUser - if the user is the only admin role, should throw an error", async () => { - sinon.stub(db.User, "findOne").resolves(mocks.validUser); - sinon.stub(db.User, "count").resolves(1); - User = sinon.stub(db.User, "destroy"); - Token = sinon.stub(db.Token, "destroy"); - Invite = sinon.stub(db.Invite, "destroy"); - try { - await service.deleteUser(1); - } catch (error) { - expect(error).to.be.instanceOf(Error); - expect(error).to.have.property( - "message", - "Error deleting user ~ The team has only single admin and can't delete themselves" - ); - } - expect(User.called).to.be.false; - expect(Invite.called).to.be.false; - expect(Token.called).to.be.false; - expect(commit.called).to.be.false; - expect(rollback.called).to.be.true; - }); - it("deleteUser - if the user is not the admin role, should delete the user, the invite and the token", async () => { - sinon.stub(db.User, "findOne").resolves(mocks.validUser); - sinon.stub(db.User, "count").resolves(2); - User = sinon.stub(db.User, "destroy"); - Token = sinon.stub(db.Token, "destroy"); - Invite = sinon.stub(db.Invite, "destroy"); + ], + }, + limit: 2, + offset: 2, + }) + ).to.be.true; + expect(secondList).to.have.length(2); + expect(secondList).not.to.be.equal(firstList); + }); + it("getUsers - should throw the error message 'Error retrieving users list' if something goes wrong", async () => { + User = sinon.stub(db.User, "findAndCountAll").rejects({}); + try { + await service.getUsers({ search: "", page: 1, limit: 2 }); + } catch (error) { + expect(error).to.have.property( + "message", + "Error retrieving users list" + ); + expect(error).to.be.instanceOf(Error); + } + expect( + User.calledWith({ + where: { + [Sequelize.Op.or]: [ + { + name: { + [Sequelize.Op.like]: `%%`, + }, + }, + { + surname: { + [Sequelize.Op.like]: `%%`, + }, + }, + ], + }, + limit: 2, + offset: 0, + }) + ).to.be.true; + expect(User.callCount).to.be.equal(1); + }); + it("updateUser - if the user is updated, should return the updated user", async () => { + const details = { + name: "Harry", + surname: "Potter", + email: "harry.potter@wizards.com", + }; + User = sinon + .stub(db.User, "update") + .resolves([1, [{ ...mocks.validUser, ...details }]]); + const user = await service.updateUser(1, details); + expect( + User.calledWith(details, { + where: { id: 1 }, + returning: true, + }) + ).to.be.true; + expect(user).not.to.equal(mocks.validUser); + expect(user).to.have.property("name", "Harry"); + }); + it("updateUser - if something goes wrong, should throw an error 'Error updating user'", async () => { + const details = { + name: "Harry", + surname: "Potter", + email: "harry.potter@wizards.com", + }; + User = sinon.stub(db.User, "update").rejects(); + try { + await service.updateUser(1, details); + } catch (error) { + expect(error).to.have.property("message", "Error updating user"); + expect(error).to.be.instanceOf(Error); + } + expect( + User.calledWith(details, { + where: { id: 1 }, + returning: true, + }) + ).to.be.true; + }); + it("deleteUser - if the user is the only admin role, should throw an error", async () => { + sinon.stub(db.User, "findOne").resolves(mocks.validUser); + sinon.stub(db.User, "count").resolves(1); + User = sinon.stub(db.User, "destroy"); + Token = sinon.stub(db.Token, "destroy"); + Invite = sinon.stub(db.Invite, "destroy"); + try { + await service.deleteUser(1); + } catch (error) { + expect(error).to.be.instanceOf(Error); + expect(error).to.have.property( + "message", + "Error deleting user ~ The team has only single admin and can't delete themselves" + ); + } + expect(User.called).to.be.false; + expect(Invite.called).to.be.false; + expect(Token.called).to.be.false; + expect(commit.called).to.be.false; + expect(rollback.called).to.be.true; + }); + it("deleteUser - if the user is not the admin role, should delete the user, the invite and the token", async () => { + sinon.stub(db.User, "findOne").resolves(mocks.validUser); + sinon.stub(db.User, "count").resolves(2); + User = sinon.stub(db.User, "destroy"); + Token = sinon.stub(db.Token, "destroy"); + Invite = sinon.stub(db.Invite, "destroy"); - const result = await service.deleteUser(1); - expect(User.called).to.be.true; - expect(Invite.called).to.be.true; - expect(Token.called).to.be.true; - expect(commit.called).to.be.true; - expect(rollback.called).to.be.false; + const result = await service.deleteUser(1); + expect(User.called).to.be.true; + expect(Invite.called).to.be.true; + expect(Token.called).to.be.true; + expect(commit.called).to.be.true; + expect(rollback.called).to.be.false; + }); }); -}); +})(); From eb755cb288edf634ea4f0250a2b55db2d2831ef2 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Sat, 7 Dec 2024 11:18:13 -0800 Subject: [PATCH 118/178] chore: delete e2e test from popuplog --- backend/src/test/e2e/popuplog.test.mjs | 139 ------------------------- 1 file changed, 139 deletions(-) delete mode 100644 backend/src/test/e2e/popuplog.test.mjs diff --git a/backend/src/test/e2e/popuplog.test.mjs b/backend/src/test/e2e/popuplog.test.mjs deleted file mode 100644 index 97c30ab5..00000000 --- a/backend/src/test/e2e/popuplog.test.mjs +++ /dev/null @@ -1,139 +0,0 @@ -import { expect } from "chai"; -import { after, afterEach, before, beforeEach, describe } from "mocha"; -import waitOn from "wait-on"; -import db from "../../models/index.js"; -import app from "../../server.js"; -import mocks from "../mocks/popupLog.mock.js"; -import chai from "./index.mjs"; - -const dbReadyOptions = { - resources: ["tcp:localhost:5432"], - delay: 1000, - timeout: 30000, - interval: 1000, -}; - -const popupLog = mocks.PopupLogBuilder.popupLog; -const popupLogList = mocks.popupLogList; - -const setupDatabase = () => { - before(async () => { - db.sequelize.connectionManager.initPools(); - }); - - after(async () => { - const conn = await db.sequelize.connectionManager.getConnection(); - db.sequelize.connectionManager.releaseConnection(conn); - }); - - beforeEach(async () => { - try { - await waitOn(dbReadyOptions); - } catch (err) { - console.error("Database not ready in time:", err); - throw err; - } - }); - - afterEach(async () => { - await db.sequelize.sync({ force: true, match: /_test$/ }); - }); -}; - -const createPopupLog = async (log) => { - const res = await chai.request - .execute(app) - .post("/api/popup_log/add_popup_log") - .send(log); - return res.body; -}; - -describe("E2e tests popupLog", () => { - describe("POST /api/popup_log/add_popup_log", () => { - setupDatabase(); - it("should return 400 if popupType is missing", async () => { - const res = await chai.request - .execute(app) - .post("/api/popup_log/add_popup_log") - .send(popupLog().missingPopupType().build()); - expect(res).to.have.status(400); - expect(res.body).to.be.deep.equal({ - errors: ["popupType is required", "Invalid popupType"], - }); - }); - it("should return 400 if popupType is invalid", async () => { - const res = await chai.request - .execute(app) - .post("/api/popup_log/add_popup_log") - .send(popupLog().invalidPopupType().build()); - expect(res).to.have.status(400); - expect(res.body).to.be.deep.equal({ errors: ["Invalid popupType"] }); - }); - it("should return 400 if userId is missing", async () => { - const res = await chai.request - .execute(app) - .post("/api/popup_log/add_popup_log") - .send(popupLog().missingUserId().build()); - expect(res).to.have.status(400); - expect(res.body).to.be.deep.equal({ - errors: ["userId is required", "userId must be a non-empty string"], - }); - }); - it("should return 400 if userId is invalid", async () => { - const res = await chai.request - .execute(app) - .post("/api/popup_log/add_popup_log") - .send(popupLog().invalidUserId().build()); - expect(res).to.have.status(400); - expect(res.body).to.be.deep.equal({ - errors: ["userId must be a non-empty string"], - }); - }); - it("should return 400 if completed is missing", async () => { - const res = await chai.request - .execute(app) - .post("/api/popup_log/add_popup_log") - .send(popupLog().missingCompleted().build()); - expect(res).to.have.status(400); - expect(res.body).to.be.deep.equal({ - errors: ["Invalid value", "completed must be a boolean value"], - }); - }); - it("should return 400 if completed is invalid", async () => { - const res = await chai.request - .execute(app) - .post("/api/popup_log/add_popup_log") - .send(popupLog().invalidCompleted().build()); - expect(res).to.have.status(400); - expect(res.body).to.be.deep.equal({ - errors: ["completed must be a boolean value"], - }); - }); - it("should return 201 if all fields are valid", async () => { - const popupInfo = popupLog().build(); - const res = await chai.request - .execute(app) - .post("/api/popup_log/add_popup_log") - .send(popupInfo); - expect(res).to.have.status(201); - const { showingTime, id, ...rest } = res.body; - const { showingTime: s, ...expected } = popupInfo; - expect(rest).to.deep.equal(expected); - expect(Date.parse(showingTime)).to.be.closeTo( - Date.parse(new Date()), - 1000 - ); - }); - }); - describe("POST /api/popup_log/get_popup_logs", () => { - setupDatabase(); - it("should return 200 and an empty array if no logs", async () => { - await Promise.all(popupLogList.map((log) => createPopupLog(log))); - const res = await chai.request - .execute(app) - .get("/api/popup_log/get_popup_logs"); - expect(res).to.have.status(200); - expect(res.body).to.be.have.length(5); - }); - }); -}); From e9746996686589f8417ba591626bb8578b9c5b22 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Sat, 7 Dec 2024 11:18:35 -0800 Subject: [PATCH 119/178] docs: update actions to prevent cache of node --- .github/workflows/node.js.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 75f5760c..b6a7217e 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -20,6 +20,7 @@ jobs: uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} + check-latest: true # Clear npm cache - name: Clear npm cache From 7007ca825afc7653aa17f4cb7f6645afe334dd7c Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Sat, 7 Dec 2024 11:24:09 -0800 Subject: [PATCH 120/178] test: undo dynamic imports --- .../src/test/unit/controllers/auth.test.js | 703 +++++---- .../src/test/unit/controllers/banner.test.js | 722 +++++---- .../test/unit/controllers/helperLink.test.js | 1376 ++++++++--------- .../src/test/unit/controllers/hint.test.js | 824 +++++----- .../src/test/unit/controllers/invite.test.js | 142 +- .../src/test/unit/controllers/link.test.js | 968 ++++++------ .../test/unit/controllers/onboarding.test.js | 206 ++- .../src/test/unit/controllers/popup.test.js | 974 ++++++------ .../src/test/unit/controllers/team.test.js | 496 +++--- .../src/test/unit/controllers/tour.test.js | 642 ++++---- .../src/test/unit/controllers/user.test.js | 313 ++-- backend/src/test/unit/services/banner.test.js | 200 ++- backend/src/test/unit/services/email.test.js | 188 ++- .../src/test/unit/services/helperLink.test.js | 482 +++--- backend/src/test/unit/services/hint.test.js | 336 ++-- backend/src/test/unit/services/invite.test.js | 158 +- backend/src/test/unit/services/link.test.js | 247 ++- backend/src/test/unit/services/popup.test.js | 250 ++- backend/src/test/unit/services/team.test.js | 378 +++-- backend/src/test/unit/services/tour.test.js | 214 ++- backend/src/test/unit/services/user.test.js | 501 +++--- 21 files changed, 5116 insertions(+), 5204 deletions(-) diff --git a/backend/src/test/unit/controllers/auth.test.js b/backend/src/test/unit/controllers/auth.test.js index 875befa9..a7adb897 100644 --- a/backend/src/test/unit/controllers/auth.test.js +++ b/backend/src/test/unit/controllers/auth.test.js @@ -1,398 +1,393 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const emailService = require("../../../service/email.service.js"); - const db = require("../../../models/index.js"); - const auth = require("../../../controllers/auth.controller.js"); - const mocks = require("../../mocks/user.mock.js"); - const jwt = require("jsonwebtoken"); - const bcrypt = require("bcryptjs"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const emailService = require("../../../service/email.service.js"); +const db = require("../../../models/index.js"); +const auth = require("../../../controllers/auth.controller.js"); +const mocks = require("../../mocks/user.mock.js"); +const jwt = require("jsonwebtoken"); +const bcrypt = require("bcryptjs"); - const User = db.User; - const Token = db.Token; +const User = db.User; +const Token = db.Token; - describe("Unit test auth controller", () => { - const req = {}; - const res = {}; - const fakeToken = jwt.sign( - { id: 1 }, - process.env.JWT_SECRET || "test_secret" - ); - const UserMock = {}; - const TokenMock = {}; - let commit; - let rollback; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - commit = sinon.spy(); - rollback = sinon.spy(); - sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ - commit, - rollback, - })); - }); - afterEach(sinon.restore); - it("register - if something goes wrong, should return status 500", async () => { - UserMock.findOne = sinon.stub(User, "findOne").rejects(); - req.body = { ...mocks.validUser }; - await auth.register(req, res); +describe("Unit test auth controller", () => { + const req = {}; + const res = {}; + const fakeToken = jwt.sign( + { id: 1 }, + process.env.JWT_SECRET || "test_secret" + ); + const UserMock = {}; + const TokenMock = {}; + let commit; + let rollback; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + commit = sinon.spy(); + rollback = sinon.spy(); + sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ + commit, + rollback, + })); + }); + afterEach(sinon.restore); + it("register - if something goes wrong, should return status 500", async () => { + UserMock.findOne = sinon.stub(User, "findOne").rejects(); + req.body = { ...mocks.validUser }; + await auth.register(req, res); - expect(res.status.args[0][0]).to.be.equal(500); - const body = res.json.args[0][0]; - const { token, ...info } = body; - expect(info).to.be.deep.equal({ - error: "Internal Server Error", - }); + expect(res.status.args[0][0]).to.be.equal(500); + const body = res.json.args[0][0]; + const { token, ...info } = body; + expect(info).to.be.deep.equal({ + error: "Internal Server Error", }); - it("register - should return status 400 if the email is already registered", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(true); - req.body = mocks.validUser; - await auth.register(req, res); - expect(UserMock.findOne.called).to.be.true; - expect( - UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) - ).to.be.true; - expect(res.status.args[0][0]).to.be.equal(400); - expect(res.json.args[0][0]).to.be.deep.equal({ - error: "Email already exists", - }); + }); + it("register - should return status 400 if the email is already registered", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(true); + req.body = mocks.validUser; + await auth.register(req, res); + expect(UserMock.findOne.called).to.be.true; + expect( + UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) + ).to.be.true; + expect(res.status.args[0][0]).to.be.equal(400); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Email already exists", }); - it("register - should return the created user and the token if there is a user already created", async () => { - UserMock.count = sinon.stub(User, "count").resolves(1); - UserMock.create = sinon.stub(User, "create").resolves(mocks.validUser); - UserMock.findOne = sinon.stub(User, "findOne").resolves(false); - TokenMock.create = sinon.stub(Token, "create").resolves(); - req.body = mocks.validUser; - await auth.register(req, res); + }); + it("register - should return the created user and the token if there is a user already created", async () => { + UserMock.count = sinon.stub(User, "count").resolves(1); + UserMock.create = sinon.stub(User, "create").resolves(mocks.validUser); + UserMock.findOne = sinon.stub(User, "findOne").resolves(false); + TokenMock.create = sinon.stub(Token, "create").resolves(); + req.body = mocks.validUser; + await auth.register(req, res); - expect(UserMock.findOne.called).to.be.true; - expect( - UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) - ).to.be.true; - expect(UserMock.count.called).to.be.true; - expect(TokenMock.create.called).to.be.true; - expect(commit.called).to.be.true; + expect(UserMock.findOne.called).to.be.true; + expect( + UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) + ).to.be.true; + expect(UserMock.count.called).to.be.true; + expect(TokenMock.create.called).to.be.true; + expect(commit.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(201); - const body = res.json.args[0][0]; - const { token, ...info } = body; - expect(info).to.be.deep.equal({ - user: { - email: "jane.doe@email.com", - id: 1, - name: "Jane", - role: "admin", - surname: "Doe", - }, - }); - expect(body).to.have.property("token"); + expect(res.status.args[0][0]).to.be.equal(201); + const body = res.json.args[0][0]; + const { token, ...info } = body; + expect(info).to.be.deep.equal({ + user: { + email: "jane.doe@email.com", + id: 1, + name: "Jane", + role: "admin", + surname: "Doe", + }, }); - it("register - should return status 400 if something goes wrong and a user is already created", async () => { - UserMock.count = sinon.stub(User, "count").resolves(1); - UserMock.create = sinon.stub(User, "create").rejects(); - UserMock.findOne = sinon.stub(User, "findOne").resolves(false); - TokenMock.create = sinon.stub(Token, "create").resolves(); - req.body = mocks.validUser; - await auth.register(req, res); + expect(body).to.have.property("token"); + }); + it("register - should return status 400 if something goes wrong and a user is already created", async () => { + UserMock.count = sinon.stub(User, "count").resolves(1); + UserMock.create = sinon.stub(User, "create").rejects(); + UserMock.findOne = sinon.stub(User, "findOne").resolves(false); + TokenMock.create = sinon.stub(Token, "create").resolves(); + req.body = mocks.validUser; + await auth.register(req, res); - expect(UserMock.findOne.called).to.be.true; - expect( - UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) - ).to.be.true; - expect(UserMock.count.called).to.be.true; - expect(TokenMock.create.called).to.be.false; - expect(commit.called).to.be.false; - expect(rollback.called).to.be.true; + expect(UserMock.findOne.called).to.be.true; + expect( + UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) + ).to.be.true; + expect(UserMock.count.called).to.be.true; + expect(TokenMock.create.called).to.be.false; + expect(commit.called).to.be.false; + expect(rollback.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Error registering user by invite", - }); - expect(body).not.to.have.property("token"); + expect(res.status.args[0][0]).to.be.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Error registering user by invite", }); - it("register - should return the created user and the token if there isn't any user created", async () => { - UserMock.count = sinon.stub(User, "count").resolves(0); - UserMock.create = sinon.stub(User, "create").resolves(mocks.validUser); - UserMock.findOne = sinon.stub(User, "findOne").resolves(false); - TokenMock.create = sinon.stub(Token, "create").resolves(); - req.body = mocks.validUser; - await auth.register(req, res); + expect(body).not.to.have.property("token"); + }); + it("register - should return the created user and the token if there isn't any user created", async () => { + UserMock.count = sinon.stub(User, "count").resolves(0); + UserMock.create = sinon.stub(User, "create").resolves(mocks.validUser); + UserMock.findOne = sinon.stub(User, "findOne").resolves(false); + TokenMock.create = sinon.stub(Token, "create").resolves(); + req.body = mocks.validUser; + await auth.register(req, res); - expect(UserMock.findOne.called).to.be.true; - expect( - UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) - ).to.be.true; - expect(UserMock.count.called).to.be.true; - expect(TokenMock.create.called).to.be.true; + expect(UserMock.findOne.called).to.be.true; + expect( + UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) + ).to.be.true; + expect(UserMock.count.called).to.be.true; + expect(TokenMock.create.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(201); - const body = res.json.args[0][0]; - const { token, ...info } = body; - expect(info).to.be.deep.equal({ - user: { - email: "jane.doe@email.com", - id: 1, - name: "Jane", - role: "admin", - surname: "Doe", - }, - }); - expect(body).to.have.property("token"); + expect(res.status.args[0][0]).to.be.equal(201); + const body = res.json.args[0][0]; + const { token, ...info } = body; + expect(info).to.be.deep.equal({ + user: { + email: "jane.doe@email.com", + id: 1, + name: "Jane", + role: "admin", + surname: "Doe", + }, }); - it("login - if the password doesn't match, should fail with status 401", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(mocks.validUser); - req.body = { ...mocks.validUser, password: "pass123" }; - await auth.login(req, res); - expect(res.status.args[0][0]).to.be.equal(401); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Invalid credentials", - }); - expect(body).not.to.have.property("token"); + expect(body).to.have.property("token"); + }); + it("login - if the password doesn't match, should fail with status 401", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(mocks.validUser); + req.body = { ...mocks.validUser, password: "pass123" }; + await auth.login(req, res); + expect(res.status.args[0][0]).to.be.equal(401); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Invalid credentials", }); - it("login - should return the user and a new Token", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves({ - ...mocks.validUser, - password: - "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", - }); - TokenMock.create = sinon.stub(Token, "create").resolves(); - TokenMock.destroy = sinon.stub(Token, "destroy").resolves(); - req.body = { ...mocks.validUser }; - await auth.login(req, res); + expect(body).not.to.have.property("token"); + }); + it("login - should return the user and a new Token", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves({ + ...mocks.validUser, + password: "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", + }); + TokenMock.create = sinon.stub(Token, "create").resolves(); + TokenMock.destroy = sinon.stub(Token, "destroy").resolves(); + req.body = { ...mocks.validUser }; + await auth.login(req, res); - expect(UserMock.findOne.called).to.be.true; - expect( - UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) - ).to.be.true; - expect(TokenMock.destroy.called).to.be.true; - expect(TokenMock.create.called).to.be.true; - expect(TokenMock.create.args[0][0]).to.have.property("userId", 1); - expect(TokenMock.create.args[0][0]).to.have.property("type", "auth"); + expect(UserMock.findOne.called).to.be.true; + expect( + UserMock.findOne.calledWith({ where: { email: mocks.validUser.email } }) + ).to.be.true; + expect(TokenMock.destroy.called).to.be.true; + expect(TokenMock.create.called).to.be.true; + expect(TokenMock.create.args[0][0]).to.have.property("userId", 1); + expect(TokenMock.create.args[0][0]).to.have.property("type", "auth"); - expect(res.status.args[0][0]).to.be.equal(200); - const body = res.json.args[0][0]; - const { token, ...info } = body; - expect(info).to.be.deep.equal({ - user: { - email: "jane.doe@email.com", - id: 1, - name: "Jane", - role: "admin", - surname: "Doe", - picture: "", - }, - }); - expect(body).to.have.property("token"); + expect(res.status.args[0][0]).to.be.equal(200); + const body = res.json.args[0][0]; + const { token, ...info } = body; + expect(info).to.be.deep.equal({ + user: { + email: "jane.doe@email.com", + id: 1, + name: "Jane", + role: "admin", + surname: "Doe", + picture: "", + }, }); - it("login - if something goes wrong, should return status 500", async () => { - UserMock.findOne = sinon.stub(User, "findOne").rejects(); - req.body = { ...mocks.validUser }; - await auth.login(req, res); + expect(body).to.have.property("token"); + }); + it("login - if something goes wrong, should return status 500", async () => { + UserMock.findOne = sinon.stub(User, "findOne").rejects(); + req.body = { ...mocks.validUser }; + await auth.login(req, res); - expect(res.status.args[0][0]).to.be.equal(500); - const body = res.json.args[0][0]; - const { token, ...info } = body; - expect(info).to.be.deep.equal({ - error: "Internal Server Error", - }); + expect(res.status.args[0][0]).to.be.equal(500); + const body = res.json.args[0][0]; + const { token, ...info } = body; + expect(info).to.be.deep.equal({ + error: "Internal Server Error", }); - it("logout - should fail with status 401 if token is wrong", async () => { - req.headers = { - authorization: "", - }; - await auth.logout(req, res); - expect(res.status.args[0][0]).to.be.equal(401); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Invalid token", - }); + }); + it("logout - should fail with status 401 if token is wrong", async () => { + req.headers = { + authorization: "", + }; + await auth.logout(req, res); + expect(res.status.args[0][0]).to.be.equal(401); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Invalid token", }); - it("logout - should fail with status 401 if token in DB is different or missing", async () => { - req.headers = { - authorization: `Bearer ${fakeToken}`, - }; - sinon.stub(jwt, "verify").returns({ id: 1 }); - TokenMock.findOne = sinon.stub(Token, "findOne").resolves(null); - await auth.logout(req, res); - expect(res.status.args[0][0]).to.be.equal(401); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Invalid token", - }); + }); + it("logout - should fail with status 401 if token in DB is different or missing", async () => { + req.headers = { + authorization: `Bearer ${fakeToken}`, + }; + sinon.stub(jwt, "verify").returns({ id: 1 }); + TokenMock.findOne = sinon.stub(Token, "findOne").resolves(null); + await auth.logout(req, res); + expect(res.status.args[0][0]).to.be.equal(401); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Invalid token", }); - it("logout - should delete the token and return status 200", async () => { - req.headers = { - authorization: `Bearer ${fakeToken}`, - }; - const fakeResponseToken = { - token: fakeToken, - userId: 1, - type: "auth", - destroy: sinon.stub(), - }; - TokenMock.findOne = sinon - .stub(Token, "findOne") - .resolves(fakeResponseToken); - sinon.stub(jwt, "verify").returns({ id: 1 }); - await auth.logout(req, res); + }); + it("logout - should delete the token and return status 200", async () => { + req.headers = { + authorization: `Bearer ${fakeToken}`, + }; + const fakeResponseToken = { + token: fakeToken, + userId: 1, + type: "auth", + destroy: sinon.stub(), + }; + TokenMock.findOne = sinon + .stub(Token, "findOne") + .resolves(fakeResponseToken); + sinon.stub(jwt, "verify").returns({ id: 1 }); + await auth.logout(req, res); - expect(TokenMock.findOne.called).to.be.true; + expect(TokenMock.findOne.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - message: "Successfully logged out", - }); - expect(body).not.to.have.property("token"); + expect(res.status.args[0][0]).to.be.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + message: "Successfully logged out", }); - it("logout - if something goes wrong, should return status 500", async () => { - req.headers = { - authorization: `Bearer ${fakeToken}`, - }; - TokenMock.findOne = sinon.stub(Token, "findOne").rejects(); - sinon.stub(jwt, "verify").returns({ id: 1 }); - await auth.logout(req, res); + expect(body).not.to.have.property("token"); + }); + it("logout - if something goes wrong, should return status 500", async () => { + req.headers = { + authorization: `Bearer ${fakeToken}`, + }; + TokenMock.findOne = sinon.stub(Token, "findOne").rejects(); + sinon.stub(jwt, "verify").returns({ id: 1 }); + await auth.logout(req, res); - expect(res.status.args[0][0]).to.be.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - }); + expect(res.status.args[0][0]).to.be.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", }); - it("forgetPassword - should fail with status 400 iif email doesn't match", async () => { - req.body = { - email: "email@email.com", - }; - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - await auth.forgetPassword(req, res); + }); + it("forgetPassword - should fail with status 400 iif email doesn't match", async () => { + req.body = { + email: "email@email.com", + }; + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + await auth.forgetPassword(req, res); - expect(UserMock.findOne.called).to.be.true; + expect(UserMock.findOne.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "User not found", - }); + expect(res.status.args[0][0]).to.be.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "User not found", + }); + }); + it("forgetPassword - should create a temporary token, send an email and return status 200", async () => { + req.body = { + email: mocks.validUser.email, + }; + UserMock.findOne = sinon.stub(User, "findOne").resolves({ + ...mocks.validUser, + password: "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", }); - it("forgetPassword - should create a temporary token, send an email and return status 200", async () => { - req.body = { - email: mocks.validUser.email, - }; - UserMock.findOne = sinon.stub(User, "findOne").resolves({ - ...mocks.validUser, - password: - "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", - }); - TokenMock.create = sinon.stub(Token, "create").resolves(); - sinon.spy(emailService, "sendPasswordResetEmail"); - await auth.forgetPassword(req, res); + TokenMock.create = sinon.stub(Token, "create").resolves(); + sinon.spy(emailService, "sendPasswordResetEmail"); + await auth.forgetPassword(req, res); - expect(UserMock.findOne.called).to.be.true; - expect(Token.create.called).to.be.true; + expect(UserMock.findOne.called).to.be.true; + expect(Token.create.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.have.property("message", "Password reset token sent"); - }); - it("forgetPassword - if something goes wrong, should return status 500", async () => { - req.body = { - email: mocks.validUser.email, - }; - UserMock.findOne = sinon.stub(User, "findOne").rejects(); - await auth.forgetPassword(req, res); + expect(res.status.args[0][0]).to.be.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.have.property("message", "Password reset token sent"); + }); + it("forgetPassword - if something goes wrong, should return status 500", async () => { + req.body = { + email: mocks.validUser.email, + }; + UserMock.findOne = sinon.stub(User, "findOne").rejects(); + await auth.forgetPassword(req, res); - expect(res.status.args[0][0]).to.be.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - }); + expect(res.status.args[0][0]).to.be.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", }); - it("resetPassword - should fail with status 400 if there is no token", async () => { - req.body = { - token: "Bearer", - }; - TokenMock.findOne = sinon.stub(Token, "findOne").resolves({ - token: - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNzMzMTkzMzkyfQ.XVYpcKA-qHrZGoDs9LJv042w0oqcBnzZPZTsXPgB0g4", - userId: 1, - type: "reset", - expiresAt: "2144-11-18", - }); - await auth.resetPassword(req, res); - expect(res.status.args[0][0]).to.be.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Invalid or expired token", - }); + }); + it("resetPassword - should fail with status 400 if there is no token", async () => { + req.body = { + token: "Bearer", + }; + TokenMock.findOne = sinon.stub(Token, "findOne").resolves({ + token: + "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwiaWF0IjoxNzMzMTkzMzkyfQ.XVYpcKA-qHrZGoDs9LJv042w0oqcBnzZPZTsXPgB0g4", + userId: 1, + type: "reset", + expiresAt: "2144-11-18", + }); + await auth.resetPassword(req, res); + expect(res.status.args[0][0]).to.be.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Invalid or expired token", }); - it("resetPassword - should fail with status 400 if the token is wrong", async () => { - req.body = { - token: `Bearer ${fakeToken}`, - }; - TokenMock.findOne = sinon.stub(Token, "findOne").resolves(null); - sinon.stub(bcrypt, "compare"); - await auth.resetPassword(req, res); + }); + it("resetPassword - should fail with status 400 if the token is wrong", async () => { + req.body = { + token: `Bearer ${fakeToken}`, + }; + TokenMock.findOne = sinon.stub(Token, "findOne").resolves(null); + sinon.stub(bcrypt, "compare"); + await auth.resetPassword(req, res); - expect(TokenMock.findOne.called).to.be.true; + expect(TokenMock.findOne.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Invalid or expired token", - }); - expect(body).not.to.have.property("token"); + expect(res.status.args[0][0]).to.be.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Invalid or expired token", }); - it("resetPassword - should return status 200 and the correct message", async () => { - req.body = { - token: fakeToken, - newPassword: "n3wP@ssword", - }; - const fakeResponseToken = { - token: fakeToken, - userId: 1, - type: "reset", - destroy: sinon.stub(), - expiresAt: "2144-11-18", - }; - TokenMock.findOne = sinon - .stub(Token, "findOne") - .resolves(fakeResponseToken); - sinon.stub(bcrypt, "compare").returns(true); - UserMock.findOne = sinon.stub(User, "findOne").resolves({ - ...mocks.validUser, - password: - "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", - save: sinon.stub(), - }); - await auth.resetPassword(req, res); + expect(body).not.to.have.property("token"); + }); + it("resetPassword - should return status 200 and the correct message", async () => { + req.body = { + token: fakeToken, + newPassword: "n3wP@ssword", + }; + const fakeResponseToken = { + token: fakeToken, + userId: 1, + type: "reset", + destroy: sinon.stub(), + expiresAt: "2144-11-18", + }; + TokenMock.findOne = sinon + .stub(Token, "findOne") + .resolves(fakeResponseToken); + sinon.stub(bcrypt, "compare").returns(true); + UserMock.findOne = sinon.stub(User, "findOne").resolves({ + ...mocks.validUser, + password: "$2a$10$GaKE6gfYM/Br697DBHOV9.jZzK7isVa9W7tKID8bp6fqbt0jd3yMS", + save: sinon.stub(), + }); + await auth.resetPassword(req, res); - expect(TokenMock.findOne.called).to.be.true; + expect(TokenMock.findOne.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - message: "Password reset successful", - }); - expect(body).not.to.have.property("token"); + expect(res.status.args[0][0]).to.be.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + message: "Password reset successful", }); - it("resetPassword - if something goes wrong, should return status 500", async () => { - req.body = { - token: fakeToken, - newPassword: "n3wP@ssword", - }; - TokenMock.findOne = sinon.stub(Token, "findOne").rejects(); - await auth.resetPassword(req, res); + expect(body).not.to.have.property("token"); + }); + it("resetPassword - if something goes wrong, should return status 500", async () => { + req.body = { + token: fakeToken, + newPassword: "n3wP@ssword", + }; + TokenMock.findOne = sinon.stub(Token, "findOne").rejects(); + await auth.resetPassword(req, res); - expect(res.status.args[0][0]).to.be.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - }); - expect(body).not.to.have.property("token"); + expect(res.status.args[0][0]).to.be.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", }); + expect(body).not.to.have.property("token"); }); -})(); +}); diff --git a/backend/src/test/unit/controllers/banner.test.js b/backend/src/test/unit/controllers/banner.test.js index 1e2c0f09..112ae581 100644 --- a/backend/src/test/unit/controllers/banner.test.js +++ b/backend/src/test/unit/controllers/banner.test.js @@ -1,412 +1,402 @@ -(async () => { - const { describe, it, afterEach } = await import("mocha"); - const { expect } = await import("chai"); - const sinon = await import("sinon"); - const service = require("../../../service/banner.service"); - const { BannerBuilder, validList } = require("../../mocks/banner.mock.js"); - const controller = require("../../../controllers/banner.controller.js"); +const { describe, it, afterEach } = require("mocha"); +const { expect } = require("chai"); +const sinon = require("sinon"); +const service = require("../../../service/banner.service"); +const { BannerBuilder, validList } = require("../../mocks/banner.mock.js"); +const controller = require("../../../controllers/banner.controller.js"); - const banner = BannerBuilder.banner; +const banner = BannerBuilder.banner; - describe("Test Banner controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - describe("addBanner", () => { - req.user = { id: 1 }; - it("should return status 400 if the position is missing", async () => { - req.body = banner().missingPosition().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "position and closeButtonAction are required", - }, - ], - }); - }); - it("should return status 400 if the closeButtonAction is missing", async () => { - req.body = banner().missingCloseButtonAction().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "position and closeButtonAction are required", - }, - ], - }); - }); - it("should return status 400 if the position is invalid", async () => { - req.body = banner().invalidPosition().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value entered", - }, - ], - }); - }); - it("should return status 400 if the closeButtonAction is invalid", async () => { - req.body = banner().invalidCloseButtonAction().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value entered", - }, - ], - }); - }); - it("should return status 400 if backgroundColor is invalid", async () => { - req.body = banner().invalidBackgroundColor().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "backgroundColor must be a valid hex color code", - }, - ], - }); - }); - it("should return status 400 if fontColor is invalid", async () => { - req.body = banner().invalidFontColor().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "fontColor must be a valid hex color code", - }, - ], - }); +describe("Test Banner controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + describe("addBanner", () => { + req.user = { id: 1 }; + it("should return status 400 if the position is missing", async () => { + req.body = banner().missingPosition().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "position and closeButtonAction are required", + }, + ], }); - it("should return status 201 and the new banner if everything goes right", async () => { - req.user = { id: 1 }; - req.body = banner().build(); - serviceMock.createBanner = sinon - .stub(service, "createBanner") - .returns(banner().build()); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(201); - expect(body).to.be.deep.equal(banner().build()); + }); + it("should return status 400 if the closeButtonAction is missing", async () => { + req.body = banner().missingCloseButtonAction().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "position and closeButtonAction are required", + }, + ], }); - it("should return status 500 if something goes wrong", async () => { - req.user = { id: 1 }; - serviceMock.createBanner = sinon - .stub(service, "createBanner") - .rejects(); - req.body = banner().build(); - await controller.addBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_BANNER_ERROR", - message: "Error", - }); + }); + it("should return status 400 if the position is invalid", async () => { + req.body = banner().invalidPosition().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value entered", + }, + ], }); }); - describe("deleteBanner", () => { - it("should return status 400 if the id is missing or is invalid", async () => { - req.params = { id: "one" }; - await controller.deleteBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); + it("should return status 400 if the closeButtonAction is invalid", async () => { + req.body = banner().invalidCloseButtonAction().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value entered", + }, + ], }); - it("should return status 400 if the id is invalid", async () => { - req.params = { id: " " }; - await controller.deleteBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); + }); + it("should return status 400 if backgroundColor is invalid", async () => { + req.body = banner().invalidBackgroundColor().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "backgroundColor must be a valid hex color code", + }, + ], }); - it("should return status 400 if the service returns false", async () => { - req.params = { id: "1" }; - serviceMock.deleteBanner = sinon - .stub(service, "deleteBanner") - .resolves(false); - await controller.deleteBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Banner with the specified id does not exist" }], - }); + }); + it("should return status 400 if fontColor is invalid", async () => { + req.body = banner().invalidFontColor().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "fontColor must be a valid hex color code", + }, + ], }); - it("should return status 200 if banner is deleted", async () => { - req.params = { id: "1" }; - serviceMock.deleteBanner = sinon - .stub(service, "deleteBanner") - .resolves(true); - await controller.deleteBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal({ - message: "Banner with ID 1 deleted successfully", - }); + }); + it("should return status 201 and the new banner if everything goes right", async () => { + req.user = { id: 1 }; + req.body = banner().build(); + serviceMock.createBanner = sinon + .stub(service, "createBanner") + .returns(banner().build()); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(201); + expect(body).to.be.deep.equal(banner().build()); + }); + it("should return status 500 if something goes wrong", async () => { + req.user = { id: 1 }; + serviceMock.createBanner = sinon.stub(service, "createBanner").rejects(); + req.body = banner().build(); + await controller.addBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_BANNER_ERROR", + message: "Error", }); - it("should return status 500 if something goes wrong", async () => { - req.params = { id: "1" }; - serviceMock.deleteBanner = sinon - .stub(service, "deleteBanner") - .rejects(); - await controller.deleteBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_BANNER_ERROR", - message: "Error", - }); + }); + }); + describe("deleteBanner", () => { + it("should return status 400 if the id is missing or is invalid", async () => { + req.params = { id: "one" }; + await controller.deleteBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); + }); + it("should return status 400 if the id is invalid", async () => { + req.params = { id: " " }; + await controller.deleteBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); + }); + it("should return status 400 if the service returns false", async () => { + req.params = { id: "1" }; + serviceMock.deleteBanner = sinon + .stub(service, "deleteBanner") + .resolves(false); + await controller.deleteBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Banner with the specified id does not exist" }], }); }); - describe("editBanner", () => { - it("should return status 400 if the position is missing", async () => { - req.body = banner().missingPosition().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "position and closeButtonAction are required", - }, - ], - }); + it("should return status 200 if banner is deleted", async () => { + req.params = { id: "1" }; + serviceMock.deleteBanner = sinon + .stub(service, "deleteBanner") + .resolves(true); + await controller.deleteBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal({ + message: "Banner with ID 1 deleted successfully", }); - it("should return status 400 if the closeButtonAction is missing", async () => { - req.body = banner().missingCloseButtonAction().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "position and closeButtonAction are required", - }, - ], - }); + }); + it("should return status 500 if something goes wrong", async () => { + req.params = { id: "1" }; + serviceMock.deleteBanner = sinon.stub(service, "deleteBanner").rejects(); + await controller.deleteBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_BANNER_ERROR", + message: "Error", }); - it("should return status 400 if the position is invalid", async () => { - req.body = banner().invalidPosition().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value for position", - }, - ], - }); + }); + }); + describe("editBanner", () => { + it("should return status 400 if the position is missing", async () => { + req.body = banner().missingPosition().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "position and closeButtonAction are required", + }, + ], }); - it("should return status 400 if the closeButtonAction is invalid", async () => { - req.body = banner().invalidCloseButtonAction().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value for closeButtonAction", - }, - ], - }); + }); + it("should return status 400 if the closeButtonAction is missing", async () => { + req.body = banner().missingCloseButtonAction().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "position and closeButtonAction are required", + }, + ], }); - it("should return status 400 if fontColor is invalid", async () => { - req.body = banner().invalidFontColor().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "fontColor must be a valid hex color code", - }, - ], - }); + }); + it("should return status 400 if the position is invalid", async () => { + req.body = banner().invalidPosition().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value for position", + }, + ], }); - it("should return status 400 if backgroundColor is invalid", async () => { - req.body = banner().invalidBackgroundColor().build(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "backgroundColor must be a valid hex color code", - }, - ], - }); + }); + it("should return status 400 if the closeButtonAction is invalid", async () => { + req.body = banner().invalidCloseButtonAction().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value for closeButtonAction", + }, + ], }); - it("should return status 200 and the updated banner if everything goes right", async () => { - req.body = banner().build(); - serviceMock.updateBanner = sinon - .stub(service, "updateBanner") - .returns(banner().build()); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(banner().build()); + }); + it("should return status 400 if fontColor is invalid", async () => { + req.body = banner().invalidFontColor().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "fontColor must be a valid hex color code", + }, + ], }); - it("should return status 500 if something goes wrong", async () => { - req.body = banner().build(); - serviceMock.updateBanner = sinon - .stub(service, "updateBanner") - .rejects(); - await controller.editBanner(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "EDIT_BANNER_ERROR", - message: "Error", - }); + }); + it("should return status 400 if backgroundColor is invalid", async () => { + req.body = banner().invalidBackgroundColor().build(); + await controller.editBanner(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "backgroundColor must be a valid hex color code", + }, + ], }); }); - it("getAllBanners - should return status 200 and all the banners if everything goes right", async () => { - serviceMock.getAllBanners = sinon - .stub(service, "getAllBanners") - .returns(validList); - await controller.getAllBanners(req, res); + it("should return status 200 and the updated banner if everything goes right", async () => { + req.body = banner().build(); + serviceMock.updateBanner = sinon + .stub(service, "updateBanner") + .returns(banner().build()); + await controller.editBanner(req, res); const status = res.status.args[0][0]; const body = res.json.args[0][0]; expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(validList); + expect(body).to.be.deep.equal(banner().build()); }); - it("getAllBanners - should return status 500 if something goes wrong", async () => { - serviceMock.getAllBanners = sinon - .stub(service, "getAllBanners") - .rejects(); - await controller.getAllBanners(req, res); + it("should return status 500 if something goes wrong", async () => { + req.body = banner().build(); + serviceMock.updateBanner = sinon.stub(service, "updateBanner").rejects(); + await controller.editBanner(req, res); const status = res.status.args[0][0]; const body = res.json.args[0][0]; expect(status).to.be.equal(500); expect(body).to.be.deep.equal({ error: "Internal Server Error", - errorCode: "GET_ALL_BANNERS_ERROR", + errorCode: "EDIT_BANNER_ERROR", message: "Error", }); }); - it("getBanners - should return status 200 and all the banners created by the user if everything goes right", async () => { - req.user = { id: 1 }; - serviceMock.getBanners = sinon - .stub(service, "getBanners") - .returns(validList); - await controller.getBanners(req, res); + }); + it("getAllBanners - should return status 200 and all the banners if everything goes right", async () => { + serviceMock.getAllBanners = sinon + .stub(service, "getAllBanners") + .returns(validList); + await controller.getAllBanners(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(validList); + }); + it("getAllBanners - should return status 500 if something goes wrong", async () => { + serviceMock.getAllBanners = sinon.stub(service, "getAllBanners").rejects(); + await controller.getAllBanners(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_ALL_BANNERS_ERROR", + message: "Error", + }); + }); + it("getBanners - should return status 200 and all the banners created by the user if everything goes right", async () => { + req.user = { id: 1 }; + serviceMock.getBanners = sinon + .stub(service, "getBanners") + .returns(validList); + await controller.getBanners(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(validList); + }); + it("getBanners - should return status 500 if something goes wrong", async () => { + req.user = { id: 1 }; + serviceMock.getBanners = sinon.stub(service, "getBanners").rejects(); + await controller.getBanners(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_BANNERS_ERROR", + message: "Error", + }); + }); + describe("getBannerById", () => { + it("should return status 400 if the id is invalid", async () => { + req.params = { id: "one" }; + await controller.getBannerById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); + }); + it("should return status 400 if the id is missing", async () => { + req.params = { id: "" }; + await controller.getBannerById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); + }); + it("should return status 404 if the service returns null", async () => { + req.params = { id: "1" }; + serviceMock.getBannerById = sinon + .stub(service, "getBannerById") + .resolves(null); + await controller.getBannerById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Banner not found" }], + }); + }); + it("should return status 200 and the banner if everything goes right", async () => { + req.params = { id: "1" }; + serviceMock.getBannerById = sinon + .stub(service, "getBannerById") + .returns(banner().build()); + await controller.getBannerById(req, res); const status = res.status.args[0][0]; const body = res.json.args[0][0]; expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(validList); + expect(body).to.be.deep.equal(banner().build()); }); - it("getBanners - should return status 500 if something goes wrong", async () => { - req.user = { id: 1 }; - serviceMock.getBanners = sinon.stub(service, "getBanners").rejects(); - await controller.getBanners(req, res); + it("should return status 500 if something goes wrong", async () => { + req.params = { id: "1" }; + serviceMock.getBannerById = sinon + .stub(service, "getBannerById") + .rejects(); + await controller.getBannerById(req, res); const status = res.status.args[0][0]; const body = res.json.args[0][0]; expect(status).to.be.equal(500); expect(body).to.be.deep.equal({ error: "Internal Server Error", - errorCode: "GET_BANNERS_ERROR", + errorCode: "GET_BANNER_BY_ID_ERROR", message: "Error", }); }); - describe("getBannerById", () => { - it("should return status 400 if the id is invalid", async () => { - req.params = { id: "one" }; - await controller.getBannerById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); - }); - it("should return status 400 if the id is missing", async () => { - req.params = { id: "" }; - await controller.getBannerById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ errors: [{ msg: "Invalid id" }] }); - }); - it("should return status 404 if the service returns null", async () => { - req.params = { id: "1" }; - serviceMock.getBannerById = sinon - .stub(service, "getBannerById") - .resolves(null); - await controller.getBannerById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Banner not found" }], - }); - }); - it("should return status 200 and the banner if everything goes right", async () => { - req.params = { id: "1" }; - serviceMock.getBannerById = sinon - .stub(service, "getBannerById") - .returns(banner().build()); - await controller.getBannerById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(banner().build()); - }); - it("should return status 500 if something goes wrong", async () => { - req.params = { id: "1" }; - serviceMock.getBannerById = sinon - .stub(service, "getBannerById") - .rejects(); - await controller.getBannerById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_BANNER_BY_ID_ERROR", - message: "Error", - }); - }); - }); }); -})(); +}); diff --git a/backend/src/test/unit/controllers/helperLink.test.js b/backend/src/test/unit/controllers/helperLink.test.js index 91e8e2df..4ac55065 100644 --- a/backend/src/test/unit/controllers/helperLink.test.js +++ b/backend/src/test/unit/controllers/helperLink.test.js @@ -1,697 +1,689 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const mocks = require("../../mocks/helperLink.mock.js"); - const helperLinks = require("../../../controllers/helperLink.controller.js"); - const service = require("../../../service/helperLink.service.js"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const mocks = require("../../mocks/helperLink.mock.js"); +const helperLinks = require("../../../controllers/helperLink.controller.js"); +const service = require("../../../service/helperLink.service.js"); - const controller = helperLinks.controller; +const controller = helperLinks.controller; - describe("Test helper link controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - describe("addHelper", () => { - it("should return 400 if title is missing", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink().missingTitle().build(); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "header is required" }], - }); - }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidHeaderBackgroundColor() - .build(); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "headerBackgroundColor must be a valid hex color code", - }, - ], - }); - }); - it("should return 400 if linkFontColor is invalid", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidLinkFontColor() - .build(); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "linkFontColor must be a valid hex color code", - }, - ], - }); - }); - it("should return 400 if iconColor is invalid", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidIconColor() - .build(); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "iconColor must be a valid hex color code", - }, - ], - }); - }); - it("should skip colors validation if colors are not provided", async () => { - const validateColors = sinon.spy(helperLinks, "validateColors"); - req.user = { - id: 1, - }; - serviceMock.createHelper = sinon - .stub(service, "createHelper") - .resolves({}); - const { iconColor, headerBackgroundColor, linkFontColor, ...helper } = - mocks.HelperLinkBuilder.helperLink().build(); - req.body = helper; - await controller.addHelper(req, res); - expect(res.status.called).to.be.true; - expect(res.json.called).to.be.true; - expect(validateColors.called).to.be.false; - }); - it("should skip links validation if links are not provided", async () => { - const validateLinks = sinon.spy(helperLinks, "validateLinks"); - req.params = { - id: "1", - }; - serviceMock.createHelper = sinon - .stub(service, "createHelper") - .resolves({}); - const { links, ...helper } = - mocks.HelperLinkBuilder.helperLink().build(); - req.body = helper; - await controller.addHelper(req, res); - expect(res.status.called).to.be.true; - expect(res.json.called).to.be.true; - expect(validateLinks.called).to.be.false; - }); - it("should return 400 if link is missing title", async () => { - req.user = { - id: 1, - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().missingTitle().build()], - }; - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); - }); - it("should return 400 if link is missing url", async () => { - req.user = { - id: 1, - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().missingUrl().build()], - }; - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); - }); - it("should return 400 if link has invalid url", async () => { - req.user = { - id: 1, - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidUrl().build()], - }; - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for url" }], - }); - }); - it("should return 400 if link has invalid order value", async () => { - req.user = { - id: 1, - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidOrderValue().build()], - }; - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); - }); - it("should return 400 if link has invalid order type", async () => { - req.user = { - id: 1, - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidOrderType().build()], - }; - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); - }); - it("should return 500 if service throws error", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink().build(); - serviceMock.addHelper = sinon - .stub(service, "createHelper") - .rejects(new Error("Error creating helper")); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_HELPER_ERROR", - message: "Error creating helper", - }); - }); - it("should return 201 if all data is valid", async () => { - req.user = { - id: 1, - }; - req.body = mocks.HelperLinkBuilder.helperLink().build(); - serviceMock.createHelper = sinon - .stub(service, "createHelper") - .resolves(req.body); - await controller.addHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(201); - expect(body).to.be.deep.equal(req.body); - }); - }); - describe("deleteHelper", () => { - it("should return 400 if id is missing", async () => { - req.params = {}; - await controller.deleteHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 400 if id is invalid", async () => { - req.params = { - id: "id", - }; - await controller.deleteHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 500 if service throws error", async () => { - req.params = { - id: "1", - }; - serviceMock.deleteHelper = sinon - .stub(service, "deleteHelper") - .rejects(); - await controller.deleteHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_HELPER_ERROR", - message: "Error", - }); - }); - it("should return 404 if helper does not exist", async () => { - req.params = { - id: "1", - }; - serviceMock.deleteHelper = sinon - .stub(service, "deleteHelper") - .resolves(false); - await controller.deleteHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Helper with the specified id does not exist" }], - }); - }); - it("should return 200 if helper is deleted", async () => { - req.params = { - id: "1", - }; - serviceMock.deleteHelper = sinon - .stub(service, "deleteHelper") - .resolves(true); - await controller.deleteHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal({ - message: "Helper with ID 1 deleted successfully", - }); - }); - }); - describe("editHelper", () => { - it("should return 400 if id is missing", async () => { - req.params = {}; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 400 if id is invalid", async () => { - req.params = { - id: "id", - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 400 if title is missing", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink().missingTitle().build(); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "header is required" }], - }); - }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidHeaderBackgroundColor() - .build(); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "headerBackgroundColor must be a valid hex color code", - }, - ], - }); - }); - it("should return 400 if linkFontColor is invalid", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidLinkFontColor() - .build(); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "linkFontColor must be a valid hex color code", - }, - ], - }); - }); - it("should return 400 if iconColor is invalid", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink() - .invalidIconColor() - .build(); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "iconColor must be a valid hex color code", - }, - ], - }); - }); - it("should skip colors validation if colors are not provided", async () => { - const validateColors = sinon.spy(helperLinks, "validateColors"); - req.user = { - id: 1, - }; - serviceMock.updateHelper = sinon - .stub(service, "updateHelper") - .resolves({}); - const { iconColor, headerBackgroundColor, linkFontColor, ...helper } = - mocks.HelperLinkBuilder.helperLink().build(); - req.body = helper; - await controller.editHelper(req, res); - expect(res.status.called).to.be.true; - expect(res.json.called).to.be.true; - expect(validateColors.called).to.be.false; - }); - it("should skip links validation if links are not provided", async () => { - const validateLinks = sinon.spy(helperLinks, "validateLinks"); - req.params = { - id: "1", - }; - serviceMock.editHelper = sinon - .stub(service, "updateHelper") - .resolves({}); - const { links, ...helper } = - mocks.HelperLinkBuilder.helperLink().build(); - req.body = helper; - await controller.editHelper(req, res); - expect(res.status.called).to.be.true; - expect(res.json.called).to.be.true; - expect(validateLinks.called).to.be.false; - }); - it("should return 400 if link is missing title", async () => { - req.params = { - id: "1", - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().missingTitle().build()], - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); - }); - it("should return 400 if link is missing url", async () => { - req.params = { - id: "1", - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().missingUrl().build()], - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); - }); - it("should return 400 if link has invalid url", async () => { - req.params = { - id: "1", - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidUrl().build()], - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for url" }], - }); - }); - it("should return 400 if link has invalid order value", async () => { - req.params = { - id: "1", - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidOrderValue().build()], - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); - }); - it("should return 400 if link has invalid order type", async () => { - req.params = { - id: "1", - }; - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.body = { - ...helper, - links: [mocks.LinkBuilder.link().invalidOrderType().build()], - }; - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); - }); - it("should return 500 if service throws error", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink().build(); - serviceMock.editHelper = sinon - .stub(service, "updateHelper") - .rejects(new Error("Error updating helper")); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "EDIT_HELPER_ERROR", - message: "Error updating helper", - }); - }); - it("should return 404 if helper does not exist", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink().build(); - serviceMock.editHelper = sinon - .stub(service, "updateHelper") - .resolves(null); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Helper with the specified id does not exist" }], - }); - }); - it("should return 200 if helper is updated", async () => { - req.params = { - id: "1", - }; - req.body = mocks.HelperLinkBuilder.helperLink().build(); - serviceMock.editHelper = sinon - .stub(service, "updateHelper") - .resolves(req.body); - await controller.editHelper(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(req.body); - }); - }); - describe("getAllHelpers", () => { - it("should return 500 if service throws error", async () => { - serviceMock.getAllHelpers = sinon - .stub(service, "getAllHelpers") - .rejects(); - await controller.getAllHelpers(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_ALL_HELPERS_ERROR", - message: "Error", - }); - }); - it("should return 200 if helpers are found", async () => { - const helpers = mocks.HelperLinkList; - serviceMock.getAllHelpers = sinon - .stub(service, "getAllHelpers") - .resolves(helpers); - await controller.getAllHelpers(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(helpers); - }); - }); - describe("getHelpersByUserId", () => { - req.user = { id: 1 }; - it("should return 500 if service throws error", async () => { - serviceMock.getHelpersByUserId = sinon - .stub(service, "getHelpersByUserId") - .rejects(new Error("Error retrieving helper by ID")); - await controller.getHelpersByUserId(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_HELPERS_ERROR", - message: "Error retrieving helper by ID", - }); - }); - it("should return 200 if helpers are found", async () => { - const helpers = mocks.HelperLinkList.filter((h) => h.createdBy === 1); - serviceMock.getHelpersByUserId = sinon - .stub(service, "getHelpersByUserId") - .resolves(helpers); - await controller.getHelpersByUserId(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(helpers); - }); - }); - describe("getHelperById", () => { - it("should return 400 if id is invalid", async () => { - req.params = { - id: "id", - }; - await controller.getHelperById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid helper ID" }], - }); - }); - it("should return 400 if id is missing", async () => { - req.params = {}; - await controller.getHelperById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid helper ID" }], - }); - }); - it("should return 404 if helper does not exist", async () => { - req.params = { - id: "1", - }; - serviceMock.getHelperById = sinon - .stub(service, "getHelperById") - .resolves(null); - await controller.getHelperById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Helper not found" }], - }); - }); - it("should return 500 if service throws error", async () => { - req.params = { - id: "1", - }; - serviceMock.getHelperById = sinon - .stub(service, "getHelperById") - .rejects(new Error("Error retrieving helper by ID")); - await controller.getHelperById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_HELPER_BY_ID_ERROR", - message: "Error retrieving helper by ID", - }); - }); - it("should return 200 if helper is found", async () => { - const helper = mocks.HelperLinkBuilder.helperLink().build(); - req.params = { - id: "1", - }; - serviceMock.getHelperById = sinon - .stub(service, "getHelperById") - .resolves(helper); - await controller.getHelperById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(helper); +describe("Test helper link controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + describe("addHelper", () => { + it("should return 400 if title is missing", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink().missingTitle().build(); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "header is required" }], + }); + }); + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidHeaderBackgroundColor() + .build(); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "headerBackgroundColor must be a valid hex color code", + }, + ], + }); + }); + it("should return 400 if linkFontColor is invalid", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidLinkFontColor() + .build(); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "linkFontColor must be a valid hex color code", + }, + ], + }); + }); + it("should return 400 if iconColor is invalid", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidIconColor() + .build(); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "iconColor must be a valid hex color code", + }, + ], + }); + }); + it("should skip colors validation if colors are not provided", async () => { + const validateColors = sinon.spy(helperLinks, "validateColors"); + req.user = { + id: 1, + }; + serviceMock.createHelper = sinon + .stub(service, "createHelper") + .resolves({}); + const { iconColor, headerBackgroundColor, linkFontColor, ...helper } = + mocks.HelperLinkBuilder.helperLink().build(); + req.body = helper; + await controller.addHelper(req, res); + expect(res.status.called).to.be.true; + expect(res.json.called).to.be.true; + expect(validateColors.called).to.be.false; + }); + it("should skip links validation if links are not provided", async () => { + const validateLinks = sinon.spy(helperLinks, "validateLinks"); + req.params = { + id: "1", + }; + serviceMock.createHelper = sinon + .stub(service, "createHelper") + .resolves({}); + const { links, ...helper } = mocks.HelperLinkBuilder.helperLink().build(); + req.body = helper; + await controller.addHelper(req, res); + expect(res.status.called).to.be.true; + expect(res.json.called).to.be.true; + expect(validateLinks.called).to.be.false; + }); + it("should return 400 if link is missing title", async () => { + req.user = { + id: 1, + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().missingTitle().build()], + }; + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); + }); + it("should return 400 if link is missing url", async () => { + req.user = { + id: 1, + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().missingUrl().build()], + }; + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); + }); + it("should return 400 if link has invalid url", async () => { + req.user = { + id: 1, + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidUrl().build()], + }; + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for url" }], + }); + }); + it("should return 400 if link has invalid order value", async () => { + req.user = { + id: 1, + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidOrderValue().build()], + }; + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); + }); + it("should return 400 if link has invalid order type", async () => { + req.user = { + id: 1, + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidOrderType().build()], + }; + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); + }); + it("should return 500 if service throws error", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink().build(); + serviceMock.addHelper = sinon + .stub(service, "createHelper") + .rejects(new Error("Error creating helper")); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_HELPER_ERROR", + message: "Error creating helper", }); }); + it("should return 201 if all data is valid", async () => { + req.user = { + id: 1, + }; + req.body = mocks.HelperLinkBuilder.helperLink().build(); + serviceMock.createHelper = sinon + .stub(service, "createHelper") + .resolves(req.body); + await controller.addHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(201); + expect(body).to.be.deep.equal(req.body); + }); + }); + describe("deleteHelper", () => { + it("should return 400 if id is missing", async () => { + req.params = {}; + await controller.deleteHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 400 if id is invalid", async () => { + req.params = { + id: "id", + }; + await controller.deleteHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 500 if service throws error", async () => { + req.params = { + id: "1", + }; + serviceMock.deleteHelper = sinon.stub(service, "deleteHelper").rejects(); + await controller.deleteHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_HELPER_ERROR", + message: "Error", + }); + }); + it("should return 404 if helper does not exist", async () => { + req.params = { + id: "1", + }; + serviceMock.deleteHelper = sinon + .stub(service, "deleteHelper") + .resolves(false); + await controller.deleteHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Helper with the specified id does not exist" }], + }); + }); + it("should return 200 if helper is deleted", async () => { + req.params = { + id: "1", + }; + serviceMock.deleteHelper = sinon + .stub(service, "deleteHelper") + .resolves(true); + await controller.deleteHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal({ + message: "Helper with ID 1 deleted successfully", + }); + }); + }); + describe("editHelper", () => { + it("should return 400 if id is missing", async () => { + req.params = {}; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 400 if id is invalid", async () => { + req.params = { + id: "id", + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 400 if title is missing", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink().missingTitle().build(); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "header is required" }], + }); + }); + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidHeaderBackgroundColor() + .build(); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "headerBackgroundColor must be a valid hex color code", + }, + ], + }); + }); + it("should return 400 if linkFontColor is invalid", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidLinkFontColor() + .build(); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "linkFontColor must be a valid hex color code", + }, + ], + }); + }); + it("should return 400 if iconColor is invalid", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink() + .invalidIconColor() + .build(); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "iconColor must be a valid hex color code", + }, + ], + }); + }); + it("should skip colors validation if colors are not provided", async () => { + const validateColors = sinon.spy(helperLinks, "validateColors"); + req.user = { + id: 1, + }; + serviceMock.updateHelper = sinon + .stub(service, "updateHelper") + .resolves({}); + const { iconColor, headerBackgroundColor, linkFontColor, ...helper } = + mocks.HelperLinkBuilder.helperLink().build(); + req.body = helper; + await controller.editHelper(req, res); + expect(res.status.called).to.be.true; + expect(res.json.called).to.be.true; + expect(validateColors.called).to.be.false; + }); + it("should skip links validation if links are not provided", async () => { + const validateLinks = sinon.spy(helperLinks, "validateLinks"); + req.params = { + id: "1", + }; + serviceMock.editHelper = sinon.stub(service, "updateHelper").resolves({}); + const { links, ...helper } = mocks.HelperLinkBuilder.helperLink().build(); + req.body = helper; + await controller.editHelper(req, res); + expect(res.status.called).to.be.true; + expect(res.json.called).to.be.true; + expect(validateLinks.called).to.be.false; + }); + it("should return 400 if link is missing title", async () => { + req.params = { + id: "1", + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().missingTitle().build()], + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); + }); + it("should return 400 if link is missing url", async () => { + req.params = { + id: "1", + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().missingUrl().build()], + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], + }); + }); + it("should return 400 if link has invalid url", async () => { + req.params = { + id: "1", + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidUrl().build()], + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for url" }], + }); + }); + it("should return 400 if link has invalid order value", async () => { + req.params = { + id: "1", + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidOrderValue().build()], + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); + }); + it("should return 400 if link has invalid order type", async () => { + req.params = { + id: "1", + }; + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.body = { + ...helper, + links: [mocks.LinkBuilder.link().invalidOrderType().build()], + }; + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], + }); + }); + it("should return 500 if service throws error", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink().build(); + serviceMock.editHelper = sinon + .stub(service, "updateHelper") + .rejects(new Error("Error updating helper")); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "EDIT_HELPER_ERROR", + message: "Error updating helper", + }); + }); + it("should return 404 if helper does not exist", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink().build(); + serviceMock.editHelper = sinon + .stub(service, "updateHelper") + .resolves(null); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Helper with the specified id does not exist" }], + }); + }); + it("should return 200 if helper is updated", async () => { + req.params = { + id: "1", + }; + req.body = mocks.HelperLinkBuilder.helperLink().build(); + serviceMock.editHelper = sinon + .stub(service, "updateHelper") + .resolves(req.body); + await controller.editHelper(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(req.body); + }); + }); + describe("getAllHelpers", () => { + it("should return 500 if service throws error", async () => { + serviceMock.getAllHelpers = sinon + .stub(service, "getAllHelpers") + .rejects(); + await controller.getAllHelpers(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_ALL_HELPERS_ERROR", + message: "Error", + }); + }); + it("should return 200 if helpers are found", async () => { + const helpers = mocks.HelperLinkList; + serviceMock.getAllHelpers = sinon + .stub(service, "getAllHelpers") + .resolves(helpers); + await controller.getAllHelpers(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(helpers); + }); + }); + describe("getHelpersByUserId", () => { + req.user = { id: 1 }; + it("should return 500 if service throws error", async () => { + serviceMock.getHelpersByUserId = sinon + .stub(service, "getHelpersByUserId") + .rejects(new Error("Error retrieving helper by ID")); + await controller.getHelpersByUserId(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_HELPERS_ERROR", + message: "Error retrieving helper by ID", + }); + }); + it("should return 200 if helpers are found", async () => { + const helpers = mocks.HelperLinkList.filter((h) => h.createdBy === 1); + serviceMock.getHelpersByUserId = sinon + .stub(service, "getHelpersByUserId") + .resolves(helpers); + await controller.getHelpersByUserId(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(helpers); + }); + }); + describe("getHelperById", () => { + it("should return 400 if id is invalid", async () => { + req.params = { + id: "id", + }; + await controller.getHelperById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid helper ID" }], + }); + }); + it("should return 400 if id is missing", async () => { + req.params = {}; + await controller.getHelperById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid helper ID" }], + }); + }); + it("should return 404 if helper does not exist", async () => { + req.params = { + id: "1", + }; + serviceMock.getHelperById = sinon + .stub(service, "getHelperById") + .resolves(null); + await controller.getHelperById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Helper not found" }], + }); + }); + it("should return 500 if service throws error", async () => { + req.params = { + id: "1", + }; + serviceMock.getHelperById = sinon + .stub(service, "getHelperById") + .rejects(new Error("Error retrieving helper by ID")); + await controller.getHelperById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_HELPER_BY_ID_ERROR", + message: "Error retrieving helper by ID", + }); + }); + it("should return 200 if helper is found", async () => { + const helper = mocks.HelperLinkBuilder.helperLink().build(); + req.params = { + id: "1", + }; + serviceMock.getHelperById = sinon + .stub(service, "getHelperById") + .resolves(helper); + await controller.getHelperById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(helper); + }); }); -})(); +}); diff --git a/backend/src/test/unit/controllers/hint.test.js b/backend/src/test/unit/controllers/hint.test.js index 03157dbb..14014cf2 100644 --- a/backend/src/test/unit/controllers/hint.test.js +++ b/backend/src/test/unit/controllers/hint.test.js @@ -1,450 +1,448 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const mocks = require("../../mocks/hint.mock.js"); - const hintService = require("../../../service/hint.service.js"); - const hintController = require("../../../controllers/hint.controller.js"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const mocks = require("../../mocks/hint.mock.js"); +const hintService = require("../../../service/hint.service.js"); +const hintController = require("../../../controllers/hint.controller.js"); - const hint = mocks.HintBuilder.hint; - const hintList = mocks.hintList; +const hint = mocks.HintBuilder.hint; +const hintList = mocks.hintList; - describe("Test hint controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - describe("addHint", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if action is missing", async () => { - req.body = hint(1).missingAction().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "action is required" }], - }); - }); - it("should return 400 if action is invalid", async () => { - req.body = hint(1).invalidAction().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for action" }], - }); - }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.body = hint(1).invalidHeaderBackgroundColor().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for headerBackgroundColor" }], - }); - }); - it("should return 400 if headerColor is invalid", async () => { - req.body = hint(1).invalidHeaderColor().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for headerColor" }], - }); - }); - it("should return 400 if textColor is invalid", async () => { - req.body = hint(1).invalidTextColor().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for textColor" }], - }); - }); - it("should return 400 if buttonBackgroundColor is invalid", async () => { - req.body = hint(1).invalidButtonBackgroundColor().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for buttonBackgroundColor" }], - }); - }); - it("should return 400 if buttonTextColor is invalid", async () => { - req.body = hint(1).invalidButtonTextColor().build(); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for buttonTextColor" }], - }); - }); - it("should return 201 if hint is created", async () => { - req.body = hint(1).build(); - serviceMock.createHint = sinon - .stub(hintService, "createHint") - .resolves(hint(1).build()); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(201); - expect(body).to.be.deep.equal(hint(1).build()); - }); - it("should return 500 if an error occurs", async () => { - req.body = hint(1).build(); - serviceMock.createHint = sinon - .stub(hintService, "createHint") - .rejects(new Error("error")); - await hintController.addHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_HINT_ERROR", - message: "An unexpected error occurred while creating the hint", - }); - }); +describe("Test hint controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + describe("addHint", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - describe("getHints", () => { - beforeEach(() => { - req.user = { id: "1" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + afterEach(sinon.restore); + it("should return 400 if action is missing", async () => { + req.body = hint(1).missingAction().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "action is required" }], }); - afterEach(sinon.restore); - it("should return 200 if hints created by the user are retrieved", async () => { - serviceMock.getHints = sinon - .stub(hintService, "getHints") - .resolves(hintList.filter((hint) => hint.createdBy === 1)); - await hintController.getHints(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).not.to.be.deep.equal(hintList); - }); - it("should return 500 if an error occurs", async () => { - serviceMock.getHints = sinon - .stub(hintService, "getHints") - .rejects(new Error("error")); - await hintController.getHints(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_HINTS_ERROR", - message: "An unexpected error occurred while retrieving hints", - }); + }); + it("should return 400 if action is invalid", async () => { + req.body = hint(1).invalidAction().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for action" }], }); }); - describe("getAllHints", () => { - beforeEach(() => { - req.user = { id: "1" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.body = hint(1).invalidHeaderBackgroundColor().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for headerBackgroundColor" }], }); - afterEach(sinon.restore); - it("should return 200 if hints are retrieved", async () => { - serviceMock.getAllHints = sinon - .stub(hintService, "getAllHints") - .resolves(hintList); - await hintController.getAllHints(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(hintList); + }); + it("should return 400 if headerColor is invalid", async () => { + req.body = hint(1).invalidHeaderColor().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for headerColor" }], }); - it("should return 500 if an error occurs", async () => { - serviceMock.getAllHints = sinon - .stub(hintService, "getAllHints") - .rejects(new Error("error")); - await hintController.getAllHints(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_ALL_HINTS_ERROR", - message: "An unexpected error occurred while retrieving hints", - }); + }); + it("should return 400 if textColor is invalid", async () => { + req.body = hint(1).invalidTextColor().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for textColor" }], }); }); - describe("getHintById", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + it("should return 400 if buttonBackgroundColor is invalid", async () => { + req.body = hint(1).invalidButtonBackgroundColor().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for buttonBackgroundColor" }], }); - afterEach(sinon.restore); - it("should return 400 if hint id is missing", async () => { - req.params = {}; - await hintController.getHintById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid hint ID" }], - }); + }); + it("should return 400 if buttonTextColor is invalid", async () => { + req.body = hint(1).invalidButtonTextColor().build(); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for buttonTextColor" }], }); - it("should return 400 if hint id is invalid", async () => { - req.params = { hintId: "invalid" }; - await hintController.getHintById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid hint ID" }], - }); + }); + it("should return 201 if hint is created", async () => { + req.body = hint(1).build(); + serviceMock.createHint = sinon + .stub(hintService, "createHint") + .resolves(hint(1).build()); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(201); + expect(body).to.be.deep.equal(hint(1).build()); + }); + it("should return 500 if an error occurs", async () => { + req.body = hint(1).build(); + serviceMock.createHint = sinon + .stub(hintService, "createHint") + .rejects(new Error("error")); + await hintController.addHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_HINT_ERROR", + message: "An unexpected error occurred while creating the hint", }); - it("should return 200 if hint is retrieved", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(hint(1).build()); - await hintController.getHintById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(hint(1).build()); + }); + }); + describe("getHints", () => { + beforeEach(() => { + req.user = { id: "1" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if hints created by the user are retrieved", async () => { + serviceMock.getHints = sinon + .stub(hintService, "getHints") + .resolves(hintList.filter((hint) => hint.createdBy === 1)); + await hintController.getHints(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).not.to.be.deep.equal(hintList); + }); + it("should return 500 if an error occurs", async () => { + serviceMock.getHints = sinon + .stub(hintService, "getHints") + .rejects(new Error("error")); + await hintController.getHints(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_HINTS_ERROR", + message: "An unexpected error occurred while retrieving hints", }); - it("should return 404 if hint is not found", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(null); - await hintController.getHintById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Hint not found" }], - }); + }); + }); + describe("getAllHints", () => { + beforeEach(() => { + req.user = { id: "1" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if hints are retrieved", async () => { + serviceMock.getAllHints = sinon + .stub(hintService, "getAllHints") + .resolves(hintList); + await hintController.getAllHints(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(hintList); + }); + it("should return 500 if an error occurs", async () => { + serviceMock.getAllHints = sinon + .stub(hintService, "getAllHints") + .rejects(new Error("error")); + await hintController.getAllHints(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_ALL_HINTS_ERROR", + message: "An unexpected error occurred while retrieving hints", }); - it("should return 500 if an error occurs", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .rejects(new Error("error")); - await hintController.getHintById(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_HINT_BY_ID_ERROR", - message: "An unexpected error occurred while retrieving the hint", - }); + }); + }); + describe("getHintById", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if hint id is missing", async () => { + req.params = {}; + await hintController.getHintById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid hint ID" }], }); }); - describe("updateHint", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + it("should return 400 if hint id is invalid", async () => { + req.params = { hintId: "invalid" }; + await hintController.getHintById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid hint ID" }], }); - afterEach(sinon.restore); - it("should return 400 if action is missing", async () => { - req.body = hint(1).missingAction().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "action is required" }], - }); + }); + it("should return 200 if hint is retrieved", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(hint(1).build()); + await hintController.getHintById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(hint(1).build()); + }); + it("should return 404 if hint is not found", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(null); + await hintController.getHintById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Hint not found" }], }); - it("should return 400 if action is invalid", async () => { - req.body = hint(1).invalidAction().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for action" }], - }); + }); + it("should return 500 if an error occurs", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .rejects(new Error("error")); + await hintController.getHintById(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_HINT_BY_ID_ERROR", + message: "An unexpected error occurred while retrieving the hint", }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.body = hint(1).invalidHeaderBackgroundColor().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for headerBackgroundColor" }], - }); + }); + }); + describe("updateHint", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if action is missing", async () => { + req.body = hint(1).missingAction().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "action is required" }], }); - it("should return 400 if headerColor is invalid", async () => { - req.body = hint(1).invalidHeaderColor().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for headerColor" }], - }); + }); + it("should return 400 if action is invalid", async () => { + req.body = hint(1).invalidAction().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for action" }], }); - it("should return 400 if textColor is invalid", async () => { - req.body = hint(1).invalidTextColor().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for textColor" }], - }); + }); + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.body = hint(1).invalidHeaderBackgroundColor().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for headerBackgroundColor" }], }); - it("should return 400 if buttonBackgroundColor is invalid", async () => { - req.body = hint(1).invalidButtonBackgroundColor().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for buttonBackgroundColor" }], - }); + }); + it("should return 400 if headerColor is invalid", async () => { + req.body = hint(1).invalidHeaderColor().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for headerColor" }], }); - it("should return 400 if buttonTextColor is invalid", async () => { - req.body = hint(1).invalidButtonTextColor().build(); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for buttonTextColor" }], - }); + }); + it("should return 400 if textColor is invalid", async () => { + req.body = hint(1).invalidTextColor().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for textColor" }], }); - it("should return 404 if hint is not found", async () => { - req.params = { hintId: "1" }; - req.body = hint(1).build(); - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(null); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Hint not found" }], - }); + }); + it("should return 400 if buttonBackgroundColor is invalid", async () => { + req.body = hint(1).invalidButtonBackgroundColor().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for buttonBackgroundColor" }], }); - it("should return 200 if hint is updated", async () => { - req.params = { hintId: "1" }; - req.body = hint(1).build(); - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(hint(1).build()); - serviceMock.updateHint = sinon - .stub(hintService, "updateHint") - .resolves(hint(1).build()); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal(hint(1).build()); + }); + it("should return 400 if buttonTextColor is invalid", async () => { + req.body = hint(1).invalidButtonTextColor().build(); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for buttonTextColor" }], }); - it("should return 500 if an error occurs", async () => { - req.params = { hintId: "1" }; - req.body = hint(1).build(); - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .rejects(new Error("error")); - await hintController.updateHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "UPDATE_HINT_ERROR", - message: "An unexpected error occurred while updating the hint", - }); + }); + it("should return 404 if hint is not found", async () => { + req.params = { hintId: "1" }; + req.body = hint(1).build(); + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(null); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Hint not found" }], }); }); - describe("deleteHint", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + it("should return 200 if hint is updated", async () => { + req.params = { hintId: "1" }; + req.body = hint(1).build(); + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(hint(1).build()); + serviceMock.updateHint = sinon + .stub(hintService, "updateHint") + .resolves(hint(1).build()); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal(hint(1).build()); + }); + it("should return 500 if an error occurs", async () => { + req.params = { hintId: "1" }; + req.body = hint(1).build(); + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .rejects(new Error("error")); + await hintController.updateHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "UPDATE_HINT_ERROR", + message: "An unexpected error occurred while updating the hint", }); - afterEach(sinon.restore); - it("should return 400 if hint id is missing", async () => { - req.params = {}; - await hintController.deleteHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid hint ID" }], - }); + }); + }); + describe("deleteHint", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if hint id is missing", async () => { + req.params = {}; + await hintController.deleteHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid hint ID" }], }); - it("should return 400 if hint id is invalid", async () => { - req.params = { hintId: "invalid" }; - await hintController.deleteHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid hint ID" }], - }); + }); + it("should return 400 if hint id is invalid", async () => { + req.params = { hintId: "invalid" }; + await hintController.deleteHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid hint ID" }], }); - it("should return 404 if hint is not found", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "deleteHint") - .resolves(null); - await hintController.deleteHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Hint not found" }], - }); + }); + it("should return 404 if hint is not found", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "deleteHint") + .resolves(null); + await hintController.deleteHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Hint not found" }], }); - it("should return 200 if hint is deleted", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(hint(1).build()); - serviceMock.deleteHint = sinon - .stub(hintService, "deleteHint") - .resolves(hint(1).build()); - await hintController.deleteHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(200); - expect(body).to.be.deep.equal({ - message: "Hint with ID 1 deleted successfully", - }); + }); + it("should return 200 if hint is deleted", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(hint(1).build()); + serviceMock.deleteHint = sinon + .stub(hintService, "deleteHint") + .resolves(hint(1).build()); + await hintController.deleteHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(200); + expect(body).to.be.deep.equal({ + message: "Hint with ID 1 deleted successfully", }); - it("should return 500 if an error occurs", async () => { - req.params = { hintId: "1" }; - serviceMock.getHintById = sinon - .stub(hintService, "getHintById") - .resolves(1); - serviceMock.deleteHint = sinon - .stub(hintService, "deleteHint") - .rejects(new Error("error")); - await hintController.deleteHint(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_HINT_ERROR", - message: "An unexpected error occurred while deleting the hint", - }); + }); + it("should return 500 if an error occurs", async () => { + req.params = { hintId: "1" }; + serviceMock.getHintById = sinon + .stub(hintService, "getHintById") + .resolves(1); + serviceMock.deleteHint = sinon + .stub(hintService, "deleteHint") + .rejects(new Error("error")); + await hintController.deleteHint(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_HINT_ERROR", + message: "An unexpected error occurred while deleting the hint", }); }); }); -})(); +}); diff --git a/backend/src/test/unit/controllers/invite.test.js b/backend/src/test/unit/controllers/invite.test.js index f791e04a..35231724 100644 --- a/backend/src/test/unit/controllers/invite.test.js +++ b/backend/src/test/unit/controllers/invite.test.js @@ -1,85 +1,81 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const { validList } = require("../../mocks/user.mock.js"); - const controller = require("../../../controllers/invite.controller.js"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const { validList } = require("../../mocks/user.mock.js"); +const controller = require("../../../controllers/invite.controller.js"); - const service = controller.inviteService; +const service = controller.inviteService; - const validEmailList = validList.map((it) => ({ - invitedBy: 1, - invitedEmail: it.email, - role: "admin", - })); +const validEmailList = validList.map((it) => ({ + invitedBy: 1, + invitedEmail: it.email, + role: "admin", +})); - describe("Test invite controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("sendTeamInvite - should return status 200 if everything works", async () => { - req.user = { id: 1 }; - req.body = { invitedEmail: "email@email.com", role: "admin" }; - serviceMock.sendInvite = sinon.stub(service, "sendInvite").resolves(); +describe("Test invite controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("sendTeamInvite - should return status 200 if everything works", async () => { + req.user = { id: 1 }; + req.body = { invitedEmail: "email@email.com", role: "admin" }; + serviceMock.sendInvite = sinon.stub(service, "sendInvite").resolves(); - await controller.sendTeamInvite(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal({ - data: null, - message: "Invite sent successfully", - status: 200, - }); + await controller.sendTeamInvite(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal({ + data: null, + message: "Invite sent successfully", + status: 200, }); - it("sendTeamInvite - should return status 500 if something goes wrong", async () => { - req.user = { id: 1 }; - req.body = { invitedEmail: "email@email.com", role: "admin" }; - serviceMock.sendInvite = sinon.stub(service, "sendInvite").rejects(); + }); + it("sendTeamInvite - should return status 500 if something goes wrong", async () => { + req.user = { id: 1 }; + req.body = { invitedEmail: "email@email.com", role: "admin" }; + serviceMock.sendInvite = sinon.stub(service, "sendInvite").rejects(); - await controller.sendTeamInvite(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "SEND_INVITE_ERROR", - message: "Error", - }); + await controller.sendTeamInvite(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "SEND_INVITE_ERROR", + message: "Error", }); - it("getAllInvites - should return all the invites", async () => { - serviceMock.getAllInvites = sinon - .stub(service, "getAllInvites") - .resolves(validEmailList); + }); + it("getAllInvites - should return all the invites", async () => { + serviceMock.getAllInvites = sinon + .stub(service, "getAllInvites") + .resolves(validEmailList); - await controller.getAllInvites(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal({ - invites: validEmailList, - message: "Invites Retrieved Successfully", - success: true, - }); + await controller.getAllInvites(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal({ + invites: validEmailList, + message: "Invites Retrieved Successfully", + success: true, }); - it("getAllInvites - should throw an error if something goes wrong", async () => { - serviceMock.getAllInvites = sinon - .stub(service, "getAllInvites") - .rejects(); + }); + it("getAllInvites - should throw an error if something goes wrong", async () => { + serviceMock.getAllInvites = sinon.stub(service, "getAllInvites").rejects(); - await controller.getAllInvites(req, res); - const status = res.status.args[0][0]; - const body = res.json.args[0][0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - message: "Error", - success: false, - }); + await controller.getAllInvites(req, res); + const status = res.status.args[0][0]; + const body = res.json.args[0][0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + message: "Error", + success: false, }); }); -})(); +}); diff --git a/backend/src/test/unit/controllers/link.test.js b/backend/src/test/unit/controllers/link.test.js index 65e21a2c..48cb33cd 100644 --- a/backend/src/test/unit/controllers/link.test.js +++ b/backend/src/test/unit/controllers/link.test.js @@ -1,524 +1,522 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const mocks = require("../../mocks/helperLink.mock.js"); - const linkService = require("../../../service/link.service.js"); - const linkController = require("../../../controllers/link.controller.js"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const mocks = require("../../mocks/helperLink.mock.js"); +const linkService = require("../../../service/link.service.js"); +const linkController = require("../../../controllers/link.controller.js"); - const link = mocks.LinkBuilder.link; +const link = mocks.LinkBuilder.link; - describe("Test link controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - describe("addLink", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if url is missing", async () => { - req.body = link().missingUrl().build(); - await linkController.addLink(req, res); - const params = res.json.getCall(0).args[0]; - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); - }); - it("should return 400 if title is missing", async () => { - req.body = link().missingTitle().build(); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const params = res.json.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); - }); - it("should return 400 if title is invalid", async () => { - req.body = link().invalidTitle().build(); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for title or url" }], - }); - }); - it("should return 400 if url is invalid", async () => { - req.body = link().invalidUrl().build(); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const params = res.json.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for title or url" }], - }); - }); - it("should return 400 if type of order is invalid", async () => { - req.body = link().invalidOrderType().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const params = res.json.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); - }); - it("should return 400 if order is invalid", async () => { - req.body = link().invalidOrderValue().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); - }); - it("should return 201 if link was created", async () => { - req.body = link().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.createLink = sinon - .stub(linkService, "createLink") - .resolves(req.body); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(201); - expect(params).to.be.deep.equal(req.body); - }); - it("should return 201 if order is not provided", async () => { - req.body = link().missingOrder().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.createLink = sinon - .stub(linkService, "createLink") - .resolves(req.body); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(201); - expect(params).to.be.deep.equal(req.body); - const paramsCreateLink = serviceMock.createLink.getCall(0).args[0]; - const { id, order, ...expected } = req.body; - expect(paramsCreateLink).to.be.deep.equal({ ...expected, order: 1 }); - }); - it("should return 201 if target is not provided", async () => { - req.body = link().missingTarget().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.createLink = sinon - .stub(linkService, "createLink") - .resolves(req.body); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(201); - expect(params).to.be.deep.equal(req.body); - const paramsCreateLink = serviceMock.createLink.getCall(0).args[0]; - const { id, target, ...expected } = req.body; - expect(paramsCreateLink).to.be.deep.equal({ - ...expected, - target: true, - }); - }); - it("should return 500 if an error occurs", async () => { - req.body = link().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .rejects(new Error()); - await linkController.addLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_LINK_ERROR", - }); - }); +describe("Test link controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + describe("addLink", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - describe("deleteLink", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + afterEach(sinon.restore); + it("should return 400 if url is missing", async () => { + req.body = link().missingUrl().build(); + await linkController.addLink(req, res); + const params = res.json.getCall(0).args[0]; + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], }); - afterEach(sinon.restore); - it("should return 400 if id is invalid", async () => { - req.params = { id: "id" }; - await linkController.deleteLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 400 if id is empty", async () => { - req.params = { id: "" }; - await linkController.deleteLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 404 if link was not found", async () => { - req.params = { id: "1" }; - serviceMock.deleteLink = sinon - .stub(linkService, "deleteLink") - .resolves(false); - await linkController.deleteLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(404); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Link with the specified id does not exist" }], - }); + }); + it("should return 400 if title is missing", async () => { + req.body = link().missingTitle().build(); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const params = res.json.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], }); - it("should return 200 if link was deleted", async () => { - req.params = { id: "1" }; - serviceMock.deleteLink = sinon - .stub(linkService, "deleteLink") - .resolves(true); - await linkController.deleteLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal({ - message: "Link with ID 1 deleted successfully", - }); + }); + it("should return 400 if title is invalid", async () => { + req.body = link().invalidTitle().build(); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for title or url" }], }); - it("should return 500 if an error occurs", async () => { - req.params = { id: "1" }; - serviceMock.deleteLink = sinon - .stub(linkService, "deleteLink") - .rejects(new Error()); - await linkController.deleteLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_LINK_ERROR", - }); + }); + it("should return 400 if url is invalid", async () => { + req.body = link().invalidUrl().build(); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const params = res.json.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for title or url" }], }); }); - describe("editLink", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + it("should return 400 if type of order is invalid", async () => { + req.body = link().invalidOrderType().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const params = res.json.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], }); - afterEach(sinon.restore); - it("should return 400 if id is invalid", async () => { - req.params = { id: "id" }; - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); + }); + it("should return 400 if order is invalid", async () => { + req.body = link().invalidOrderValue().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], }); - it("should return 400 if id is empty", async () => { - req.params = { id: "" }; - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); + }); + it("should return 201 if link was created", async () => { + req.body = link().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.createLink = sinon + .stub(linkService, "createLink") + .resolves(req.body); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(201); + expect(params).to.be.deep.equal(req.body); + }); + it("should return 201 if order is not provided", async () => { + req.body = link().missingOrder().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.createLink = sinon + .stub(linkService, "createLink") + .resolves(req.body); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(201); + expect(params).to.be.deep.equal(req.body); + const paramsCreateLink = serviceMock.createLink.getCall(0).args[0]; + const { id, order, ...expected } = req.body; + expect(paramsCreateLink).to.be.deep.equal({ ...expected, order: 1 }); + }); + it("should return 201 if target is not provided", async () => { + req.body = link().missingTarget().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.createLink = sinon + .stub(linkService, "createLink") + .resolves(req.body); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(201); + expect(params).to.be.deep.equal(req.body); + const paramsCreateLink = serviceMock.createLink.getCall(0).args[0]; + const { id, target, ...expected } = req.body; + expect(paramsCreateLink).to.be.deep.equal({ + ...expected, + target: true, }); - it("should return 400 if title is missing", async () => { - req.params = { id: "1" }; - req.body = link().missingTitle().build(); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); + }); + it("should return 500 if an error occurs", async () => { + req.body = link().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .rejects(new Error()); + await linkController.addLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_LINK_ERROR", }); - it("should return 400 if url is missing", async () => { - req.params = { id: "1" }; - req.body = link().missingUrl().build(); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "title and url are required" }], - }); + }); + }); + describe("deleteLink", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if id is invalid", async () => { + req.params = { id: "id" }; + await linkController.deleteLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], }); - it("should return 400 if title is invalid", async () => { - req.params = { id: "1" }; - req.body = link().invalidTitle().build(); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for title or url" }], - }); + }); + it("should return 400 if id is empty", async () => { + req.params = { id: "" }; + await linkController.deleteLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], }); - it("should return 400 if url is invalid", async () => { - req.params = { id: "1" }; - req.body = link().invalidUrl().build(); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for title or url" }], - }); + }); + it("should return 404 if link was not found", async () => { + req.params = { id: "1" }; + serviceMock.deleteLink = sinon + .stub(linkService, "deleteLink") + .resolves(false); + await linkController.deleteLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(404); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Link with the specified id does not exist" }], }); - it("should return 400 if order is invalid", async () => { - req.params = { id: "1" }; - req.body = link().invalidOrderValue().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); + }); + it("should return 200 if link was deleted", async () => { + req.params = { id: "1" }; + serviceMock.deleteLink = sinon + .stub(linkService, "deleteLink") + .resolves(true); + await linkController.deleteLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal({ + message: "Link with ID 1 deleted successfully", }); - it("should return 400 if order type is invalid", async () => { - req.params = { id: "1" }; - req.body = link().invalidOrderType().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid value for order" }], - }); + }); + it("should return 500 if an error occurs", async () => { + req.params = { id: "1" }; + serviceMock.deleteLink = sinon + .stub(linkService, "deleteLink") + .rejects(new Error()); + await linkController.deleteLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_LINK_ERROR", }); - it("should return 200 if order is not provided", async () => { - req.body = link().missingOrder().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.updateLink = sinon - .stub(linkService, "updateLink") - .resolves(req.body); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(req.body); - const paramsUpdateLink = serviceMock.updateLink.getCall(0).args[1]; - const { id, order, ...expected } = req.body; - expect(paramsUpdateLink).to.be.deep.equal({ ...expected, order: 1 }); + }); + }); + describe("editLink", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if id is invalid", async () => { + req.params = { id: "id" }; + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], }); - it("should return 200 if target is not provided", async () => { - req.body = link().missingTarget().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.updateLink = sinon - .stub(linkService, "updateLink") - .resolves(req.body); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(req.body); - const paramsUpdateLink = serviceMock.updateLink.getCall(0).args[1]; - const { id, target, ...expected } = req.body; - expect(paramsUpdateLink).to.be.deep.equal({ - ...expected, - target: true, - }); + }); + it("should return 400 if id is empty", async () => { + req.params = { id: "" }; + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], }); - it("should return 200 if link was updated", async () => { - req.params = { id: "1" }; - req.body = link().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves([]); - serviceMock.updateLink = sinon - .stub(linkService, "updateLink") - .resolves(req.body); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(req.body); + }); + it("should return 400 if title is missing", async () => { + req.params = { id: "1" }; + req.body = link().missingTitle().build(); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], }); - it("should return 500 if an error occurs", async () => { - req.params = { id: "1" }; - req.body = link().build(); - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .rejects(new Error()); - await linkController.editLink(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "EDIT_LINK_ERROR", - }); + }); + it("should return 400 if url is missing", async () => { + req.params = { id: "1" }; + req.body = link().missingUrl().build(); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "title and url are required" }], }); }); - describe("getAllLinks", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + it("should return 400 if title is invalid", async () => { + req.params = { id: "1" }; + req.body = link().invalidTitle().build(); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for title or url" }], }); - afterEach(sinon.restore); - it("should return 200 if links were found", async () => { - serviceMock.getAllLinks = sinon - .stub(linkService, "getAllLinks") - .resolves(mocks.LinksList); - await linkController.getAllLinks(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(mocks.LinksList); + }); + it("should return 400 if url is invalid", async () => { + req.params = { id: "1" }; + req.body = link().invalidUrl().build(); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for title or url" }], }); - it("should return 500 if an error occurs", async () => { - serviceMock.getAllLinks = sinon - .stub(linkService, "getAllLinks") - .rejects(new Error()); - await linkController.getAllLinks(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_ALL_LINKS_ERROR", - }); + }); + it("should return 400 if order is invalid", async () => { + req.params = { id: "1" }; + req.body = link().invalidOrderValue().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], }); }); - describe("getLinksByHelperId", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + it("should return 400 if order type is invalid", async () => { + req.params = { id: "1" }; + req.body = link().invalidOrderType().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid value for order" }], }); - afterEach(sinon.restore); - it("should return 400 if helperId is invalid", async () => { - req.query = { helperId: "id" }; - await linkController.getLinksByHelperId(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid helperId" }], - }); + }); + it("should return 200 if order is not provided", async () => { + req.body = link().missingOrder().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.updateLink = sinon + .stub(linkService, "updateLink") + .resolves(req.body); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(req.body); + const paramsUpdateLink = serviceMock.updateLink.getCall(0).args[1]; + const { id, order, ...expected } = req.body; + expect(paramsUpdateLink).to.be.deep.equal({ ...expected, order: 1 }); + }); + it("should return 200 if target is not provided", async () => { + req.body = link().missingTarget().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.updateLink = sinon + .stub(linkService, "updateLink") + .resolves(req.body); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(req.body); + const paramsUpdateLink = serviceMock.updateLink.getCall(0).args[1]; + const { id, target, ...expected } = req.body; + expect(paramsUpdateLink).to.be.deep.equal({ + ...expected, + target: true, }); - it("should return 200 if links were found", async () => { - req.query = { helperId: "1" }; - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .resolves(mocks.LinksList); - await linkController.getLinksByHelperId(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(mocks.LinksList); + }); + it("should return 200 if link was updated", async () => { + req.params = { id: "1" }; + req.body = link().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves([]); + serviceMock.updateLink = sinon + .stub(linkService, "updateLink") + .resolves(req.body); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(req.body); + }); + it("should return 500 if an error occurs", async () => { + req.params = { id: "1" }; + req.body = link().build(); + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .rejects(new Error()); + await linkController.editLink(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "EDIT_LINK_ERROR", }); - it("should return 500 if an error occurs", async () => { - req.query = { helperId: "1" }; - serviceMock.getLinksByHelperId = sinon - .stub(linkService, "getLinksByHelperId") - .rejects(new Error()); - await linkController.getLinksByHelperId(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_LINKS_ERROR", - }); + }); + }); + describe("getAllLinks", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if links were found", async () => { + serviceMock.getAllLinks = sinon + .stub(linkService, "getAllLinks") + .resolves(mocks.LinksList); + await linkController.getAllLinks(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(mocks.LinksList); + }); + it("should return 500 if an error occurs", async () => { + serviceMock.getAllLinks = sinon + .stub(linkService, "getAllLinks") + .rejects(new Error()); + await linkController.getAllLinks(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_ALL_LINKS_ERROR", }); }); - describe("getLinksById", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + }); + describe("getLinksByHelperId", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if helperId is invalid", async () => { + req.query = { helperId: "id" }; + await linkController.getLinksByHelperId(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid helperId" }], }); - afterEach(sinon.restore); - it("should return 400 if id is invalid", async () => { - req.params = { id: "id" }; - await linkController.getLinksById(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid link ID" }], - }); + }); + it("should return 200 if links were found", async () => { + req.query = { helperId: "1" }; + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .resolves(mocks.LinksList); + await linkController.getLinksByHelperId(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(mocks.LinksList); + }); + it("should return 500 if an error occurs", async () => { + req.query = { helperId: "1" }; + serviceMock.getLinksByHelperId = sinon + .stub(linkService, "getLinksByHelperId") + .rejects(new Error()); + await linkController.getLinksByHelperId(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_LINKS_ERROR", }); - it("should return 400 if id is empty", async () => { - req.params = { id: "" }; - await linkController.getLinksById(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Invalid link ID" }], - }); + }); + }); + describe("getLinksById", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if id is invalid", async () => { + req.params = { id: "id" }; + await linkController.getLinksById(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid link ID" }], }); - it("should return 404 if link was not found", async () => { - req.params = { id: "1" }; - serviceMock.getLinkById = sinon - .stub(linkService, "getLinkById") - .resolves(null); - await linkController.getLinksById(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(404); - expect(params).to.be.deep.equal({ - errors: [{ msg: "Link not found" }], - }); + }); + it("should return 400 if id is empty", async () => { + req.params = { id: "" }; + await linkController.getLinksById(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Invalid link ID" }], }); - it("should return 200 if link was found", async () => { - req.params = { id: "1" }; - serviceMock.getLinkById = sinon - .stub(linkService, "getLinkById") - .resolves(mocks.LinksList[0]); - await linkController.getLinksById(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(params).to.be.deep.equal(mocks.LinksList[0]); + }); + it("should return 404 if link was not found", async () => { + req.params = { id: "1" }; + serviceMock.getLinkById = sinon + .stub(linkService, "getLinkById") + .resolves(null); + await linkController.getLinksById(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(404); + expect(params).to.be.deep.equal({ + errors: [{ msg: "Link not found" }], }); - it("should return 500 if an error occurs", async () => { - req.params = { id: "1" }; - serviceMock.getLinkById = sinon - .stub(linkService, "getLinkById") - .rejects(new Error()); - await linkController.getLinksById(req, res); - const status = res.status.getCall(0).args[0]; - const params = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(params).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_LINK_BY_ID_ERROR", - }); + }); + it("should return 200 if link was found", async () => { + req.params = { id: "1" }; + serviceMock.getLinkById = sinon + .stub(linkService, "getLinkById") + .resolves(mocks.LinksList[0]); + await linkController.getLinksById(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(params).to.be.deep.equal(mocks.LinksList[0]); + }); + it("should return 500 if an error occurs", async () => { + req.params = { id: "1" }; + serviceMock.getLinkById = sinon + .stub(linkService, "getLinkById") + .rejects(new Error()); + await linkController.getLinksById(req, res); + const status = res.status.getCall(0).args[0]; + const params = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(params).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_LINK_BY_ID_ERROR", }); }); }); -})(); +}); diff --git a/backend/src/test/unit/controllers/onboarding.test.js b/backend/src/test/unit/controllers/onboarding.test.js index b5823f28..1cb2f887 100644 --- a/backend/src/test/unit/controllers/onboarding.test.js +++ b/backend/src/test/unit/controllers/onboarding.test.js @@ -1,116 +1,114 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const onboardingController = require("../../../controllers/onboarding.controller.js"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const onboardingController = require("../../../controllers/onboarding.controller.js"); - describe("Test onboarding controller", () => { - const req = {}; - const res = {}; - describe("popup", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 and a list with one popup when key is A", async () => { - req.query = { key: "A" }; - await onboardingController.popup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.equal(200); - expect(body).to.deep.equal([ +describe("Test onboarding controller", () => { + const req = {}; + const res = {}; + describe("popup", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 and a list with one popup when key is A", async () => { + req.query = { key: "A" }; + await onboardingController.popup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.equal(200); + expect(body).to.deep.equal([ + { + action: "close", + actionButtonColor: "#CCCCCC", + actionButtonText: "Kapat/Close", + contentHtml: "tek content", + font: "14px", + fontColor: "#AAAAAA", + headerBg: "#4F9EBF", + headerText: "test header text", + headerTextColor: "#5F5014", + no: 1, + }, + ]); + expect(body).to.have.length(1); + }); + it("should return 200 and a list with two popups when key is B", async () => { + req.query = { key: "B" }; + await onboardingController.popup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.equal(200); + expect(body).to.deep.equal([ + { + action: "close", + actionButtonColor: "#CCCCCC", + actionButtonText: "Kapat/Close1", + contentHtml: "11", + font: "14px", + fontColor: "#AAAAAA", + headerBg: "#A2A2A2", + headerText: "test header text1", + no: 1, + }, + { + action: "close", + actionButtonColor: "#CCCCCC", + actionButtonText: "Kapat/Close2", + contentHtml: "22", + font: "14px", + fontColor: "#AAAAAA", + headerBg: "#A2A2A2", + headerText: "test header text2", + no: 2, + }, + ]); + expect(body).to.have.length(2); + }); + it("should return 200 and an empty list when key is not A or B", async () => { + req.query = { key: "C" }; + await onboardingController.popup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.equal(200); + expect(body).to.deep.equal([]); + }); + }); + describe("onboard", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 and an object with the user info", async () => { + req.body = { userId: "123" }; + await onboardingController.onboard(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.equal(200); + expect(body).to.deep.equal({ + userId: "123", + popupData: [ { - action: "close", - actionButtonColor: "#CCCCCC", - actionButtonText: "Kapat/Close", - contentHtml: "tek content", - font: "14px", - fontColor: "#AAAAAA", - headerBg: "#4F9EBF", + no: 1, headerText: "test header text", headerTextColor: "#5F5014", - no: 1, - }, - ]); - expect(body).to.have.length(1); - }); - it("should return 200 and a list with two popups when key is B", async () => { - req.query = { key: "B" }; - await onboardingController.popup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.equal(200); - expect(body).to.deep.equal([ - { - action: "close", - actionButtonColor: "#CCCCCC", - actionButtonText: "Kapat/Close1", - contentHtml: "11", + headerBg: "#4F9EBF", + contentHtml: "tek content", font: "14px", fontColor: "#AAAAAA", - headerBg: "#A2A2A2", - headerText: "test header text1", - no: 1, - }, - { action: "close", + actionButtonText: "Kapat/Close", actionButtonColor: "#CCCCCC", - actionButtonText: "Kapat/Close2", - contentHtml: "22", - font: "14px", - fontColor: "#AAAAAA", - headerBg: "#A2A2A2", - headerText: "test header text2", - no: 2, }, - ]); - expect(body).to.have.length(2); - }); - it("should return 200 and an empty list when key is not A or B", async () => { - req.query = { key: "C" }; - await onboardingController.popup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.equal(200); - expect(body).to.deep.equal([]); - }); - }); - describe("onboard", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 and an object with the user info", async () => { - req.body = { userId: "123" }; - await onboardingController.onboard(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.equal(200); - expect(body).to.deep.equal({ - userId: "123", - popupData: [ - { - no: 1, - headerText: "test header text", - headerTextColor: "#5F5014", - headerBg: "#4F9EBF", - contentHtml: "tek content", - font: "14px", - fontColor: "#AAAAAA", - action: "close", - actionButtonText: "Kapat/Close", - actionButtonColor: "#CCCCCC", - }, - ], - bannerData: undefined, - tourData: undefined, - linkData: undefined, - }); + ], + bannerData: undefined, + tourData: undefined, + linkData: undefined, }); }); }); -})(); +}); diff --git a/backend/src/test/unit/controllers/popup.test.js b/backend/src/test/unit/controllers/popup.test.js index c0794277..990ec7b7 100644 --- a/backend/src/test/unit/controllers/popup.test.js +++ b/backend/src/test/unit/controllers/popup.test.js @@ -1,493 +1,491 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const mocks = require("../../mocks/popup.mock.js"); - const popupService = require("../../../service/popup.service.js"); - const popupController = require("../../../controllers/popup.controller.js"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const mocks = require("../../mocks/popup.mock.js"); +const popupService = require("../../../service/popup.service.js"); +const popupController = require("../../../controllers/popup.controller.js"); - const popup = mocks.PopupBuilder.popup; - const popupList = mocks.popupList; +const popup = mocks.PopupBuilder.popup; +const popupList = mocks.popupList; - describe("Test popup controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - describe("addPopup", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if popupSize is not provided", async () => { - req.body = popup().missingPopupSize().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "popupSize and closeButtonAction are required" }], - }); - }); - it("should return 400 if closeButtonAction is not provided", async () => { - req.body = popup().missingCloseButtonAction().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "popupSize and closeButtonAction are required" }], - }); - }); - it("should return 400 if popupSize is invalid", async () => { - req.body = popup().invalidPopupSize().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for popupSize or closeButtonAction" }], - }); - }); - it("should return 400 if closeButtonAction is invalid", async () => { - req.body = popup().invalidCloseButtonAction().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for popupSize or closeButtonAction" }], - }); - }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.body = popup().invalidHeaderBackgroundColor().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { msg: "headerBackgroundColor must be a valid hex color code" }, - ], - }); - }); - it("should return 400 if headerColor is invalid", async () => { - req.body = popup().invalidHeaderColor().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "headerColor must be a valid hex color code" }], - }); - }); - it("should return 400 if textColor is invalid", async () => { - req.body = popup().invalidTextColor().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "textColor must be a valid hex color code" }], - }); - }); - it("should return 400 if buttonBackgroundColor is invalid", async () => { - req.body = popup().invalidButtonBackgroundColor().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { msg: "buttonBackgroundColor must be a valid hex color code" }, - ], - }); - }); - it("should return 400 if buttonTextColor is invalid", async () => { - req.body = popup().invalidButtonTextColor().build(); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "buttonTextColor must be a valid hex color code" }], - }); - }); - it("should return 201 if popup is created", async () => { - req.body = popup().build(); - serviceMock.createPopup = sinon - .stub(popupService, "createPopup") - .resolves(popup().build()); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(201); - expect(body).to.be.deep.equal(popup().build()); - expect(serviceMock.createPopup.getCall(0).args[0]).to.be.deep.equal({ - ...req.body, - createdBy: req.user.id, - }); - }); - it("should return 500 if popup creation fails", async () => { - req.body = popup().build(); - serviceMock.createPopup = sinon - .stub(popupService, "createPopup") - .rejects(new Error("Internal server error")); - await popupController.addPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_POPUP_ERROR", - message: "Internal server error", - }); - }); - }); - describe("deletePopup", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if id is not provided", async () => { - req.params = {}; - await popupController.deletePopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 400 if id is invalid", async () => { - req.params = { id: "invalid" }; - await popupController.deletePopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid id" }], - }); - }); - it("should return 400 if popup is not found", async () => { - req.params = { id: "123" }; - serviceMock.deletePopup = sinon - .stub(popupService, "deletePopup") - .resolves(null); - await popupController.deletePopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Popup with the specified id does not exist" }], - }); - }); - it("should return 200 if popup is deleted", async () => { - req.params = { id: "123" }; - serviceMock.deletePopup = sinon - .stub(popupService, "deletePopup") - .resolves(popup().build()); - await popupController.deletePopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal({ - message: "Popup with ID 123 deleted successfully", - }); - expect(serviceMock.deletePopup.getCall(0).args[0]).to.be.equal("123"); - }); - it("should return 500 if popup deletion fails", async () => { - req.params = { id: "123" }; - serviceMock.deletePopup = sinon - .stub(popupService, "deletePopup") - .rejects(new Error("Internal server error")); - await popupController.deletePopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_POPUP_ERROR", - message: "Internal server error", - }); - }); - }); - describe("editPopup", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if popupSize is not provided", async () => { - req.params = { id: "123" }; - req.body = popup().missingPopupSize().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "popupSize and closeButtonAction are required" }], - }); - }); - it("should return 400 if closeButtonAction is not provided", async () => { - req.params = { id: "123" }; - req.body = popup().missingCloseButtonAction().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "popupSize and closeButtonAction are required" }], - }); - }); - it("should return 400 if popupSize is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidPopupSize().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for popupSize" }], - }); - }); - it("should return 400 if closeButtonAction is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidCloseButtonAction().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid value for closeButtonAction" }], - }); - }); - it("should return 400 if headerBackgroundColor is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidHeaderBackgroundColor().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { msg: "headerBackgroundColor must be a valid hex color code" }, - ], - }); - }); - it("should return 400 if headerColor is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidHeaderColor().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "headerColor must be a valid hex color code" }], - }); - }); - it("should return 400 if textColor is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidTextColor().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "textColor must be a valid hex color code" }], - }); - }); - it("should return 400 if buttonBackgroundColor is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidButtonBackgroundColor().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [ - { msg: "buttonBackgroundColor must be a valid hex color code" }, - ], - }); - }); - it("should return 400 if buttonTextColor is invalid", async () => { - req.params = { id: "123" }; - req.body = popup().invalidButtonTextColor().build(); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "buttonTextColor must be a valid hex color code" }], - }); - }); - it("should return 200 if popup is updated", async () => { - req.body = popup().build(); - req.params = { id: "123" }; - serviceMock.updatePopup = sinon - .stub(popupService, "updatePopup") - .resolves(popup().build()); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(popup().build()); - expect(serviceMock.updatePopup.getCall(0).args).to.be.deep.equal([ - "123", - req.body, - ]); - }); - it("should return 500 if popup update fails", async () => { - req.body = popup().build(); - req.params = { id: "123" }; - serviceMock.updatePopup = sinon - .stub(popupService, "updatePopup") - .rejects(new Error("Internal server error")); - await popupController.editPopup(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "EDIT_POPUP_ERROR", - message: "Internal server error", - }); - }); - }); - describe("getAllPopups", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 if popups are found", async () => { - serviceMock.getAllPopups = sinon - .stub(popupService, "getAllPopups") - .resolves(popupList); - await popupController.getAllPopups(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(popupList); - }); - it("should return 500 if popups retrieval fails", async () => { - serviceMock.getAllPopups = sinon - .stub(popupService, "getAllPopups") - .rejects(new Error("Internal server error")); - await popupController.getAllPopups(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_ALL_POPUPS_ERROR", - message: "Internal server error", - }); - }); - }); - describe("getPopups", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 if popups are found", async () => { - serviceMock.getPopups = sinon - .stub(popupService, "getPopups") - .resolves(popupList); - await popupController.getPopups(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(popupList); - }); - it("should return 500 if popups retrieval fails", async () => { - serviceMock.getPopups = sinon - .stub(popupService, "getPopups") - .rejects(new Error("Internal server error")); - await popupController.getPopups(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_POPUPS_ERROR", - message: "Internal server error", - }); - }); - }); - describe("getPopupById", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if id is not provided", async () => { - req.params = {}; - await popupController.getPopupById(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid popup ID" }], - }); - }); - it("should return 400 if id is invalid", async () => { - req.params = { id: "invalid" }; - await popupController.getPopupById(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(400); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Invalid popup ID" }], - }); - }); - it("should return 404 if popup is not found", async () => { - req.params = { id: "123" }; - serviceMock.getPopupById = sinon - .stub(popupService, "getPopupById") - .resolves(null); - await popupController.getPopupById(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(404); - expect(body).to.be.deep.equal({ - errors: [{ msg: "Popup not found" }], - }); - }); - it("should return 200 if popup is found", async () => { - req.params = { id: "123" }; - serviceMock.getPopupById = sinon - .stub(popupService, "getPopupById") - .resolves(popup().build()); - await popupController.getPopupById(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(200); - expect(body).to.be.deep.equal(popup().build()); - }); - it("should return 500 if popup retrieval fails", async () => { - req.params = { id: "123" }; - serviceMock.getPopupById = sinon - .stub(popupService, "getPopupById") - .rejects(new Error("Internal server error")); - await popupController.getPopupById(req, res); - const status = res.status.getCall(0).args[0]; - const body = res.json.getCall(0).args[0]; - expect(status).to.be.equal(500); - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_POPUP_BY_ID_ERROR", - message: "Internal server error", - }); +describe("Test popup controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + describe("addPopup", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if popupSize is not provided", async () => { + req.body = popup().missingPopupSize().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "popupSize and closeButtonAction are required" }], + }); + }); + it("should return 400 if closeButtonAction is not provided", async () => { + req.body = popup().missingCloseButtonAction().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "popupSize and closeButtonAction are required" }], + }); + }); + it("should return 400 if popupSize is invalid", async () => { + req.body = popup().invalidPopupSize().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for popupSize or closeButtonAction" }], + }); + }); + it("should return 400 if closeButtonAction is invalid", async () => { + req.body = popup().invalidCloseButtonAction().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for popupSize or closeButtonAction" }], + }); + }); + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.body = popup().invalidHeaderBackgroundColor().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { msg: "headerBackgroundColor must be a valid hex color code" }, + ], + }); + }); + it("should return 400 if headerColor is invalid", async () => { + req.body = popup().invalidHeaderColor().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "headerColor must be a valid hex color code" }], + }); + }); + it("should return 400 if textColor is invalid", async () => { + req.body = popup().invalidTextColor().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "textColor must be a valid hex color code" }], + }); + }); + it("should return 400 if buttonBackgroundColor is invalid", async () => { + req.body = popup().invalidButtonBackgroundColor().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { msg: "buttonBackgroundColor must be a valid hex color code" }, + ], + }); + }); + it("should return 400 if buttonTextColor is invalid", async () => { + req.body = popup().invalidButtonTextColor().build(); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "buttonTextColor must be a valid hex color code" }], + }); + }); + it("should return 201 if popup is created", async () => { + req.body = popup().build(); + serviceMock.createPopup = sinon + .stub(popupService, "createPopup") + .resolves(popup().build()); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(201); + expect(body).to.be.deep.equal(popup().build()); + expect(serviceMock.createPopup.getCall(0).args[0]).to.be.deep.equal({ + ...req.body, + createdBy: req.user.id, + }); + }); + it("should return 500 if popup creation fails", async () => { + req.body = popup().build(); + serviceMock.createPopup = sinon + .stub(popupService, "createPopup") + .rejects(new Error("Internal server error")); + await popupController.addPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_POPUP_ERROR", + message: "Internal server error", + }); + }); + }); + describe("deletePopup", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if id is not provided", async () => { + req.params = {}; + await popupController.deletePopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 400 if id is invalid", async () => { + req.params = { id: "invalid" }; + await popupController.deletePopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid id" }], + }); + }); + it("should return 400 if popup is not found", async () => { + req.params = { id: "123" }; + serviceMock.deletePopup = sinon + .stub(popupService, "deletePopup") + .resolves(null); + await popupController.deletePopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Popup with the specified id does not exist" }], + }); + }); + it("should return 200 if popup is deleted", async () => { + req.params = { id: "123" }; + serviceMock.deletePopup = sinon + .stub(popupService, "deletePopup") + .resolves(popup().build()); + await popupController.deletePopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal({ + message: "Popup with ID 123 deleted successfully", + }); + expect(serviceMock.deletePopup.getCall(0).args[0]).to.be.equal("123"); + }); + it("should return 500 if popup deletion fails", async () => { + req.params = { id: "123" }; + serviceMock.deletePopup = sinon + .stub(popupService, "deletePopup") + .rejects(new Error("Internal server error")); + await popupController.deletePopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_POPUP_ERROR", + message: "Internal server error", + }); + }); + }); + describe("editPopup", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if popupSize is not provided", async () => { + req.params = { id: "123" }; + req.body = popup().missingPopupSize().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "popupSize and closeButtonAction are required" }], + }); + }); + it("should return 400 if closeButtonAction is not provided", async () => { + req.params = { id: "123" }; + req.body = popup().missingCloseButtonAction().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "popupSize and closeButtonAction are required" }], + }); + }); + it("should return 400 if popupSize is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidPopupSize().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for popupSize" }], + }); + }); + it("should return 400 if closeButtonAction is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidCloseButtonAction().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid value for closeButtonAction" }], + }); + }); + it("should return 400 if headerBackgroundColor is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidHeaderBackgroundColor().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { msg: "headerBackgroundColor must be a valid hex color code" }, + ], + }); + }); + it("should return 400 if headerColor is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidHeaderColor().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "headerColor must be a valid hex color code" }], + }); + }); + it("should return 400 if textColor is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidTextColor().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "textColor must be a valid hex color code" }], + }); + }); + it("should return 400 if buttonBackgroundColor is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidButtonBackgroundColor().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [ + { msg: "buttonBackgroundColor must be a valid hex color code" }, + ], + }); + }); + it("should return 400 if buttonTextColor is invalid", async () => { + req.params = { id: "123" }; + req.body = popup().invalidButtonTextColor().build(); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "buttonTextColor must be a valid hex color code" }], + }); + }); + it("should return 200 if popup is updated", async () => { + req.body = popup().build(); + req.params = { id: "123" }; + serviceMock.updatePopup = sinon + .stub(popupService, "updatePopup") + .resolves(popup().build()); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(popup().build()); + expect(serviceMock.updatePopup.getCall(0).args).to.be.deep.equal([ + "123", + req.body, + ]); + }); + it("should return 500 if popup update fails", async () => { + req.body = popup().build(); + req.params = { id: "123" }; + serviceMock.updatePopup = sinon + .stub(popupService, "updatePopup") + .rejects(new Error("Internal server error")); + await popupController.editPopup(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "EDIT_POPUP_ERROR", + message: "Internal server error", + }); + }); + }); + describe("getAllPopups", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if popups are found", async () => { + serviceMock.getAllPopups = sinon + .stub(popupService, "getAllPopups") + .resolves(popupList); + await popupController.getAllPopups(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(popupList); + }); + it("should return 500 if popups retrieval fails", async () => { + serviceMock.getAllPopups = sinon + .stub(popupService, "getAllPopups") + .rejects(new Error("Internal server error")); + await popupController.getAllPopups(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_ALL_POPUPS_ERROR", + message: "Internal server error", + }); + }); + }); + describe("getPopups", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if popups are found", async () => { + serviceMock.getPopups = sinon + .stub(popupService, "getPopups") + .resolves(popupList); + await popupController.getPopups(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(popupList); + }); + it("should return 500 if popups retrieval fails", async () => { + serviceMock.getPopups = sinon + .stub(popupService, "getPopups") + .rejects(new Error("Internal server error")); + await popupController.getPopups(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_POPUPS_ERROR", + message: "Internal server error", + }); + }); + }); + describe("getPopupById", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 400 if id is not provided", async () => { + req.params = {}; + await popupController.getPopupById(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid popup ID" }], + }); + }); + it("should return 400 if id is invalid", async () => { + req.params = { id: "invalid" }; + await popupController.getPopupById(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(400); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Invalid popup ID" }], + }); + }); + it("should return 404 if popup is not found", async () => { + req.params = { id: "123" }; + serviceMock.getPopupById = sinon + .stub(popupService, "getPopupById") + .resolves(null); + await popupController.getPopupById(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(404); + expect(body).to.be.deep.equal({ + errors: [{ msg: "Popup not found" }], + }); + }); + it("should return 200 if popup is found", async () => { + req.params = { id: "123" }; + serviceMock.getPopupById = sinon + .stub(popupService, "getPopupById") + .resolves(popup().build()); + await popupController.getPopupById(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(200); + expect(body).to.be.deep.equal(popup().build()); + }); + it("should return 500 if popup retrieval fails", async () => { + req.params = { id: "123" }; + serviceMock.getPopupById = sinon + .stub(popupService, "getPopupById") + .rejects(new Error("Internal server error")); + await popupController.getPopupById(req, res); + const status = res.status.getCall(0).args[0]; + const body = res.json.getCall(0).args[0]; + expect(status).to.be.equal(500); + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_POPUP_BY_ID_ERROR", + message: "Internal server error", }); }); }); -})(); +}); diff --git a/backend/src/test/unit/controllers/team.test.js b/backend/src/test/unit/controllers/team.test.js index ebba1e3d..314d0936 100644 --- a/backend/src/test/unit/controllers/team.test.js +++ b/backend/src/test/unit/controllers/team.test.js @@ -1,255 +1,253 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const { expect } = await import("chai"); - const sinon = await import("sinon"); - const controller = require("../../../controllers/team.controller.js"); - const userMocks = require("../../mocks/user.mock.js"); - const db = require("../../../models/index.js"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const { expect } = require("chai"); +const sinon = require("sinon"); +const controller = require("../../../controllers/team.controller.js"); +const userMocks = require("../../mocks/user.mock.js"); +const db = require("../../../models/index.js"); - const Team = db.Team; - const service = controller.teamService; +const Team = db.Team; +const service = controller.teamService; - describe("Unit test team controller", () => { - const req = {}; - const res = {}; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); +describe("Unit test team controller", () => { + const req = {}; + const res = {}; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); - it("setOrganisation - should return status 400 if no name is passed", async () => { - req.body = {}; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Organisation name is required and should be a non-empty string", - }); - }); - it("setOrganisation - should return status 400 if name is invalid", async () => { - req.body = { - name: 12, - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Organisation name is required and should be a non-empty string", - }); - }); - it("setOrganisation - should return status 400 if name is bigger than 100 characters", async () => { - req.body = { - name: "a".repeat(101), - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Organisation name cannot exceed 100 characters", - }); - }); - it("setOrganisation - should return status 400 if name has invalid characters", async () => { - req.body = { - name: "a$", - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Organisation name contains invalid characters", - }); - }); - it("setOrganisation - should return status 400 if a team is already created", async () => { - sinon.stub(Team, "count").returns(1); - req.body = { - name: "Test", - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(400); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Cannot create more than one team.", - }); - }); - it("setOrganisation - should return status 201 and the created team if everything goes right", async () => { - sinon.stub(Team, "count").returns(0); - sinon.stub(service, "createTeam").returns({ + it("setOrganisation - should return status 400 if no name is passed", async () => { + req.body = {}; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Organisation name is required and should be a non-empty string", + }); + }); + it("setOrganisation - should return status 400 if name is invalid", async () => { + req.body = { + name: 12, + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Organisation name is required and should be a non-empty string", + }); + }); + it("setOrganisation - should return status 400 if name is bigger than 100 characters", async () => { + req.body = { + name: "a".repeat(101), + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Organisation name cannot exceed 100 characters", + }); + }); + it("setOrganisation - should return status 400 if name has invalid characters", async () => { + req.body = { + name: "a$", + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Organisation name contains invalid characters", + }); + }); + it("setOrganisation - should return status 400 if a team is already created", async () => { + sinon.stub(Team, "count").returns(1); + req.body = { + name: "Test", + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(400); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Cannot create more than one team.", + }); + }); + it("setOrganisation - should return status 201 and the created team if everything goes right", async () => { + sinon.stub(Team, "count").returns(0); + sinon.stub(service, "createTeam").returns({ + id: 1, + name: "Test", + createdAt: new Date(), + }); + req.body = { + name: "Test", + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(201); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + status: 201, + message: "Organisation created successfully", + data: { id: 1, name: "Test", - createdAt: new Date(), - }); - req.body = { - name: "Test", - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(201); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - status: 201, - message: "Organisation created successfully", - data: { - id: 1, - name: "Test", - createdAt: new Intl.DateTimeFormat("en-US").format(new Date()), - }, - }); - }); - it("setOrganisation - should return status 500 if something goes wrong", async () => { - sinon.stub(Team, "count").throws(); - req.body = { - name: "Test", - }; - await controller.setOrganisation(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_ORG_ERROR", - message: "Error", - }); - }); - it("getTeamCount - should return status 200 if everything goes right", async () => { - sinon.stub(service, "getTeamCount").returns({ teamExists: true }); - await controller.getTeamCount(req, res); - expect(res.status.args[0][0]).to.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - teamExists: true, - }); - }); - it("getTeamCount - should return status 500 if something goes wrong", async () => { - sinon.stub(Team, "count").throws(); - await controller.getTeamCount(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_TEAM_COUNT_ERROR", - message: "Failed to get team count", - }); - }); - it("getTeamDetails - should return status 500 if no team was created", async () => { - sinon.stub(service, "getTeam").returns(null); - await controller.getTeamDetails(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_TEAM_ERROR", - message: "Team data not found", - }); - }); - it("getTeamDetails - should return status 200 and the team and list of users if everything goes right", async () => { - sinon.stub(service, "getTeam").resolves({ - team: { - name: "Test", - }, - users: userMocks.validList, - }); - await controller.getTeamDetails(req, res); - expect(res.status.args[0][0]).to.equal(200); - const body = res.json.args[0][0]; - expect(body.name).to.equal("Test"); - expect(body.users).to.have.lengthOf(userMocks.validList.length); - expect(body.users).not.to.be.deep.equal(userMocks.validList); - }); - it("getTeamDetails - should return status 500 if something goes wrong", async () => { - sinon.stub(service, "getTeam").rejects(); - await controller.getTeamDetails(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_TEAM_ERROR", - message: "Error", - }); - }); - it("updateTeamDetails - should return status 200 if everything goes right", async () => { - req.body = { - name: "Test", - }; - sinon.stub(service, "updateTeam").resolves(); - await controller.updateTeamDetails(req, res); - expect(res.status.args[0][0]).to.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - message: "Team Details Updated Successfully", - }); - }); - it("updateTeamDetails - should return status 500 if something goes wrong", async () => { - req.body = { + createdAt: new Intl.DateTimeFormat("en-US").format(new Date()), + }, + }); + }); + it("setOrganisation - should return status 500 if something goes wrong", async () => { + sinon.stub(Team, "count").throws(); + req.body = { + name: "Test", + }; + await controller.setOrganisation(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_ORG_ERROR", + message: "Error", + }); + }); + it("getTeamCount - should return status 200 if everything goes right", async () => { + sinon.stub(service, "getTeamCount").returns({ teamExists: true }); + await controller.getTeamCount(req, res); + expect(res.status.args[0][0]).to.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + teamExists: true, + }); + }); + it("getTeamCount - should return status 500 if something goes wrong", async () => { + sinon.stub(Team, "count").throws(); + await controller.getTeamCount(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_TEAM_COUNT_ERROR", + message: "Failed to get team count", + }); + }); + it("getTeamDetails - should return status 500 if no team was created", async () => { + sinon.stub(service, "getTeam").returns(null); + await controller.getTeamDetails(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_TEAM_ERROR", + message: "Team data not found", + }); + }); + it("getTeamDetails - should return status 200 and the team and list of users if everything goes right", async () => { + sinon.stub(service, "getTeam").resolves({ + team: { name: "Test", - }; - sinon.stub(service, "updateTeam").rejects(); - await controller.updateTeamDetails(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "UPDATE_TEAM_ERROR", - message: "Error", - }); - }); - it("removeMember - should return status 200 if everything goes right", async () => { - req.params = { - memberId: 1, - }; - req.user = { - id: 1, - }; - sinon.stub(service, "removeUserFromTeam").resolves(); - await controller.removeMember(req, res); - expect(res.status.args[0][0]).to.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - message: "User Removed from Team Successfully", - }); - }); - it("removeMember - should return status 500 if something goes wrong", async () => { - req.params = { - memberId: 1, - }; - req.user = { - id: 1, - }; - sinon.stub(service, "removeUserFromTeam").rejects(); - await controller.removeMember(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "REMOVE_USER_ERROR", - message: "Error", - }); - }); - it("changeRole - should return status 200 if everything goes right", async () => { - req.body = { - userId: 1, - role: "member", - }; - sinon.stub(service, "updateUserRole").resolves(); - await controller.changeRole(req, res); - expect(res.status.args[0][0]).to.equal(200); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - message: "User Role Updated Successfully", - }); - }); - it("changeRole - should return status 500 if something goes wrong", async () => { - req.body = { - userId: 1, - role: "member", - }; - sinon.stub(service, "updateUserRole").rejects(); - await controller.changeRole(req, res); - expect(res.status.args[0][0]).to.equal(500); - const body = res.json.args[0][0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CHANGE_ROLE_ERROR", - message: "Error", - }); - }); - }); -})(); + }, + users: userMocks.validList, + }); + await controller.getTeamDetails(req, res); + expect(res.status.args[0][0]).to.equal(200); + const body = res.json.args[0][0]; + expect(body.name).to.equal("Test"); + expect(body.users).to.have.lengthOf(userMocks.validList.length); + expect(body.users).not.to.be.deep.equal(userMocks.validList); + }); + it("getTeamDetails - should return status 500 if something goes wrong", async () => { + sinon.stub(service, "getTeam").rejects(); + await controller.getTeamDetails(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_TEAM_ERROR", + message: "Error", + }); + }); + it("updateTeamDetails - should return status 200 if everything goes right", async () => { + req.body = { + name: "Test", + }; + sinon.stub(service, "updateTeam").resolves(); + await controller.updateTeamDetails(req, res); + expect(res.status.args[0][0]).to.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + message: "Team Details Updated Successfully", + }); + }); + it("updateTeamDetails - should return status 500 if something goes wrong", async () => { + req.body = { + name: "Test", + }; + sinon.stub(service, "updateTeam").rejects(); + await controller.updateTeamDetails(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "UPDATE_TEAM_ERROR", + message: "Error", + }); + }); + it("removeMember - should return status 200 if everything goes right", async () => { + req.params = { + memberId: 1, + }; + req.user = { + id: 1, + }; + sinon.stub(service, "removeUserFromTeam").resolves(); + await controller.removeMember(req, res); + expect(res.status.args[0][0]).to.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + message: "User Removed from Team Successfully", + }); + }); + it("removeMember - should return status 500 if something goes wrong", async () => { + req.params = { + memberId: 1, + }; + req.user = { + id: 1, + }; + sinon.stub(service, "removeUserFromTeam").rejects(); + await controller.removeMember(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "REMOVE_USER_ERROR", + message: "Error", + }); + }); + it("changeRole - should return status 200 if everything goes right", async () => { + req.body = { + userId: 1, + role: "member", + }; + sinon.stub(service, "updateUserRole").resolves(); + await controller.changeRole(req, res); + expect(res.status.args[0][0]).to.equal(200); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + message: "User Role Updated Successfully", + }); + }); + it("changeRole - should return status 500 if something goes wrong", async () => { + req.body = { + userId: 1, + role: "member", + }; + sinon.stub(service, "updateUserRole").rejects(); + await controller.changeRole(req, res); + expect(res.status.args[0][0]).to.equal(500); + const body = res.json.args[0][0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CHANGE_ROLE_ERROR", + message: "Error", + }); + }); +}); diff --git a/backend/src/test/unit/controllers/tour.test.js b/backend/src/test/unit/controllers/tour.test.js index 0fb603c0..7dcac4b6 100644 --- a/backend/src/test/unit/controllers/tour.test.js +++ b/backend/src/test/unit/controllers/tour.test.js @@ -1,344 +1,342 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const mocks = require("../../mocks/tour.mock.js"); - const tourService = require("../../../service/tour.service.js"); - const tourController = require("../../../controllers/tour.controller.js"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const mocks = require("../../mocks/tour.mock.js"); +const tourService = require("../../../service/tour.service.js"); +const tourController = require("../../../controllers/tour.controller.js"); - const tour = mocks.TourBuilder.tour; +const tour = mocks.TourBuilder.tour; - describe("Test tour controller", () => { - const serviceMock = {}; - const req = {}; - const res = {}; - describe("addTour", () => { - beforeEach(() => { - req.user = { id: "123" }; - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 400 if title is not provided", async () => { - req.body = tour().missingTitle().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "title, pageTargeting, theme, and triggeringFrequency are required", - }, - ], - }); - }); - it("should return 400 if pageTargeting is not provided", async () => { - req.body = tour().missingPageTargeting().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "title, pageTargeting, theme, and triggeringFrequency are required", - }, - ], - }); - }); - it("should return 400 if theme is not provided", async () => { - req.body = tour().missingTheme().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "title, pageTargeting, theme, and triggeringFrequency are required", - }, - ], - }); - }); - it("should return 400 if triggeringFrequency is not provided", async () => { - req.body = tour().missingTriggeringFrequency().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "title, pageTargeting, theme, and triggeringFrequency are required", - }, - ], - }); - }); - it("should return 400 if pageTargeting is invalid", async () => { - req.body = tour().invalidPageTargeting().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", - }, - ], - }); - }); - it("should return 400 if theme is invalid", async () => { - req.body = tour().invalidTheme().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", - }, - ], - }); - }); - it("should return 400 if triggeringFrequency is invalid", async () => { - req.body = tour().invalidTriggeringFrequency().build(); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(400); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - errors: [ - { - msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", - }, - ], - }); - }); - it("should return 201 if all required fields are provided", async () => { - req.body = tour().build(); - serviceMock.createTour = sinon - .stub(tourService, "createTour") - .resolves(tour().build()); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(201); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal(tour().build()); - }); - it("should return 500 if an error occurs", async () => { - req.body = tour().build(); - serviceMock.createTour = sinon - .stub(tourService, "createTour") - .rejects(new Error("error")); - await tourController.addTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "CREATE_TOUR_ERROR", - message: "error", - }); - }); +describe("Test tour controller", () => { + const serviceMock = {}; + const req = {}; + const res = {}; + describe("addTour", () => { + beforeEach(() => { + req.user = { id: "123" }; + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - describe("deleteTour", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 404 if tour is not found", async () => { - req.params = { id: "123" }; - serviceMock.deleteTour = sinon - .stub(tourService, "deleteTour") - .resolves(null); - await tourController.deleteTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(404); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ msg: "Tour not found" }); - }); - it("should return 200 if tour is found", async () => { - req.params = { id: "123" }; - serviceMock.deleteTour = sinon - .stub(tourService, "deleteTour") - .resolves(tour().build()); - await tourController.deleteTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(200); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ msg: "Tour deleted successfully" }); - }); - it("should return 500 if an error occurs", async () => { - req.params = { id: "123" }; - serviceMock.deleteTour = sinon - .stub(tourService, "deleteTour") - .rejects(new Error("error")); - await tourController.deleteTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_TOUR_ERROR", - message: "error", - }); + afterEach(sinon.restore); + it("should return 400 if title is not provided", async () => { + req.body = tour().missingTitle().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "title, pageTargeting, theme, and triggeringFrequency are required", + }, + ], }); }); - describe("editTour", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("should return 200 if all required fields are provided", async () => { - req.body = tour().build(); - serviceMock.updateTour = sinon - .stub(tourService, "updateTour") - .resolves(tour().build()); - await tourController.editTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(200); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal(tour().build()); + it("should return 400 if pageTargeting is not provided", async () => { + req.body = tour().missingPageTargeting().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "title, pageTargeting, theme, and triggeringFrequency are required", + }, + ], }); - it("should return 404 if tour is not found", async () => { - req.body = tour().build(); - serviceMock.updateTour = sinon - .stub(tourService, "updateTour") - .resolves(null); - await tourController.editTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(404); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ msg: "Tour not found" }); - }); - it("should return 500 if an error occurs", async () => { - req.body = tour().build(); - serviceMock.updateTour = sinon - .stub(tourService, "updateTour") - .rejects(new Error("error")); - await tourController.editTour(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "EDIT_TOUR_ERROR", - message: "error", - }); + }); + it("should return 400 if theme is not provided", async () => { + req.body = tour().missingTheme().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "title, pageTargeting, theme, and triggeringFrequency are required", + }, + ], }); }); - describe("getAllTours", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + it("should return 400 if triggeringFrequency is not provided", async () => { + req.body = tour().missingTriggeringFrequency().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "title, pageTargeting, theme, and triggeringFrequency are required", + }, + ], }); - afterEach(sinon.restore); - it("should return 200 if tours are found", async () => { - serviceMock.getAllTours = sinon - .stub(tourService, "getAllTours") - .resolves(mocks.toursList); - await tourController.getAllTours(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(200); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal(mocks.toursList); + }); + it("should return 400 if pageTargeting is invalid", async () => { + req.body = tour().invalidPageTargeting().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", + }, + ], }); - it("should return 500 if an error occurs", async () => { - serviceMock.getAllTours = sinon - .stub(tourService, "getAllTours") - .rejects(new Error("error")); - await tourController.getAllTours(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_TOURS_ERROR", - message: "error", - }); + }); + it("should return 400 if theme is invalid", async () => { + req.body = tour().invalidTheme().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", + }, + ], }); }); - describe("getTours", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + it("should return 400 if triggeringFrequency is invalid", async () => { + req.body = tour().invalidTriggeringFrequency().build(); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(400); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + errors: [ + { + msg: "Invalid value for pageTargeting, theme, or triggeringFrequency", + }, + ], }); - afterEach(sinon.restore); - it("should return 200 if tours are found", async () => { - req.user = { id: "123" }; - serviceMock.getTours = sinon - .stub(tourService, "getTours") - .resolves(mocks.toursList); - await tourController.getTours(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(200); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal(mocks.toursList); + }); + it("should return 201 if all required fields are provided", async () => { + req.body = tour().build(); + serviceMock.createTour = sinon + .stub(tourService, "createTour") + .resolves(tour().build()); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(201); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal(tour().build()); + }); + it("should return 500 if an error occurs", async () => { + req.body = tour().build(); + serviceMock.createTour = sinon + .stub(tourService, "createTour") + .rejects(new Error("error")); + await tourController.addTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "CREATE_TOUR_ERROR", + message: "error", }); - it("should return 500 if an error occurs", async () => { - req.user = { id: "123" }; - serviceMock.getTours = sinon - .stub(tourService, "getTours") - .rejects(new Error("error")); - await tourController.getTours(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_USER_TOURS_ERROR", - message: "error", - }); + }); + }); + describe("deleteTour", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 404 if tour is not found", async () => { + req.params = { id: "123" }; + serviceMock.deleteTour = sinon + .stub(tourService, "deleteTour") + .resolves(null); + await tourController.deleteTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(404); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ msg: "Tour not found" }); + }); + it("should return 200 if tour is found", async () => { + req.params = { id: "123" }; + serviceMock.deleteTour = sinon + .stub(tourService, "deleteTour") + .resolves(tour().build()); + await tourController.deleteTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(200); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ msg: "Tour deleted successfully" }); + }); + it("should return 500 if an error occurs", async () => { + req.params = { id: "123" }; + serviceMock.deleteTour = sinon + .stub(tourService, "deleteTour") + .rejects(new Error("error")); + await tourController.deleteTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_TOUR_ERROR", + message: "error", }); }); - describe("getTourById", () => { - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); + }); + describe("editTour", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if all required fields are provided", async () => { + req.body = tour().build(); + serviceMock.updateTour = sinon + .stub(tourService, "updateTour") + .resolves(tour().build()); + await tourController.editTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(200); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal(tour().build()); + }); + it("should return 404 if tour is not found", async () => { + req.body = tour().build(); + serviceMock.updateTour = sinon + .stub(tourService, "updateTour") + .resolves(null); + await tourController.editTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(404); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ msg: "Tour not found" }); + }); + it("should return 500 if an error occurs", async () => { + req.body = tour().build(); + serviceMock.updateTour = sinon + .stub(tourService, "updateTour") + .rejects(new Error("error")); + await tourController.editTour(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "EDIT_TOUR_ERROR", + message: "error", }); - afterEach(sinon.restore); - it("should return 404 if tour is not found", async () => { - req.params = { id: "123" }; - serviceMock.getTourById = sinon - .stub(tourService, "getTourById") - .resolves(null); - await tourController.getTourById(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(404); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ msg: "Tour not found" }); + }); + }); + describe("getAllTours", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if tours are found", async () => { + serviceMock.getAllTours = sinon + .stub(tourService, "getAllTours") + .resolves(mocks.toursList); + await tourController.getAllTours(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(200); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal(mocks.toursList); + }); + it("should return 500 if an error occurs", async () => { + serviceMock.getAllTours = sinon + .stub(tourService, "getAllTours") + .rejects(new Error("error")); + await tourController.getAllTours(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_TOURS_ERROR", + message: "error", }); - it("should return 200 if tour is found", async () => { - req.params = { id: "123" }; - serviceMock.getTourById = sinon - .stub(tourService, "getTourById") - .resolves(tour().build()); - await tourController.getTourById(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(200); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal(tour().build()); + }); + }); + describe("getTours", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 200 if tours are found", async () => { + req.user = { id: "123" }; + serviceMock.getTours = sinon + .stub(tourService, "getTours") + .resolves(mocks.toursList); + await tourController.getTours(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(200); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal(mocks.toursList); + }); + it("should return 500 if an error occurs", async () => { + req.user = { id: "123" }; + serviceMock.getTours = sinon + .stub(tourService, "getTours") + .rejects(new Error("error")); + await tourController.getTours(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_USER_TOURS_ERROR", + message: "error", }); - it("should return 500 if an error occurs", async () => { - req.params = { id: "123" }; - serviceMock.getTourById = sinon - .stub(tourService, "getTourById") - .rejects(new Error("error")); - await tourController.getTourById(req, res); - const status = res.status.getCall(0).args[0]; - expect(status).to.be.equal(500); - const body = res.json.getCall(0).args[0]; - expect(body).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_TOUR_BY_ID_ERROR", - message: "error", - }); + }); + }); + describe("getTourById", () => { + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("should return 404 if tour is not found", async () => { + req.params = { id: "123" }; + serviceMock.getTourById = sinon + .stub(tourService, "getTourById") + .resolves(null); + await tourController.getTourById(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(404); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ msg: "Tour not found" }); + }); + it("should return 200 if tour is found", async () => { + req.params = { id: "123" }; + serviceMock.getTourById = sinon + .stub(tourService, "getTourById") + .resolves(tour().build()); + await tourController.getTourById(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(200); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal(tour().build()); + }); + it("should return 500 if an error occurs", async () => { + req.params = { id: "123" }; + serviceMock.getTourById = sinon + .stub(tourService, "getTourById") + .rejects(new Error("error")); + await tourController.getTourById(req, res); + const status = res.status.getCall(0).args[0]; + expect(status).to.be.equal(500); + const body = res.json.getCall(0).args[0]; + expect(body).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_TOUR_BY_ID_ERROR", + message: "error", }); }); }); -})(); +}); diff --git a/backend/src/test/unit/controllers/user.test.js b/backend/src/test/unit/controllers/user.test.js index 738c5fb8..dca60713 100644 --- a/backend/src/test/unit/controllers/user.test.js +++ b/backend/src/test/unit/controllers/user.test.js @@ -1,175 +1,170 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const { expect } = await import("chai"); - const sinon = await import("sinon"); - const { userService } = require("../../../controllers/user.controller.js"); - const controller = require("../../../controllers/user.controller.js"); - const mocks = require("../../mocks/user.mock.js"); - const settings = require("../../../../config/settings.js"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const { expect } = require("chai"); +const sinon = require("sinon"); +const { userService } = require("../../../controllers/user.controller.js"); +const controller = require("../../../controllers/user.controller.js"); +const mocks = require("../../mocks/user.mock.js"); +const settings = require("../../../../config/settings.js"); - describe("Unit test user controller", () => { - const req = {}; - const res = {}; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); +describe("Unit test user controller", () => { + const req = {}; + const res = {}; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); + }); + afterEach(sinon.restore); + it("getUsersList - if everything goes right, should return a list of users with pagination and status code 200", async () => { + const users = sinon + .stub(userService, "getUsers") + .resolves({ rows: mocks.validList.slice(0, 2), count: 5 }); + req.query = { page: 1, limit: 2, search: "Jane" }; + await controller.getUsersList(req, res); + expect(users.calledWith({ page: 1, limit: 2, search: "Jane" })).to.be.true; + expect(res.status.args[0][0]).to.be.equal(200); + expect(res.json.args[0][0]).to.be.deep.equal({ + users: mocks.validList.slice(0, 2).map((user) => ({ + name: user.name, + surname: user.surname, + email: user.email, + role: settings.user.roleName[user.role], + })), + totalPages: 3, + currentPage: 1, + totalUsers: 5, }); - afterEach(sinon.restore); - it("getUsersList - if everything goes right, should return a list of users with pagination and status code 200", async () => { - const users = sinon - .stub(userService, "getUsers") - .resolves({ rows: mocks.validList.slice(0, 2), count: 5 }); - req.query = { page: 1, limit: 2, search: "Jane" }; - await controller.getUsersList(req, res); - expect(users.calledWith({ page: 1, limit: 2, search: "Jane" })).to.be - .true; - expect(res.status.args[0][0]).to.be.equal(200); - expect(res.json.args[0][0]).to.be.deep.equal({ - users: mocks.validList.slice(0, 2).map((user) => ({ - name: user.name, - surname: user.surname, - email: user.email, - role: settings.user.roleName[user.role], - })), - totalPages: 3, - currentPage: 1, - totalUsers: 5, - }); + }); + it("getUsersList - if something goes wrong, should return status code 500 and the title error code GET_USER_LIST_ERROR", async () => { + sinon.stub(userService, "getUsers").rejects(); + req.query = { page: 1, limit: 2, search: "Jane" }; + await controller.getUsersList(req, res); + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + message: "Error", + errorCode: "GET_USER_LIST_ERROR", }); - it("getUsersList - if something goes wrong, should return status code 500 and the title error code GET_USER_LIST_ERROR", async () => { - sinon.stub(userService, "getUsers").rejects(); - req.query = { page: 1, limit: 2, search: "Jane" }; - await controller.getUsersList(req, res); - expect(res.status.args[0][0]).to.be.equal(500); - expect(res.json.args[0][0]).to.be.deep.equal({ - error: "Internal Server Error", - message: "Error", - errorCode: "GET_USER_LIST_ERROR", - }); + }); + it("getCurrentUser - if everything goes right, should return the user without the password", async () => { + const users = sinon.stub(userService, "getUser").resolves(mocks.validUser); + req.user = mocks.validUser; + await controller.getCurrentUser(req, res); + expect(users.calledWith(1)).to.be.true; + expect(res.status.args[0][0]).to.be.equal(200); + expect(res.json.args[0][0]).not.to.be.deep.equal(mocks.validUser); + expect(res.json.args[0][0]).not.to.have.property("password"); + }); + it("getCurrentUser - if the user is not found, should return status code 400 and the error 'User not found'", async () => { + const users = sinon.stub(userService, "getUser").resolves(null); + req.user = mocks.validUser; + await controller.getCurrentUser(req, res); + expect(users.calledWith(1)).to.be.true; + expect(res.status.args[0][0]).to.be.equal(400); + expect(res.json.args[0][0]).to.be.deep.equal({ error: "User not found" }); + }); + it("getCurrentUser - if something goes wrong, should return status code 500 and the title error code GET_USER_ERROR", async () => { + const users = sinon.stub(userService, "getUser").rejects(); + req.user = mocks.validUser; + await controller.getCurrentUser(req, res); + expect(users.calledWith(1)).to.be.true; + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "GET_USER_ERROR", + message: "Error", }); - it("getCurrentUser - if everything goes right, should return the user without the password", async () => { - const users = sinon - .stub(userService, "getUser") - .resolves(mocks.validUser); - req.user = mocks.validUser; - await controller.getCurrentUser(req, res); - expect(users.calledWith(1)).to.be.true; - expect(res.status.args[0][0]).to.be.equal(200); - expect(res.json.args[0][0]).not.to.be.deep.equal(mocks.validUser); - expect(res.json.args[0][0]).not.to.have.property("password"); + }); + it("updateUserDetails - if everything goes right, should return the updated user without the password", async () => { + const users = sinon + .stub(userService, "updateUser") + .resolves(mocks.validUser); + req.user = mocks.validUser; + req.body = { + name: "Joana", + surname: "D'ark", + }; + await controller.updateUserDetails(req, res); + expect(users.args[0]).to.be.deep.equal([ + 1, + { name: "Joana", surname: "D'ark" }, + ]); + expect(res.status.args[0][0]).to.be.equal(200); + expect(res.json.args[0][0]).to.be.deep.equal({ + updated: true, + user: { + name: "Jane", + surname: "Doe", + }, }); - it("getCurrentUser - if the user is not found, should return status code 400 and the error 'User not found'", async () => { - const users = sinon.stub(userService, "getUser").resolves(null); - req.user = mocks.validUser; - await controller.getCurrentUser(req, res); - expect(users.calledWith(1)).to.be.true; - expect(res.status.args[0][0]).to.be.equal(400); - expect(res.json.args[0][0]).to.be.deep.equal({ error: "User not found" }); + }); + it("updateUserDetails - if something goes wrong, should return status code 500 and the title error code UPDATE_USER_ERROR", async () => { + const users = sinon.stub(userService, "updateUser").rejects(); + req.user = mocks.validUser; + req.body = { + name: "Joana", + surname: "D'ark", + }; + await controller.updateUserDetails(req, res); + expect(users.args[0]).to.be.deep.equal([ + 1, + { name: "Joana", surname: "D'ark" }, + ]); + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "UPDATE_USER_ERROR", + message: "Error", }); - it("getCurrentUser - if something goes wrong, should return status code 500 and the title error code GET_USER_ERROR", async () => { - const users = sinon.stub(userService, "getUser").rejects(); - req.user = mocks.validUser; - await controller.getCurrentUser(req, res); - expect(users.calledWith(1)).to.be.true; - expect(res.status.args[0][0]).to.be.equal(500); - expect(res.json.args[0][0]).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "GET_USER_ERROR", - message: "Error", - }); + }); + it("deleteUser - if everything goes right, should return the message 'User deleted successfully'", async () => { + const users = sinon.stub(userService, "deleteUser").resolves(); + req.user = mocks.validUser; + await controller.deleteUser(req, res); + expect(users.called).to.be.true; + expect(res.status.args[0][0]).to.be.equal(200); + expect(res.json.args[0][0]).to.be.deep.equal({ + message: "User deleted successfully", }); - it("updateUserDetails - if everything goes right, should return the updated user without the password", async () => { - const users = sinon - .stub(userService, "updateUser") - .resolves(mocks.validUser); - req.user = mocks.validUser; - req.body = { - name: "Joana", - surname: "D'ark", - }; - await controller.updateUserDetails(req, res); - expect(users.args[0]).to.be.deep.equal([ - 1, - { name: "Joana", surname: "D'ark" }, - ]); - expect(res.status.args[0][0]).to.be.equal(200); - expect(res.json.args[0][0]).to.be.deep.equal({ - updated: true, - user: { - name: "Jane", - surname: "Doe", - }, - }); + }); + it("deleteUser - if something goes wrong, should return status code 500 and the title error code DELETE_USER_ERROR", async () => { + const users = sinon.stub(userService, "deleteUser").rejects(); + req.user = mocks.validUser; + await controller.deleteUser(req, res); + expect(users.called).to.be.true; + expect(res.status.args[0][0]).to.be.equal(500); + expect(res.json.args[0][0]).to.be.deep.equal({ + error: "Internal Server Error", + errorCode: "DELETE_USER_ERROR", + message: "Error", }); - it("updateUserDetails - if something goes wrong, should return status code 500 and the title error code UPDATE_USER_ERROR", async () => { - const users = sinon.stub(userService, "updateUser").rejects(); - req.user = mocks.validUser; - req.body = { - name: "Joana", - surname: "D'ark", - }; - await controller.updateUserDetails(req, res); - expect(users.args[0]).to.be.deep.equal([ - 1, - { name: "Joana", surname: "D'ark" }, - ]); - expect(res.status.args[0][0]).to.be.equal(500); - expect(res.json.args[0][0]).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "UPDATE_USER_ERROR", - message: "Error", - }); + }); + describe("test the user middlewares", () => { + let next; + beforeEach(() => { + res.status = sinon.stub().returns(res); + res.json = sinon.stub().returns(res); }); - it("deleteUser - if everything goes right, should return the message 'User deleted successfully'", async () => { - const users = sinon.stub(userService, "deleteUser").resolves(); + afterEach(sinon.restore); + it("checkAtLeastOneField - should return status 400 if all of 'name', 'surname' and 'picture' are empty", async () => { + next = sinon.stub(); req.user = mocks.validUser; - await controller.deleteUser(req, res); - expect(users.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(200); + req.body = {}; + await controller.checkAtLeastOneField(req, res); + expect(res.status.args[0][0]).to.be.equal(400); expect(res.json.args[0][0]).to.be.deep.equal({ - message: "User deleted successfully", + updated: false, + error: "Error, no value(s) provided to update", }); + expect(next.called).to.be.false; }); - it("deleteUser - if something goes wrong, should return status code 500 and the title error code DELETE_USER_ERROR", async () => { - const users = sinon.stub(userService, "deleteUser").rejects(); + it("checkAtLeastOneField - should move on if one of the fields is provided", async () => { + next = sinon.stub(); req.user = mocks.validUser; - await controller.deleteUser(req, res); - expect(users.called).to.be.true; - expect(res.status.args[0][0]).to.be.equal(500); - expect(res.json.args[0][0]).to.be.deep.equal({ - error: "Internal Server Error", - errorCode: "DELETE_USER_ERROR", - message: "Error", - }); - }); - describe("test the user middlewares", () => { - let next; - beforeEach(() => { - res.status = sinon.stub().returns(res); - res.json = sinon.stub().returns(res); - }); - afterEach(sinon.restore); - it("checkAtLeastOneField - should return status 400 if all of 'name', 'surname' and 'picture' are empty", async () => { - next = sinon.stub(); - req.user = mocks.validUser; - req.body = {}; - await controller.checkAtLeastOneField(req, res); - expect(res.status.args[0][0]).to.be.equal(400); - expect(res.json.args[0][0]).to.be.deep.equal({ - updated: false, - error: "Error, no value(s) provided to update", - }); - expect(next.called).to.be.false; - }); - it("checkAtLeastOneField - should move on if one of the fields is provided", async () => { - next = sinon.stub(); - req.user = mocks.validUser; - req.body = { name: "Jane" }; - await controller.checkAtLeastOneField(req, res, next); - expect(res.status.called).to.be.false; - expect(res.json.called).to.be.false; - expect(next.called).to.be.true; - }); + req.body = { name: "Jane" }; + await controller.checkAtLeastOneField(req, res, next); + expect(res.status.called).to.be.false; + expect(res.json.called).to.be.false; + expect(next.called).to.be.true; }); }); -})(); +}); diff --git a/backend/src/test/unit/services/banner.test.js b/backend/src/test/unit/services/banner.test.js index d740f963..9e80da15 100644 --- a/backend/src/test/unit/services/banner.test.js +++ b/backend/src/test/unit/services/banner.test.js @@ -1,109 +1,105 @@ -(async () => { - const { describe, it, afterEach } = await import("mocha"); - const { expect } = await import("chai"); - const sinon = await import("sinon"); - const db = require("../../../models/index.js"); - const service = require("../../../service/banner.service"); - const { BannerBuilder, validList } = require("../../mocks/banner.mock.js"); +const { describe, it, afterEach } = require("mocha"); +const { expect } = require("chai"); +const sinon = require("sinon"); +const db = require("../../../models/index.js"); +const service = require("../../../service/banner.service"); +const { BannerBuilder, validList } = require("../../mocks/banner.mock.js"); - const Banner = db.Banner; - const banner = BannerBuilder.banner; +const Banner = db.Banner; +const banner = BannerBuilder.banner; - describe("Test Banner service", () => { - const BannerMock = {}; - afterEach(sinon.restore); - it("getAllBanners - should return all the banners", async () => { - BannerMock.findAll = sinon.stub(Banner, "findAll").resolves(validList); - const result = await service.getAllBanners(); - expect(result).to.be.deep.equal(validList); - const params = BannerMock.findAll.args[0][0]; - expect(params).to.be.deep.equal({ - include: [{ model: db.User, as: "creator" }], - }); +describe("Test Banner service", () => { + const BannerMock = {}; + afterEach(sinon.restore); + it("getAllBanners - should return all the banners", async () => { + BannerMock.findAll = sinon.stub(Banner, "findAll").resolves(validList); + const result = await service.getAllBanners(); + expect(result).to.be.deep.equal(validList); + const params = BannerMock.findAll.args[0][0]; + expect(params).to.be.deep.equal({ + include: [{ model: db.User, as: "creator" }], }); - it("getBanners - should return the banners created by the userId", async () => { - BannerMock.findAll = sinon - .stub(Banner, "findAll") - .resolves(validList.filter((it) => it.createdBy === 2)); - const result = await service.getBanners(2); - expect(result).not.to.be.deep.equal(validList); - const params = BannerMock.findAll.args[0][0]; - expect(params).to.be.deep.equal({ - where: { - createdBy: 2, - }, - include: [{ model: db.User, as: "creator" }], - }); - }); - it("createBanner - should return the created banner", async () => { - BannerMock.create = sinon - .stub(Banner, "create") - .resolves(banner().build()); - const result = await service.createBanner({ bannerText: "hello world" }); - expect(result).to.be.deep.equal(banner().build()); - const params = BannerMock.create.args[0][0]; - expect(params).to.be.deep.equal({ bannerText: "hello world" }); - }); - it("deleteBanner - should return true if the banner is deleted", async () => { - BannerMock.destroy = sinon.stub(Banner, "destroy").resolves(1); - const result = await service.deleteBanner(1); - expect(result).to.be.true; - const params = BannerMock.destroy.args[0][0]; - expect(params).to.be.deep.equal({ where: { id: 1 } }); - }); - it("deleteBanner - should return false if the banner is not deleted", async () => { - BannerMock.destroy = sinon.stub(Banner, "destroy").resolves(0); - const result = await service.deleteBanner(1); - expect(result).to.be.false; - const params = BannerMock.destroy.args[0][0]; - expect(params).to.be.deep.equal({ where: { id: 1 } }); - }); - it("updateBanner - should return null if no banners are updated", async () => { - BannerMock.update = sinon.stub(Banner, "update").resolves([0, [null]]); - const data = { bannerText: "hello world" }; - const result = await service.updateBanner(1, data); - expect(result).to.be.null; - const params = BannerMock.update.args[0]; - expect(params).to.be.deep.equal([ - data, - { where: { id: 1 }, returning: true }, - ]); - }); - it("updateBanner - should return the updated banner", async () => { - BannerMock.update = sinon - .stub(Banner, "update") - .resolves([1, [banner().build()]]); - const data = { bannerText: "hello world" }; - const result = await service.updateBanner(1, data); - expect(result).to.be.deep.equal(banner().build()); - const params = BannerMock.update.args[0]; - expect(params).to.be.deep.equal([ - data, - { - where: { id: 1 }, - returning: true, - }, - ]); + }); + it("getBanners - should return the banners created by the userId", async () => { + BannerMock.findAll = sinon + .stub(Banner, "findAll") + .resolves(validList.filter((it) => it.createdBy === 2)); + const result = await service.getBanners(2); + expect(result).not.to.be.deep.equal(validList); + const params = BannerMock.findAll.args[0][0]; + expect(params).to.be.deep.equal({ + where: { + createdBy: 2, + }, + include: [{ model: db.User, as: "creator" }], }); - it("getBannerById - should return the found banner", async () => { - BannerMock.findOne = sinon - .stub(Banner, "findOne") - .resolves(banner().build()); - const result = await service.getBannerById(1); - expect(result).to.be.deep.equal(banner().build()); - const params = BannerMock.findOne.args[0][0]; - expect(params).to.be.deep.equal({ + }); + it("createBanner - should return the created banner", async () => { + BannerMock.create = sinon.stub(Banner, "create").resolves(banner().build()); + const result = await service.createBanner({ bannerText: "hello world" }); + expect(result).to.be.deep.equal(banner().build()); + const params = BannerMock.create.args[0][0]; + expect(params).to.be.deep.equal({ bannerText: "hello world" }); + }); + it("deleteBanner - should return true if the banner is deleted", async () => { + BannerMock.destroy = sinon.stub(Banner, "destroy").resolves(1); + const result = await service.deleteBanner(1); + expect(result).to.be.true; + const params = BannerMock.destroy.args[0][0]; + expect(params).to.be.deep.equal({ where: { id: 1 } }); + }); + it("deleteBanner - should return false if the banner is not deleted", async () => { + BannerMock.destroy = sinon.stub(Banner, "destroy").resolves(0); + const result = await service.deleteBanner(1); + expect(result).to.be.false; + const params = BannerMock.destroy.args[0][0]; + expect(params).to.be.deep.equal({ where: { id: 1 } }); + }); + it("updateBanner - should return null if no banners are updated", async () => { + BannerMock.update = sinon.stub(Banner, "update").resolves([0, [null]]); + const data = { bannerText: "hello world" }; + const result = await service.updateBanner(1, data); + expect(result).to.be.null; + const params = BannerMock.update.args[0]; + expect(params).to.be.deep.equal([ + data, + { where: { id: 1 }, returning: true }, + ]); + }); + it("updateBanner - should return the updated banner", async () => { + BannerMock.update = sinon + .stub(Banner, "update") + .resolves([1, [banner().build()]]); + const data = { bannerText: "hello world" }; + const result = await service.updateBanner(1, data); + expect(result).to.be.deep.equal(banner().build()); + const params = BannerMock.update.args[0]; + expect(params).to.be.deep.equal([ + data, + { where: { id: 1 }, - }); - }); - it("getBannerById - if something goes wrong, should throw an error", async () => { - BannerMock.findOne = sinon.stub(Banner, "findOne").rejects(); - try { - await service.getBannerById(1); - } catch (error) { - expect(error).to.be.instanceOf(Error); - expect(error.message).to.be.equal("Error retrieving banner by ID"); - } + returning: true, + }, + ]); + }); + it("getBannerById - should return the found banner", async () => { + BannerMock.findOne = sinon + .stub(Banner, "findOne") + .resolves(banner().build()); + const result = await service.getBannerById(1); + expect(result).to.be.deep.equal(banner().build()); + const params = BannerMock.findOne.args[0][0]; + expect(params).to.be.deep.equal({ + where: { id: 1 }, }); }); -})(); + it("getBannerById - if something goes wrong, should throw an error", async () => { + BannerMock.findOne = sinon.stub(Banner, "findOne").rejects(); + try { + await service.getBannerById(1); + } catch (error) { + expect(error).to.be.instanceOf(Error); + expect(error.message).to.be.equal("Error retrieving banner by ID"); + } + }); +}); diff --git a/backend/src/test/unit/services/email.test.js b/backend/src/test/unit/services/email.test.js index 658c7e42..45689d25 100644 --- a/backend/src/test/unit/services/email.test.js +++ b/backend/src/test/unit/services/email.test.js @@ -1,101 +1,99 @@ -(async () => { - const { describe, it, afterEach, beforeEach, before, after } = await import("mocha"); - const { expect } = await import("chai"); - const sinon = await import("sinon"); - const service = require("../../../service/email.service.js"); - const fs = require("fs"); - const path = require("path"); - const { UserBuilder } = require("../../mocks/user.mock.js"); - const handlebars = require("handlebars"); +const { describe, it, afterEach, beforeEach, before, after } = require("mocha"); +const { expect } = require("chai"); +const sinon = require("sinon"); +const service = require("../../../service/email.service.js"); +const fs = require("fs"); +const path = require("path"); +const { UserBuilder } = require("../../mocks/user.mock.js"); +const handlebars = require("handlebars"); - const db = require("../../../models/index.js"); - const User = db.User; - const user = UserBuilder.user; +const db = require("../../../models/index.js"); +const User = db.User; +const user = UserBuilder.user; - describe("Test email service", () => { - let readFile; - let transporterMock; - let envOrig; - before(() => { - envOrig = JSON.stringify(process.env); - }); +describe("Test email service", () => { + let readFile; + let transporterMock; + let envOrig; + before(() => { + envOrig = JSON.stringify(process.env); + }); - after(() => { - process.env = JSON.parse(envOrig); - }); - beforeEach(() => { - readFile = sinon.stub(fs, "readFileSync"); - transporterMock = sinon.stub(service.transporter, "sendMail"); - sinon.stub(path, "join").callsFake((...args) => args.join("/")); - sinon - .stub(handlebars, "compile") - .callsFake((html) => (replacements) => html); - }); - afterEach(sinon.restore); - it("findUserByEmail - should return the user if it is found", async () => { - User.findOne = sinon.stub(User, "findOne").resolves(user().build()); - const result = await service.findUserByEmail(user().build().email); - expect(result).to.deep.equal(user().build()); - const params = User.findOne.getCall(0).args[0]; - expect(params).to.deep.equal({ where: { email: user().build().email } }); - }); - it("findUserByEmail - should return null if it isn't found", async () => { - User.findOne = sinon.stub(User, "findOne").resolves(null); - const result = await service.findUserByEmail(user().build().email); - expect(result).to.be.null; - const params = User.findOne.getCall(0).args[0]; - expect(params).to.deep.equal({ where: { email: user().build().email } }); - }); - it("sendSignupEmail - if email is not enabled, should return undefined", async () => { - process.env.EMAIL_ENABLE = "false"; - const result = await service.sendSignupEmail( - user().build().email, - user().build().name - ); - expect(result).to.be.undefined; - expect(readFile.called).to.be.false; - }); - it("sendSignupEmail - should send the email with the sing up content", async () => { - process.env.EMAIL_ENABLE = "true"; - await readFile.resolves("html"); - await service.sendSignupEmail(user().build().email, user().build().name); - expect(readFile.called).to.be.true; - const params = transporterMock.getCall(0).args[0]; - expect(transporterMock.called).to.be.true; - expect(params).to.deep.equal({ - from: process.env.EMAIL, - to: user().build().email, - subject: "Welcome to Our Service", - html: "html", - }); - }); - it("sendPasswordResetEmail - if email is not enabled, should return undefined", async () => { - process.env.EMAIL_ENABLE = "false"; - const result = await service.sendPasswordResetEmail( - user().build().email, - user().build().name, - "token" - ); - expect(result).to.be.undefined; - expect(readFile.called).to.be.false; + after(() => { + process.env = JSON.parse(envOrig); + }); + beforeEach(() => { + readFile = sinon.stub(fs, "readFileSync"); + transporterMock = sinon.stub(service.transporter, "sendMail"); + sinon.stub(path, "join").callsFake((...args) => args.join("/")); + sinon + .stub(handlebars, "compile") + .callsFake((html) => (replacements) => html); + }); + afterEach(sinon.restore); + it("findUserByEmail - should return the user if it is found", async () => { + User.findOne = sinon.stub(User, "findOne").resolves(user().build()); + const result = await service.findUserByEmail(user().build().email); + expect(result).to.deep.equal(user().build()); + const params = User.findOne.getCall(0).args[0]; + expect(params).to.deep.equal({ where: { email: user().build().email } }); + }); + it("findUserByEmail - should return null if it isn't found", async () => { + User.findOne = sinon.stub(User, "findOne").resolves(null); + const result = await service.findUserByEmail(user().build().email); + expect(result).to.be.null; + const params = User.findOne.getCall(0).args[0]; + expect(params).to.deep.equal({ where: { email: user().build().email } }); + }); + it("sendSignupEmail - if email is not enabled, should return undefined", async () => { + process.env.EMAIL_ENABLE = "false"; + const result = await service.sendSignupEmail( + user().build().email, + user().build().name + ); + expect(result).to.be.undefined; + expect(readFile.called).to.be.false; + }); + it("sendSignupEmail - should send the email with the sing up content", async () => { + process.env.EMAIL_ENABLE = "true"; + await readFile.resolves("html"); + await service.sendSignupEmail(user().build().email, user().build().name); + expect(readFile.called).to.be.true; + const params = transporterMock.getCall(0).args[0]; + expect(transporterMock.called).to.be.true; + expect(params).to.deep.equal({ + from: process.env.EMAIL, + to: user().build().email, + subject: "Welcome to Our Service", + html: "html", }); - it("sendPasswordResetEmail - should send the email with the reset password content", async () => { - process.env.EMAIL_ENABLE = "true"; - await readFile.resolves("html"); - await service.sendPasswordResetEmail( - user().build().email, - user().build().name, - "token" - ); - expect(readFile.called).to.be.true; - const params = transporterMock.getCall(0).args[0]; - expect(transporterMock.called).to.be.true; - expect(params).to.deep.equal({ - from: process.env.EMAIL, - to: user().build().email, - subject: "Password Reset", - html: "html", - }); + }); + it("sendPasswordResetEmail - if email is not enabled, should return undefined", async () => { + process.env.EMAIL_ENABLE = "false"; + const result = await service.sendPasswordResetEmail( + user().build().email, + user().build().name, + "token" + ); + expect(result).to.be.undefined; + expect(readFile.called).to.be.false; + }); + it("sendPasswordResetEmail - should send the email with the reset password content", async () => { + process.env.EMAIL_ENABLE = "true"; + await readFile.resolves("html"); + await service.sendPasswordResetEmail( + user().build().email, + user().build().name, + "token" + ); + expect(readFile.called).to.be.true; + const params = transporterMock.getCall(0).args[0]; + expect(transporterMock.called).to.be.true; + expect(params).to.deep.equal({ + from: process.env.EMAIL, + to: user().build().email, + subject: "Password Reset", + html: "html", }); }); -})(); +}); diff --git a/backend/src/test/unit/services/helperLink.test.js b/backend/src/test/unit/services/helperLink.test.js index af61e411..f7fd0016 100644 --- a/backend/src/test/unit/services/helperLink.test.js +++ b/backend/src/test/unit/services/helperLink.test.js @@ -1,266 +1,252 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const db = require("../../../models/index.js"); - const mocks = require("../../mocks/helperLink.mock.js"); - const helperLinkService = require("../../../service/helperLink.service.js"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const db = require("../../../models/index.js"); +const mocks = require("../../mocks/helperLink.mock.js"); +const helperLinkService = require("../../../service/helperLink.service.js"); - const HelperLink = db.HelperLink; - const Link = db.Link; +const HelperLink = db.HelperLink; +const Link = db.Link; - describe("Test helper link service", () => { - const HelperLinkMock = {}; - const LinkMock = {}; - let commit; - let rollback; - beforeEach(() => { - commit = sinon.spy(); - rollback = sinon.spy(); - sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ - commit, - rollback, - })); - }); - afterEach(sinon.restore); - it("getAllHelpers - should return all the helper links with it's user without the password", async () => { - HelperLinkMock.findAll = sinon - .stub(HelperLink, "findAll") - .resolves(mocks.HelperLinkList); - const result = await helperLinkService.getAllHelpers(); - expect(result).to.deep.equal(mocks.HelperLinkList); - const params = HelperLinkMock.findAll.getCall(0).args; - expect(params).to.deep.equal([ - { - include: [ - { - model: db.User, - as: "creator", - attributes: { - exclude: ["password"], - }, +describe("Test helper link service", () => { + const HelperLinkMock = {}; + const LinkMock = {}; + let commit; + let rollback; + beforeEach(() => { + commit = sinon.spy(); + rollback = sinon.spy(); + sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ + commit, + rollback, + })); + }); + afterEach(sinon.restore); + it("getAllHelpers - should return all the helper links with it's user without the password", async () => { + HelperLinkMock.findAll = sinon + .stub(HelperLink, "findAll") + .resolves(mocks.HelperLinkList); + const result = await helperLinkService.getAllHelpers(); + expect(result).to.deep.equal(mocks.HelperLinkList); + const params = HelperLinkMock.findAll.getCall(0).args; + expect(params).to.deep.equal([ + { + include: [ + { + model: db.User, + as: "creator", + attributes: { + exclude: ["password"], }, - ], - }, - ]); - }); - it("getHelpersByUserId - should return all the helper links of one user without the password", async () => { - HelperLinkMock.findAll = sinon - .stub(HelperLink, "findAll") - .resolves(mocks.HelperLinkList.filter((it) => it.createdBy === 1)); - const result = await helperLinkService.getHelpersByUserId(1); - expect(result).to.deep.equal( - mocks.HelperLinkList.filter((it) => it.createdBy === 1) - ); - const params = HelperLinkMock.findAll.getCall(0).args; - expect(params).to.deep.equal([ - { - where: { - createdBy: 1, }, - include: [ - { - model: db.User, - as: "creator", - attributes: { - exclude: ["password"], - }, - }, - ], + ], + }, + ]); + }); + it("getHelpersByUserId - should return all the helper links of one user without the password", async () => { + HelperLinkMock.findAll = sinon + .stub(HelperLink, "findAll") + .resolves(mocks.HelperLinkList.filter((it) => it.createdBy === 1)); + const result = await helperLinkService.getHelpersByUserId(1); + expect(result).to.deep.equal( + mocks.HelperLinkList.filter((it) => it.createdBy === 1) + ); + const params = HelperLinkMock.findAll.getCall(0).args; + expect(params).to.deep.equal([ + { + where: { + createdBy: 1, }, - ]); - }); - it("createHelper - should create the helper link and it's links", async () => { - HelperLinkMock.create = sinon - .stub(HelperLink, "create") - .resolves(mocks.HelperLinkBuilder.helperLink(1).build()); - LinkMock.create = sinon - .stub(Link, "create") - .resolves(mocks.LinkBuilder.link(1).build()); - const result = await helperLinkService.createHelper( + include: [ + { + model: db.User, + as: "creator", + attributes: { + exclude: ["password"], + }, + }, + ], + }, + ]); + }); + it("createHelper - should create the helper link and it's links", async () => { + HelperLinkMock.create = sinon + .stub(HelperLink, "create") + .resolves(mocks.HelperLinkBuilder.helperLink(1).build()); + LinkMock.create = sinon + .stub(Link, "create") + .resolves(mocks.LinkBuilder.link(1).build()); + const result = await helperLinkService.createHelper( + mocks.HelperLinkBuilder.helperLink(1).build(), + mocks.LinksList + ); + expect(result).to.deep.equal(mocks.HelperLinkBuilder.helperLink(1).build()); + const paramsHelper = HelperLinkMock.create.getCall(0).args; + expect(paramsHelper[0]).to.deep.equal( + mocks.HelperLinkBuilder.helperLink(1).build() + ); + expect(paramsHelper[1]).to.have.property("returning", true); + const paramsLink = LinkMock.create.getCall(0).args; + expect(paramsLink[0]).to.deep.equal(mocks.LinkBuilder.link(1).build()); + expect(commit.called).to.be.true; + expect(rollback.called).to.be.false; + }); + it("createHelper - should throw an error if something goes wrong", async () => { + HelperLinkMock.create = sinon.stub(HelperLink, "create").rejects(); + LinkMock.create = sinon.stub(Link, "create").resolves(); + try { + await helperLinkService.createHelper( mocks.HelperLinkBuilder.helperLink(1).build(), mocks.LinksList ); - expect(result).to.deep.equal( - mocks.HelperLinkBuilder.helperLink(1).build() - ); - const paramsHelper = HelperLinkMock.create.getCall(0).args; - expect(paramsHelper[0]).to.deep.equal( - mocks.HelperLinkBuilder.helperLink(1).build() - ); - expect(paramsHelper[1]).to.have.property("returning", true); - const paramsLink = LinkMock.create.getCall(0).args; - expect(paramsLink[0]).to.deep.equal(mocks.LinkBuilder.link(1).build()); - expect(commit.called).to.be.true; - expect(rollback.called).to.be.false; - }); - it("createHelper - should throw an error if something goes wrong", async () => { - HelperLinkMock.create = sinon.stub(HelperLink, "create").rejects(); - LinkMock.create = sinon.stub(Link, "create").resolves(); - try { - await helperLinkService.createHelper( - mocks.HelperLinkBuilder.helperLink(1).build(), - mocks.LinksList - ); - } catch (e) { - expect(e.message).to.equal("Error creating helper"); - } - expect(commit.called).to.be.false; - expect(rollback.called).to.be.true; - }); - it("deleteHelper - should return true if the helper was deleted", async () => { - HelperLinkMock.destroy = sinon.stub(HelperLink, "destroy").resolves(1); - const result = await helperLinkService.deleteHelper(1); - expect(result).to.be.true; - const params = HelperLinkMock.destroy.getCall(0).args; - expect(params).to.deep.equal([{ where: { id: 1 } }]); + } catch (e) { + expect(e.message).to.equal("Error creating helper"); + } + expect(commit.called).to.be.false; + expect(rollback.called).to.be.true; + }); + it("deleteHelper - should return true if the helper was deleted", async () => { + HelperLinkMock.destroy = sinon.stub(HelperLink, "destroy").resolves(1); + const result = await helperLinkService.deleteHelper(1); + expect(result).to.be.true; + const params = HelperLinkMock.destroy.getCall(0).args; + expect(params).to.deep.equal([{ where: { id: 1 } }]); + }); + it("deleteHelper - should return false if the helper wasn't deleted", async () => { + HelperLinkMock.destroy = sinon.stub(HelperLink, "destroy").resolves(0); + const result = await helperLinkService.deleteHelper(1); + expect(result).to.be.false; + const params = HelperLinkMock.destroy.getCall(0).args; + expect(params).to.deep.equal([{ where: { id: 1 } }]); + }); + it("updateHelper - should return null if no helper is updated", async () => { + HelperLinkMock.update = sinon.stub(HelperLink, "update").resolves([0, []]); + const result = await helperLinkService.updateHelper(1, {}, []); + expect(result).to.be.null; + const params = HelperLinkMock.update.getCall(0).args; + expect(params[0]).to.deep.equal({}); + expect(params[1]).to.deep.equal({ + transaction: { commit, rollback }, + where: { id: 1 }, + returning: true, }); - it("deleteHelper - should return false if the helper wasn't deleted", async () => { - HelperLinkMock.destroy = sinon.stub(HelperLink, "destroy").resolves(0); - const result = await helperLinkService.deleteHelper(1); - expect(result).to.be.false; - const params = HelperLinkMock.destroy.getCall(0).args; - expect(params).to.deep.equal([{ where: { id: 1 } }]); + }); + it("updateHelper - should return the updated helper is everything goes right", async () => { + HelperLinkMock.update = sinon + .stub(HelperLink, "update") + .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); + LinkMock.update = sinon.stub(Link, "update").resolves(); + LinkMock.create = sinon.stub(Link, "create").resolves(); + const result = await helperLinkService.updateHelper( + 1, + mocks.HelperLinkBuilder.helperLink(1).build(), + mocks.LinksList + ); + expect(result).to.deep.equal(mocks.HelperLinkBuilder.helperLink(1).build()); + const paramsHelper = HelperLinkMock.update.getCall(0).args; + expect(paramsHelper[0]).to.deep.equal( + mocks.HelperLinkBuilder.helperLink(1).build() + ); + expect(paramsHelper[1]).to.deep.equal({ + transaction: { commit, rollback }, + where: { id: 1 }, + returning: true, }); - it("updateHelper - should return null if no helper is updated", async () => { - HelperLinkMock.update = sinon - .stub(HelperLink, "update") - .resolves([0, []]); - const result = await helperLinkService.updateHelper(1, {}, []); - expect(result).to.be.null; - const params = HelperLinkMock.update.getCall(0).args; - expect(params[0]).to.deep.equal({}); - expect(params[1]).to.deep.equal({ - transaction: { commit, rollback }, - where: { id: 1 }, - returning: true, - }); + const paramsLink = LinkMock.update.getCall(0).args; + const { id, ...link } = mocks.LinksList[0]; + expect(paramsLink[0]).to.deep.equal(link); + expect(paramsLink[1]).to.deep.equal({ + transaction: { commit, rollback }, + where: { id: 1 }, }); - it("updateHelper - should return the updated helper is everything goes right", async () => { - HelperLinkMock.update = sinon - .stub(HelperLink, "update") - .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); - LinkMock.update = sinon.stub(Link, "update").resolves(); - LinkMock.create = sinon.stub(Link, "create").resolves(); - const result = await helperLinkService.updateHelper( + expect(commit.called).to.be.true; + expect(rollback.called).to.be.false; + }); + it("updateHelper - should update a link if it exists", async () => { + HelperLinkMock.update = sinon + .stub(HelperLink, "update") + .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); + LinkMock.update = sinon.stub(Link, "update").resolves(); + LinkMock.create = sinon.stub(Link, "create").resolves(); + const result = await helperLinkService.updateHelper( + 1, + mocks.HelperLinkBuilder.helperLink(1).build(), + mocks.LinksList + ); + expect(result).to.deep.equal(mocks.HelperLinkBuilder.helperLink(1).build()); + expect(LinkMock.update.called).to.be.true; + expect(LinkMock.create.called).to.be.false; + expect(commit.called).to.be.true; + expect(rollback.called).to.be.false; + }); + it("updateHelper - should create a link if it doesn't exist", async () => { + HelperLinkMock.update = sinon + .stub(HelperLink, "update") + .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); + LinkMock.update = sinon.stub(Link, "update").resolves(); + LinkMock.create = sinon.stub(Link, "create").resolves(); + const result = await helperLinkService.updateHelper( + 1, + mocks.HelperLinkBuilder.helperLink(1).build(), + mocks.LinksList.map((it) => { + const { id, ...link } = it; + return link; + }) + ); + expect(result).to.deep.equal(mocks.HelperLinkBuilder.helperLink(1).build()); + expect(LinkMock.update.called).to.be.false; + expect(LinkMock.create.called).to.be.true; + expect(commit.called).to.be.true; + expect(rollback.called).to.be.false; + }); + it("updateHelper - should throw an error if something goes wrong", async () => { + HelperLinkMock.update = sinon.stub(HelperLink, "update").rejects(); + try { + await helperLinkService.updateHelper( 1, mocks.HelperLinkBuilder.helperLink(1).build(), mocks.LinksList ); - expect(result).to.deep.equal( - mocks.HelperLinkBuilder.helperLink(1).build() - ); - const paramsHelper = HelperLinkMock.update.getCall(0).args; - expect(paramsHelper[0]).to.deep.equal( - mocks.HelperLinkBuilder.helperLink(1).build() - ); - expect(paramsHelper[1]).to.deep.equal({ - transaction: { commit, rollback }, - where: { id: 1 }, - returning: true, - }); - const paramsLink = LinkMock.update.getCall(0).args; - const { id, ...link } = mocks.LinksList[0]; - expect(paramsLink[0]).to.deep.equal(link); - expect(paramsLink[1]).to.deep.equal({ - transaction: { commit, rollback }, + } catch (e) { + expect(e.message).to.equal("Error updating helper"); + expect(e).to.be.an.instanceof(Error); + } + expect(commit.called).to.be.false; + expect(rollback.called).to.be.true; + }); + it("getHelperById - should return the helperLink and it's user without the password", async () => { + HelperLinkMock.findOne = sinon + .stub(HelperLink, "findOne") + .resolves(mocks.HelperLinkBuilder.helperLink(1).build()); + const result = await helperLinkService.getHelperById(1); + expect(result).to.deep.equal(mocks.HelperLinkBuilder.helperLink(1).build()); + const params = HelperLinkMock.findOne.getCall(0).args; + expect(params).to.deep.equal([ + { where: { id: 1 }, - }); - expect(commit.called).to.be.true; - expect(rollback.called).to.be.false; - }); - it("updateHelper - should update a link if it exists", async () => { - HelperLinkMock.update = sinon - .stub(HelperLink, "update") - .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); - LinkMock.update = sinon.stub(Link, "update").resolves(); - LinkMock.create = sinon.stub(Link, "create").resolves(); - const result = await helperLinkService.updateHelper( - 1, - mocks.HelperLinkBuilder.helperLink(1).build(), - mocks.LinksList - ); - expect(result).to.deep.equal( - mocks.HelperLinkBuilder.helperLink(1).build() - ); - expect(LinkMock.update.called).to.be.true; - expect(LinkMock.create.called).to.be.false; - expect(commit.called).to.be.true; - expect(rollback.called).to.be.false; - }); - it("updateHelper - should create a link if it doesn't exist", async () => { - HelperLinkMock.update = sinon - .stub(HelperLink, "update") - .resolves([1, mocks.HelperLinkBuilder.helperLink(1).build()]); - LinkMock.update = sinon.stub(Link, "update").resolves(); - LinkMock.create = sinon.stub(Link, "create").resolves(); - const result = await helperLinkService.updateHelper( - 1, - mocks.HelperLinkBuilder.helperLink(1).build(), - mocks.LinksList.map((it) => { - const { id, ...link } = it; - return link; - }) - ); - expect(result).to.deep.equal( - mocks.HelperLinkBuilder.helperLink(1).build() - ); - expect(LinkMock.update.called).to.be.false; - expect(LinkMock.create.called).to.be.true; - expect(commit.called).to.be.true; - expect(rollback.called).to.be.false; - }); - it("updateHelper - should throw an error if something goes wrong", async () => { - HelperLinkMock.update = sinon.stub(HelperLink, "update").rejects(); - try { - await helperLinkService.updateHelper( - 1, - mocks.HelperLinkBuilder.helperLink(1).build(), - mocks.LinksList - ); - } catch (e) { - expect(e.message).to.equal("Error updating helper"); - expect(e).to.be.an.instanceof(Error); - } - expect(commit.called).to.be.false; - expect(rollback.called).to.be.true; - }); - it("getHelperById - should return the helperLink and it's user without the password", async () => { - HelperLinkMock.findOne = sinon - .stub(HelperLink, "findOne") - .resolves(mocks.HelperLinkBuilder.helperLink(1).build()); - const result = await helperLinkService.getHelperById(1); - expect(result).to.deep.equal( - mocks.HelperLinkBuilder.helperLink(1).build() - ); - const params = HelperLinkMock.findOne.getCall(0).args; - expect(params).to.deep.equal([ - { - where: { id: 1 }, - include: [ - { - model: db.User, - as: "creator", - attributes: { - exclude: ["password"], - }, - }, - { - model: db.Link, - as: "links", + include: [ + { + model: db.User, + as: "creator", + attributes: { + exclude: ["password"], }, - ], - }, - ]); - }); - it("getHelperById - should throw an error if the user is not found", async () => { - HelperLinkMock.findOne = sinon.stub(HelperLink, "findOne").rejects(); - try { - await helperLinkService.getHelperById(1); - } catch (e) { - expect(e.message).to.equal("Error retrieving helper by ID"); - expect(e).to.be.an.instanceof(Error); - } - }); + }, + { + model: db.Link, + as: "links", + }, + ], + }, + ]); + }); + it("getHelperById - should throw an error if the user is not found", async () => { + HelperLinkMock.findOne = sinon.stub(HelperLink, "findOne").rejects(); + try { + await helperLinkService.getHelperById(1); + } catch (e) { + expect(e.message).to.equal("Error retrieving helper by ID"); + expect(e).to.be.an.instanceof(Error); + } }); -})(); +}); diff --git a/backend/src/test/unit/services/hint.test.js b/backend/src/test/unit/services/hint.test.js index 761ec9d6..2a764ee5 100644 --- a/backend/src/test/unit/services/hint.test.js +++ b/backend/src/test/unit/services/hint.test.js @@ -1,178 +1,176 @@ -(async () => { - const { describe, it, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const db = require("../../../models/index.js"); - const mocks = require("../../mocks/hint.mock.js"); - const hintService = require("../../../service/hint.service.js"); +const { describe, it, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const db = require("../../../models/index.js"); +const mocks = require("../../mocks/hint.mock.js"); +const hintService = require("../../../service/hint.service.js"); - const Hint = db.Hint; - const hint = mocks.HintBuilder.hint; - const hintList = mocks.hintList; +const Hint = db.Hint; +const hint = mocks.HintBuilder.hint; +const hintList = mocks.hintList; - describe("Test hint service", () => { - const HintMock = {}; - afterEach(sinon.restore); - it("getAllHints - should return the list of hints", async () => { - HintMock.findAll = sinon.stub(Hint, "findAll").resolves(hintList); - const hints = await hintService.getAllHints(); - expect(hints).to.deep.equal(hintList); - const params = HintMock.findAll.getCall(0).args[0]; - expect(params).to.deep.equal({ - include: [{ model: db.User, as: "creator" }], - }); +describe("Test hint service", () => { + const HintMock = {}; + afterEach(sinon.restore); + it("getAllHints - should return the list of hints", async () => { + HintMock.findAll = sinon.stub(Hint, "findAll").resolves(hintList); + const hints = await hintService.getAllHints(); + expect(hints).to.deep.equal(hintList); + const params = HintMock.findAll.getCall(0).args[0]; + expect(params).to.deep.equal({ + include: [{ model: db.User, as: "creator" }], }); - it("getAllHints - should throw an error if something goes wrong", async () => { - HintMock.findAll = sinon - .stub(Hint, "findAll") - .rejects(new Error("Something went wrong")); - try { - await hintService.getAllHints(); - } catch (error) { - expect(error.message).to.equal( - "Error retrieving hints: Something went wrong" - ); - } - const params = HintMock.findAll.getCall(0).args[0]; - expect(params).to.deep.equal({ - include: [{ model: db.User, as: "creator" }], - }); - }); - it("getHints - should return the list of hints created by the userId", async () => { - HintMock.findAll = sinon.stub(Hint, "findAll").resolves(hintList); - const hints = await hintService.getHints(1); - expect(hints).to.deep.equal(hintList); - const params = HintMock.findAll.getCall(0).args[0]; - expect(params).to.deep.equal({ - where: { - createdBy: 1, - }, - include: [{ model: db.User, as: "creator" }], - }); - }); - it("getHints - should throw an error if something goes wrong", async () => { - HintMock.findAll = sinon - .stub(Hint, "findAll") - .rejects(new Error("Something went wrong")); - try { - await hintService.getHints(1); - } catch (error) { - expect(error.message).to.equal( - "Error retrieving hints: Something went wrong" - ); - } - const params = HintMock.findAll.getCall(0).args[0]; - expect(params).to.deep.equal({ - where: { - createdBy: 1, - }, - include: [{ model: db.User, as: "creator" }], - }); - }); - it("createHint - should return the created hint", async () => { - HintMock.create = sinon.stub(Hint, "create").resolves(hint().build()); - const newHint = await hintService.createHint(hint().build()); - expect(newHint).to.deep.equal(hint().build()); - const params = HintMock.create.getCall(0).args[0]; - expect(params).to.deep.equal(hint().build()); - }); - it("createHint - should throw an error if something goes wrong", async () => { - HintMock.create = sinon - .stub(Hint, "create") - .rejects(new Error("Something went wrong")); - try { - await hintService.createHint(hint().build()); - } catch (error) { - expect(error.message).to.equal( - "Error creating hint: Something went wrong" - ); - } - const params = HintMock.create.getCall(0).args[0]; - expect(params).to.deep.equal(hint().build()); - }); - it("deleteHint - should return false if no hint is deleted", async () => { - HintMock.destroy = sinon.stub(Hint, "destroy").resolves(0); - const result = await hintService.deleteHint(1); - expect(result).to.equal(false); - const params = HintMock.destroy.getCall(0).args[0]; - expect(params).to.deep.equal({ where: { id: 1 } }); - }); - it("deleteHint - should return true if the hint is deleted", async () => { - HintMock.destroy = sinon.stub(Hint, "destroy").resolves(1); - const result = await hintService.deleteHint(1); - expect(result).to.equal(true); - const params = HintMock.destroy.getCall(0).args[0]; - expect(params).to.deep.equal({ where: { id: 1 } }); - }); - it("deleteHint - should throw an error if something goes wrong", async () => { - HintMock.destroy = sinon - .stub(Hint, "destroy") - .rejects(new Error("Something went wrong")); - try { - await hintService.deleteHint(1); - } catch (error) { - expect(error.message).to.equal( - "Error deleting hint: Something went wrong" - ); - } - const params = HintMock.destroy.getCall(0).args[0]; - expect(params).to.deep.equal({ where: { id: 1 } }); - }); - it("updateHint - should return null if no hint is updated", async () => { - HintMock.update = sinon.stub(Hint, "update").resolves([0, []]); - const updatedHint = await hintService.updateHint(1, hint().build()); - expect(updatedHint).to.equal(null); - const params = HintMock.update.getCall(0).args; - expect(params[0]).to.deep.equal(hint().build()); - expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("getAllHints - should throw an error if something goes wrong", async () => { + HintMock.findAll = sinon + .stub(Hint, "findAll") + .rejects(new Error("Something went wrong")); + try { + await hintService.getAllHints(); + } catch (error) { + expect(error.message).to.equal( + "Error retrieving hints: Something went wrong" + ); + } + const params = HintMock.findAll.getCall(0).args[0]; + expect(params).to.deep.equal({ + include: [{ model: db.User, as: "creator" }], }); - it("updateHint - should return the updated hint", async () => { - HintMock.update = sinon - .stub(Hint, "update") - .resolves([1, [hint().build()]]); - const updatedHint = await hintService.updateHint(1, hint().build()); - expect(updatedHint).to.deep.equal(hint().build()); - const params = HintMock.update.getCall(0).args; - expect(params[0]).to.deep.equal(hint().build()); - expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("getHints - should return the list of hints created by the userId", async () => { + HintMock.findAll = sinon.stub(Hint, "findAll").resolves(hintList); + const hints = await hintService.getHints(1); + expect(hints).to.deep.equal(hintList); + const params = HintMock.findAll.getCall(0).args[0]; + expect(params).to.deep.equal({ + where: { + createdBy: 1, + }, + include: [{ model: db.User, as: "creator" }], }); - it("updateHint - should throw an error if something goes wrong", async () => { - HintMock.update = sinon - .stub(Hint, "update") - .rejects(new Error("Something went wrong")); - try { - await hintService.updateHint(1, hint().build()); - } catch (error) { - expect(error.message).to.equal( - "Error updating hint: Something went wrong" - ); - } - const params = HintMock.update.getCall(0).args; - expect(params[0]).to.deep.equal(hint().build()); - expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("getHints - should throw an error if something goes wrong", async () => { + HintMock.findAll = sinon + .stub(Hint, "findAll") + .rejects(new Error("Something went wrong")); + try { + await hintService.getHints(1); + } catch (error) { + expect(error.message).to.equal( + "Error retrieving hints: Something went wrong" + ); + } + const params = HintMock.findAll.getCall(0).args[0]; + expect(params).to.deep.equal({ + where: { + createdBy: 1, + }, + include: [{ model: db.User, as: "creator" }], }); - it("getHintById - should return the found hint", async () => { - HintMock.findOne = sinon.stub(Hint, "findOne").resolves(hint().build()); - const foundHint = await hintService.getHintById(1); - expect(foundHint).to.deep.equal(hint().build()); - const params = HintMock.findOne.getCall(0).args[0]; - expect(params).to.deep.equal({ - where: { id: 1 }, - include: [{ model: db.User, as: "creator" }], - }); + }); + it("createHint - should return the created hint", async () => { + HintMock.create = sinon.stub(Hint, "create").resolves(hint().build()); + const newHint = await hintService.createHint(hint().build()); + expect(newHint).to.deep.equal(hint().build()); + const params = HintMock.create.getCall(0).args[0]; + expect(params).to.deep.equal(hint().build()); + }); + it("createHint - should throw an error if something goes wrong", async () => { + HintMock.create = sinon + .stub(Hint, "create") + .rejects(new Error("Something went wrong")); + try { + await hintService.createHint(hint().build()); + } catch (error) { + expect(error.message).to.equal( + "Error creating hint: Something went wrong" + ); + } + const params = HintMock.create.getCall(0).args[0]; + expect(params).to.deep.equal(hint().build()); + }); + it("deleteHint - should return false if no hint is deleted", async () => { + HintMock.destroy = sinon.stub(Hint, "destroy").resolves(0); + const result = await hintService.deleteHint(1); + expect(result).to.equal(false); + const params = HintMock.destroy.getCall(0).args[0]; + expect(params).to.deep.equal({ where: { id: 1 } }); + }); + it("deleteHint - should return true if the hint is deleted", async () => { + HintMock.destroy = sinon.stub(Hint, "destroy").resolves(1); + const result = await hintService.deleteHint(1); + expect(result).to.equal(true); + const params = HintMock.destroy.getCall(0).args[0]; + expect(params).to.deep.equal({ where: { id: 1 } }); + }); + it("deleteHint - should throw an error if something goes wrong", async () => { + HintMock.destroy = sinon + .stub(Hint, "destroy") + .rejects(new Error("Something went wrong")); + try { + await hintService.deleteHint(1); + } catch (error) { + expect(error.message).to.equal( + "Error deleting hint: Something went wrong" + ); + } + const params = HintMock.destroy.getCall(0).args[0]; + expect(params).to.deep.equal({ where: { id: 1 } }); + }); + it("updateHint - should return null if no hint is updated", async () => { + HintMock.update = sinon.stub(Hint, "update").resolves([0, []]); + const updatedHint = await hintService.updateHint(1, hint().build()); + expect(updatedHint).to.equal(null); + const params = HintMock.update.getCall(0).args; + expect(params[0]).to.deep.equal(hint().build()); + expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("updateHint - should return the updated hint", async () => { + HintMock.update = sinon + .stub(Hint, "update") + .resolves([1, [hint().build()]]); + const updatedHint = await hintService.updateHint(1, hint().build()); + expect(updatedHint).to.deep.equal(hint().build()); + const params = HintMock.update.getCall(0).args; + expect(params[0]).to.deep.equal(hint().build()); + expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("updateHint - should throw an error if something goes wrong", async () => { + HintMock.update = sinon + .stub(Hint, "update") + .rejects(new Error("Something went wrong")); + try { + await hintService.updateHint(1, hint().build()); + } catch (error) { + expect(error.message).to.equal( + "Error updating hint: Something went wrong" + ); + } + const params = HintMock.update.getCall(0).args; + expect(params[0]).to.deep.equal(hint().build()); + expect(params[1]).to.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("getHintById - should return the found hint", async () => { + HintMock.findOne = sinon.stub(Hint, "findOne").resolves(hint().build()); + const foundHint = await hintService.getHintById(1); + expect(foundHint).to.deep.equal(hint().build()); + const params = HintMock.findOne.getCall(0).args[0]; + expect(params).to.deep.equal({ + where: { id: 1 }, + include: [{ model: db.User, as: "creator" }], }); - it("getHintById - should throw an error if the hint is not found", async () => { - HintMock.findOne = sinon.stub(Hint, "findOne").rejects(); - try { - await hintService.getHintById(1); - } catch (error) { - expect(error.message).to.equal("Error retrieving hint by ID: Error"); - } - const params = HintMock.findOne.getCall(0).args[0]; - expect(params).to.deep.equal({ - where: { id: 1 }, - include: [{ model: db.User, as: "creator" }], - }); + }); + it("getHintById - should throw an error if the hint is not found", async () => { + HintMock.findOne = sinon.stub(Hint, "findOne").rejects(); + try { + await hintService.getHintById(1); + } catch (error) { + expect(error.message).to.equal("Error retrieving hint by ID: Error"); + } + const params = HintMock.findOne.getCall(0).args[0]; + expect(params).to.deep.equal({ + where: { id: 1 }, + include: [{ model: db.User, as: "creator" }], }); }); -})(); +}); diff --git a/backend/src/test/unit/services/invite.test.js b/backend/src/test/unit/services/invite.test.js index 66bfbb70..e9928173 100644 --- a/backend/src/test/unit/services/invite.test.js +++ b/backend/src/test/unit/services/invite.test.js @@ -1,87 +1,83 @@ -(async () => { - const { describe, it, beforeEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const db = require("../../../models/index.js"); - const { UserBuilder, validList } = require("../../mocks/user.mock.js"); - const InviteService = require("../../../service/invite.service"); +const { describe, it, beforeEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const db = require("../../../models/index.js"); +const { UserBuilder, validList } = require("../../mocks/user.mock.js"); +const InviteService = require("../../../service/invite.service"); - const validEmailList = validList.map((it) => ({ - invitedBy: 1, - invitedEmail: it.email, - role: "admin", - })); - const Invite = db.Invite; - const User = db.User; - const user = UserBuilder.user; - const service = new InviteService(); +const validEmailList = validList.map((it) => ({ + invitedBy: 1, + invitedEmail: it.email, + role: "admin", +})); +const Invite = db.Invite; +const User = db.User; +const user = UserBuilder.user; +const service = new InviteService(); - describe("Test invite service", () => { - const UserMock = {}; - const InviteMock = {}; - beforeEach(sinon.restore); - it("sendInvite - should throw an error if the email is already registered", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - try { - await service.sendInvite(1, "email@email.com", "admin"); - } catch (e) { - expect(e).to.be.instanceOf(Error); - expect(e.message).to.be.equal( - "Error Sending Invite ~ Invited User already exists in team" - ); - } - }); - it("sendInvite - should update the invite if the email was invited but not registered", async () => { - const update = sinon.stub(); - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - InviteMock.findOne = sinon - .stub(Invite, "findOne") - .resolves({ ...user().build(), update }); - await service.sendInvite(1, "email@email.com", "admin"); - expect(update.called).to.be.true; - expect(update.args[0][0]).to.deep.equal({ - invitedBy: 1, - role: "1", - }); - }); - it("sendInvite - should create an invite if the email was not invited yet.", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - InviteMock.findOne = sinon.stub(Invite, "findOne").resolves(null); - InviteMock.create = sinon.stub(Invite, "create").resolves(); +describe("Test invite service", () => { + const UserMock = {}; + const InviteMock = {}; + beforeEach(sinon.restore); + it("sendInvite - should throw an error if the email is already registered", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + try { await service.sendInvite(1, "email@email.com", "admin"); - expect(InviteMock.create.called).to.be.true; - expect(InviteMock.create.args[0][0]).to.deep.equal({ - invitedBy: 1, - role: "1", - invitedEmail: "email@email.com", - }); - }); - it("sendInvite - should throw an error if something goes wrong", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - InviteMock.findOne = sinon.stub(Invite, "findOne").rejects(); - try { - await service.sendInvite(1, "email@email.com", "admin"); - } catch (e) { - expect(e).to.be.instanceOf(Error); - expect(e.message).to.be.equal("Error Sending Invite ~ Error"); - } - }); - it("getAllInvites - should return all the invites", async () => { - InviteMock.findAll = sinon - .stub(Invite, "findAll") - .resolves(validEmailList); - const result = await service.getAllInvites(); - expect(result).to.be.deep.equal(validEmailList); - expect(InviteMock.findAll.called).to.be.true; + } catch (e) { + expect(e).to.be.instanceOf(Error); + expect(e.message).to.be.equal( + "Error Sending Invite ~ Invited User already exists in team" + ); + } + }); + it("sendInvite - should update the invite if the email was invited but not registered", async () => { + const update = sinon.stub(); + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + InviteMock.findOne = sinon + .stub(Invite, "findOne") + .resolves({ ...user().build(), update }); + await service.sendInvite(1, "email@email.com", "admin"); + expect(update.called).to.be.true; + expect(update.args[0][0]).to.deep.equal({ + invitedBy: 1, + role: "1", }); - it("getAllInvites - should throw an error if something goes wrong", async () => { - InviteMock.findAll = sinon.stub(Invite, "findAll").rejects(); - try { - await service.getAllInvites(); - } catch (e) { - expect(e).to.be.instanceOf(Error); - expect(e.message).to.be.equal("Failed to fetch invites"); - } + }); + it("sendInvite - should create an invite if the email was not invited yet.", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + InviteMock.findOne = sinon.stub(Invite, "findOne").resolves(null); + InviteMock.create = sinon.stub(Invite, "create").resolves(); + await service.sendInvite(1, "email@email.com", "admin"); + expect(InviteMock.create.called).to.be.true; + expect(InviteMock.create.args[0][0]).to.deep.equal({ + invitedBy: 1, + role: "1", + invitedEmail: "email@email.com", }); }); -})(); + it("sendInvite - should throw an error if something goes wrong", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + InviteMock.findOne = sinon.stub(Invite, "findOne").rejects(); + try { + await service.sendInvite(1, "email@email.com", "admin"); + } catch (e) { + expect(e).to.be.instanceOf(Error); + expect(e.message).to.be.equal("Error Sending Invite ~ Error"); + } + }); + it("getAllInvites - should return all the invites", async () => { + InviteMock.findAll = sinon.stub(Invite, "findAll").resolves(validEmailList); + const result = await service.getAllInvites(); + expect(result).to.be.deep.equal(validEmailList); + expect(InviteMock.findAll.called).to.be.true; + }); + it("getAllInvites - should throw an error if something goes wrong", async () => { + InviteMock.findAll = sinon.stub(Invite, "findAll").rejects(); + try { + await service.getAllInvites(); + } catch (e) { + expect(e).to.be.instanceOf(Error); + expect(e.message).to.be.equal("Failed to fetch invites"); + } + }); +}); diff --git a/backend/src/test/unit/services/link.test.js b/backend/src/test/unit/services/link.test.js index 82237369..ff22c245 100644 --- a/backend/src/test/unit/services/link.test.js +++ b/backend/src/test/unit/services/link.test.js @@ -1,135 +1,128 @@ -(async () => { - const { describe, it, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const db = require("../../../models/index.js"); - const mocks = require("../../mocks/helperLink.mock.js"); - const linkService = require("../../../service/link.service.js"); +const { describe, it, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const db = require("../../../models/index.js"); +const mocks = require("../../mocks/helperLink.mock.js"); +const linkService = require("../../../service/link.service.js"); - const Link = db.Link; +const Link = db.Link; - describe("Test link service", () => { - const LinkMock = {}; - afterEach(sinon.restore); - it("getAllLinks - should return a list of links with it's respective helper", async () => { - LinkMock.findAll = sinon.stub(Link, "findAll").resolves(mocks.LinksList); - const links = await linkService.getAllLinks(); - expect(links).to.deep.equal(mocks.LinksList); - expect(LinkMock.findAll.called).to.be.true; - const params = LinkMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - include: [ - { - model: db.HelperLink, - as: "helper", - }, - ], - }); - }); - it("getLinksByHelperId - should return only the links related to the helper id", async () => { - LinkMock.findAll = sinon.stub(Link, "findAll").resolves(mocks.LinksList); - const links = await linkService.getLinksByHelperId(1); - expect(links).to.deep.equal(mocks.LinksList); - expect(LinkMock.findAll.called).to.be.true; - const params = LinkMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { - helperId: 1, +describe("Test link service", () => { + const LinkMock = {}; + afterEach(sinon.restore); + it("getAllLinks - should return a list of links with it's respective helper", async () => { + LinkMock.findAll = sinon.stub(Link, "findAll").resolves(mocks.LinksList); + const links = await linkService.getAllLinks(); + expect(links).to.deep.equal(mocks.LinksList); + expect(LinkMock.findAll.called).to.be.true; + const params = LinkMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + include: [ + { + model: db.HelperLink, + as: "helper", }, - include: [ - { - model: db.HelperLink, - as: "helper", - }, - ], - }); - }); - it("createLink - should return the link created", async () => { - const linkToCreate = mocks.LinkBuilder.link().build(); - LinkMock.create = sinon.stub(Link, "create").resolves(linkToCreate); - const link = await linkService.createLink(linkToCreate); - expect(link).to.deep.equal(linkToCreate); - expect(LinkMock.create.called).to.be.true; - const params = LinkMock.create.getCall(0).args[0]; - expect(params).to.be.deep.equal(linkToCreate); - }); - it("deleteLink - should return true if the link was deleted", async () => { - LinkMock.destroy = sinon.stub(Link, "destroy").resolves(1); - const result = await linkService.deleteLink(1); - expect(result).to.be.true; - expect(LinkMock.destroy.called).to.be.true; - const params = LinkMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id: 1 } }); - }); - it("deleteLink - should return false if the link wasn't deleted", async () => { - LinkMock.destroy = sinon.stub(Link, "destroy").resolves(0); - const result = await linkService.deleteLink(1); - expect(result).to.be.false; - expect(LinkMock.destroy.called).to.be.true; - const params = LinkMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id: 1 } }); + ], }); - it("updateLink - if no links are updated, should return null", async () => { - LinkMock.update = sinon.stub(Link, "update").resolves([0, []]); - const link = await linkService.updateLink(1, {}); - expect(link).to.be.null; - expect(LinkMock.update.called).to.be.true; - const params = LinkMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal({}); - expect(params[1]).to.be.deep.equal({ where: { id: 1 }, returning: true }); - }); - it("updateLink - should return the updated link", async () => { - const linkToUpdate = mocks.LinkBuilder.link().build(); - LinkMock.update = sinon - .stub(Link, "update") - .resolves([1, [linkToUpdate]]); - const link = await linkService.updateLink(1, linkToUpdate); - expect(link).to.deep.equal(linkToUpdate); - expect(LinkMock.update.called).to.be.true; - const params = LinkMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal(linkToUpdate); - expect(params[1]).to.be.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("getLinksByHelperId - should return only the links related to the helper id", async () => { + LinkMock.findAll = sinon.stub(Link, "findAll").resolves(mocks.LinksList); + const links = await linkService.getLinksByHelperId(1); + expect(links).to.deep.equal(mocks.LinksList); + expect(LinkMock.findAll.called).to.be.true; + const params = LinkMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { + helperId: 1, + }, + include: [ + { + model: db.HelperLink, + as: "helper", + }, + ], }); - it("getLinkById - should return the link with it's helper", async () => { - LinkMock.findOne = sinon - .stub(Link, "findOne") - .resolves(mocks.LinkBuilder.link().build()); - const link = await linkService.getLinkById(1); - expect(link).to.deep.equal(mocks.LinkBuilder.link().build()); - expect(LinkMock.findOne.called).to.be.true; - const params = LinkMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: 1 }, - include: [ - { - model: db.HelperLink, - as: "helper", - }, - ], - }); + }); + it("createLink - should return the link created", async () => { + const linkToCreate = mocks.LinkBuilder.link().build(); + LinkMock.create = sinon.stub(Link, "create").resolves(linkToCreate); + const link = await linkService.createLink(linkToCreate); + expect(link).to.deep.equal(linkToCreate); + expect(LinkMock.create.called).to.be.true; + const params = LinkMock.create.getCall(0).args[0]; + expect(params).to.be.deep.equal(linkToCreate); + }); + it("deleteLink - should return true if the link was deleted", async () => { + LinkMock.destroy = sinon.stub(Link, "destroy").resolves(1); + const result = await linkService.deleteLink(1); + expect(result).to.be.true; + expect(LinkMock.destroy.called).to.be.true; + const params = LinkMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id: 1 } }); + }); + it("deleteLink - should return false if the link wasn't deleted", async () => { + LinkMock.destroy = sinon.stub(Link, "destroy").resolves(0); + const result = await linkService.deleteLink(1); + expect(result).to.be.false; + expect(LinkMock.destroy.called).to.be.true; + const params = LinkMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id: 1 } }); + }); + it("updateLink - if no links are updated, should return null", async () => { + LinkMock.update = sinon.stub(Link, "update").resolves([0, []]); + const link = await linkService.updateLink(1, {}); + expect(link).to.be.null; + expect(LinkMock.update.called).to.be.true; + const params = LinkMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal({}); + expect(params[1]).to.be.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("updateLink - should return the updated link", async () => { + const linkToUpdate = mocks.LinkBuilder.link().build(); + LinkMock.update = sinon.stub(Link, "update").resolves([1, [linkToUpdate]]); + const link = await linkService.updateLink(1, linkToUpdate); + expect(link).to.deep.equal(linkToUpdate); + expect(LinkMock.update.called).to.be.true; + const params = LinkMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal(linkToUpdate); + expect(params[1]).to.be.deep.equal({ where: { id: 1 }, returning: true }); + }); + it("getLinkById - should return the link with it's helper", async () => { + LinkMock.findOne = sinon + .stub(Link, "findOne") + .resolves(mocks.LinkBuilder.link().build()); + const link = await linkService.getLinkById(1); + expect(link).to.deep.equal(mocks.LinkBuilder.link().build()); + expect(LinkMock.findOne.called).to.be.true; + const params = LinkMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: 1 }, + include: [ + { + model: db.HelperLink, + as: "helper", + }, + ], }); - it("getLinkById - should throw an error if the link is not found", async () => { - LinkMock.findOne = sinon.stub(Link, "findOne").rejects(); - try { - await linkService.getLinkById(1); - } catch (error) { - expect(error).to.have.property( - "message", - "Error retrieving link by ID" - ); - expect(error).to.be.instanceOf(Error); - } - expect(LinkMock.findOne.called).to.be.true; - const params = LinkMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: 1 }, - include: [ - { - model: db.HelperLink, - as: "helper", - }, - ], - }); + }); + it("getLinkById - should throw an error if the link is not found", async () => { + LinkMock.findOne = sinon.stub(Link, "findOne").rejects(); + try { + await linkService.getLinkById(1); + } catch (error) { + expect(error).to.have.property("message", "Error retrieving link by ID"); + expect(error).to.be.instanceOf(Error); + } + expect(LinkMock.findOne.called).to.be.true; + const params = LinkMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: 1 }, + include: [ + { + model: db.HelperLink, + as: "helper", + }, + ], }); }); -})(); +}); diff --git a/backend/src/test/unit/services/popup.test.js b/backend/src/test/unit/services/popup.test.js index 700d9c7a..0cec61a7 100644 --- a/backend/src/test/unit/services/popup.test.js +++ b/backend/src/test/unit/services/popup.test.js @@ -1,135 +1,133 @@ -(async () => { - const { describe, it, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const db = require("../../../models/index.js"); - const mocks = require("../../mocks/popup.mock.js"); - const popupService = require("../../../service/popup.service.js"); +const { describe, it, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const db = require("../../../models/index.js"); +const mocks = require("../../mocks/popup.mock.js"); +const popupService = require("../../../service/popup.service.js"); - const Popup = db.Popup; - const popup = mocks.PopupBuilder.popup; - const popupList = mocks.popupList; +const Popup = db.Popup; +const popup = mocks.PopupBuilder.popup; +const popupList = mocks.popupList; - describe("Test popup service", () => { - const PopupMock = {}; - afterEach(sinon.restore); - it("getAllPopups - should return all the popups with the user", async () => { - PopupMock.findAll = sinon.stub(Popup, "findAll").resolves(popupList); - const popups = await popupService.getAllPopups(); - expect(popups).to.deep.equal(popupList); - const params = PopupMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - include: [{ model: db.User, as: "creator" }], - }); - expect(PopupMock.findAll.called).to.be.true; +describe("Test popup service", () => { + const PopupMock = {}; + afterEach(sinon.restore); + it("getAllPopups - should return all the popups with the user", async () => { + PopupMock.findAll = sinon.stub(Popup, "findAll").resolves(popupList); + const popups = await popupService.getAllPopups(); + expect(popups).to.deep.equal(popupList); + const params = PopupMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + include: [{ model: db.User, as: "creator" }], }); - it("getPopups - should return only the popups created by the userId", async () => { - const userId = 2; - PopupMock.findAll = sinon - .stub(Popup, "findAll") - .resolves(popupList.filter((popup) => popup.createdBy === userId)); - const popups = await popupService.getPopups(userId); - expect(popups).not.to.deep.equal(popupList); - const params = PopupMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { - createdBy: userId, - }, - include: [{ model: db.User, as: "creator" }], - }); - expect(PopupMock.findAll.called).to.be.true; - }); - it("createPopup - should return the created popup", async () => { - const newPopup = popup().build(); - PopupMock.create = sinon.stub(Popup, "create").resolves(newPopup); - const createdPopup = await popupService.createPopup(newPopup); - expect(createdPopup).to.deep.equal(newPopup); - const params = PopupMock.create.getCall(0).args[0]; - expect(params).to.be.deep.equal(newPopup); - expect(PopupMock.create.called).to.be.true; - }); - it("deletePopup - should return false if no popup is deleted", async () => { - const popupId = 1; - PopupMock.destroy = sinon.stub(Popup, "destroy").resolves(0); - const isDeleted = await popupService.deletePopup(popupId); - expect(isDeleted).to.be.false; - const params = PopupMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id: popupId } }); - expect(PopupMock.destroy.called).to.be.true; - }); - it("deletePopup - should return true if the popup is deleted", async () => { - const popupId = 1; - PopupMock.destroy = sinon.stub(Popup, "destroy").resolves(1); - const isDeleted = await popupService.deletePopup(popupId); - expect(isDeleted).to.be.true; - const params = PopupMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id: popupId } }); - expect(PopupMock.destroy.called).to.be.true; + expect(PopupMock.findAll.called).to.be.true; + }); + it("getPopups - should return only the popups created by the userId", async () => { + const userId = 2; + PopupMock.findAll = sinon + .stub(Popup, "findAll") + .resolves(popupList.filter((popup) => popup.createdBy === userId)); + const popups = await popupService.getPopups(userId); + expect(popups).not.to.deep.equal(popupList); + const params = PopupMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { + createdBy: userId, + }, + include: [{ model: db.User, as: "creator" }], }); - it("updatePopup - should return null if no popup is updated", async () => { - const popupId = 1; - PopupMock.update = sinon.stub(Popup, "update").resolves([0, []]); - const popupData = { header: "new header" }; - const updatedPopupResult = await popupService.updatePopup( - popupId, - popupData - ); - expect(updatedPopupResult).to.be.null; - const params = PopupMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal(popupData); - expect(params[1]).to.be.deep.equal({ - where: { id: popupId }, - returning: true, - }); - expect(PopupMock.update.called).to.be.true; + expect(PopupMock.findAll.called).to.be.true; + }); + it("createPopup - should return the created popup", async () => { + const newPopup = popup().build(); + PopupMock.create = sinon.stub(Popup, "create").resolves(newPopup); + const createdPopup = await popupService.createPopup(newPopup); + expect(createdPopup).to.deep.equal(newPopup); + const params = PopupMock.create.getCall(0).args[0]; + expect(params).to.be.deep.equal(newPopup); + expect(PopupMock.create.called).to.be.true; + }); + it("deletePopup - should return false if no popup is deleted", async () => { + const popupId = 1; + PopupMock.destroy = sinon.stub(Popup, "destroy").resolves(0); + const isDeleted = await popupService.deletePopup(popupId); + expect(isDeleted).to.be.false; + const params = PopupMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id: popupId } }); + expect(PopupMock.destroy.called).to.be.true; + }); + it("deletePopup - should return true if the popup is deleted", async () => { + const popupId = 1; + PopupMock.destroy = sinon.stub(Popup, "destroy").resolves(1); + const isDeleted = await popupService.deletePopup(popupId); + expect(isDeleted).to.be.true; + const params = PopupMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id: popupId } }); + expect(PopupMock.destroy.called).to.be.true; + }); + it("updatePopup - should return null if no popup is updated", async () => { + const popupId = 1; + PopupMock.update = sinon.stub(Popup, "update").resolves([0, []]); + const popupData = { header: "new header" }; + const updatedPopupResult = await popupService.updatePopup( + popupId, + popupData + ); + expect(updatedPopupResult).to.be.null; + const params = PopupMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal(popupData); + expect(params[1]).to.be.deep.equal({ + where: { id: popupId }, + returning: true, }); - it("updatePopup - should return the updated popup", async () => { - const popupId = 1; - const updatedPopup = popup(popupId).build(); - PopupMock.update = sinon - .stub(Popup, "update") - .resolves([1, [updatedPopup]]); - const popupData = { header: "new header" }; - const updatedPopupResult = await popupService.updatePopup( - popupId, - popupData - ); - expect(updatedPopupResult).to.be.deep.equal(updatedPopup); - const params = PopupMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal(popupData); - expect(params[1]).to.be.deep.equal({ - where: { id: popupId }, - returning: true, - }); - expect(PopupMock.update.called).to.be.true; + expect(PopupMock.update.called).to.be.true; + }); + it("updatePopup - should return the updated popup", async () => { + const popupId = 1; + const updatedPopup = popup(popupId).build(); + PopupMock.update = sinon + .stub(Popup, "update") + .resolves([1, [updatedPopup]]); + const popupData = { header: "new header" }; + const updatedPopupResult = await popupService.updatePopup( + popupId, + popupData + ); + expect(updatedPopupResult).to.be.deep.equal(updatedPopup); + const params = PopupMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal(popupData); + expect(params[1]).to.be.deep.equal({ + where: { id: popupId }, + returning: true, }); - it("getPopupById - should return the found popup", async () => { - const popupId = 1; - const foundPopup = popup(popupId).build(); - PopupMock.findOne = sinon.stub(Popup, "findOne").resolves(foundPopup); - const popupResult = await popupService.getPopupById(popupId); - expect(popupResult).to.be.deep.equal(foundPopup); - const params = PopupMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: popupId }, - include: [{ model: db.User, as: "creator" }], - }); - expect(PopupMock.findOne.called).to.be.true; + expect(PopupMock.update.called).to.be.true; + }); + it("getPopupById - should return the found popup", async () => { + const popupId = 1; + const foundPopup = popup(popupId).build(); + PopupMock.findOne = sinon.stub(Popup, "findOne").resolves(foundPopup); + const popupResult = await popupService.getPopupById(popupId); + expect(popupResult).to.be.deep.equal(foundPopup); + const params = PopupMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: popupId }, + include: [{ model: db.User, as: "creator" }], }); - it("getPopupById - should throw an error if the popup is not found", async () => { - const popupId = 1; - PopupMock.findOne = sinon.stub(Popup, "findOne").rejects(); - try { - await popupService.getPopupById(popupId); - } catch (error) { - expect(error.message).to.be.equal("Error retrieving popup by ID"); - } - const params = PopupMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: popupId }, - include: [{ model: db.User, as: "creator" }], - }); - expect(PopupMock.findOne.called).to.be.true; + expect(PopupMock.findOne.called).to.be.true; + }); + it("getPopupById - should throw an error if the popup is not found", async () => { + const popupId = 1; + PopupMock.findOne = sinon.stub(Popup, "findOne").rejects(); + try { + await popupService.getPopupById(popupId); + } catch (error) { + expect(error.message).to.be.equal("Error retrieving popup by ID"); + } + const params = PopupMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: popupId }, + include: [{ model: db.User, as: "creator" }], }); + expect(PopupMock.findOne.called).to.be.true; }); -})(); +}); diff --git a/backend/src/test/unit/services/team.test.js b/backend/src/test/unit/services/team.test.js index 04a3f124..8065a800 100644 --- a/backend/src/test/unit/services/team.test.js +++ b/backend/src/test/unit/services/team.test.js @@ -1,200 +1,198 @@ -(async () => { - const { describe, it, beforeEach, afterEach } = await import("mocha"); - const sinon = await import("sinon"); - const { expect } = await import("chai"); - const db = require("../../../models/index.js"); - const { UserBuilder, validList } = require("../../mocks/user.mock.js"); - const TeamService = require("../../../service/team.service.js"); +const { describe, it, beforeEach, afterEach } = require("mocha"); +const sinon = require("sinon"); +const { expect } = require("chai"); +const db = require("../../../models/index.js"); +const { UserBuilder, validList } = require("../../mocks/user.mock.js"); +const TeamService = require("../../../service/team.service.js"); - const Invite = db.Invite; - const User = db.User; - const Team = db.Team; - const Token = db.Token; - const user = UserBuilder.user; - const service = new TeamService(); +const Invite = db.Invite; +const User = db.User; +const Team = db.Team; +const Token = db.Token; +const user = UserBuilder.user; +const service = new TeamService(); - describe("Test team service", () => { - const UserMock = {}; - const TeamMock = {}; - const InviteMock = {}; - const TokenMock = {}; - let commit; - let rollback; - beforeEach(() => { - commit = sinon.spy(); - rollback = sinon.spy(); - sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ - commit, - rollback, - })); - }); - afterEach(sinon.restore); - it("createTeam - should create the team", async () => { - TeamMock.create = sinon - .stub(Team, "create") - .resolves({ id: 1, name: "team" }); - const team = await service.createTeam("team"); - expect(team).to.deep.equal({ id: 1, name: "team" }); - expect(commit.called).to.be.true; - }); - it("createTeam - should rollback the transaction and throw an error if something goes wrong", async () => { - TeamMock.create = sinon.stub(Team, "create").rejects(); - try { - await service.createTeam("team"); - } catch (err) { - expect(rollback.called).to.be.true; - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal("Failed to create team"); - } - }); - it("getTeam - should return the team and the users on the team if every thing goes right", async () => { - TeamMock.findOne = sinon - .stub(Team, "findOne") - .resolves({ id: 1, name: "team" }); - UserMock.findAll = sinon.stub(User, "findAll").resolves(validList); - const team = await service.getTeam(); - expect(team).to.deep.equal({ - team: { id: 1, name: "team" }, - users: validList, - }); - }); - it("getTeam - should throw an error if something goes wrong", async () => { - TeamMock.findOne = sinon.stub(Team, "findOne").rejects(); - try { - await service.getTeam(); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal("Failed to retrieve team"); - } +describe("Test team service", () => { + const UserMock = {}; + const TeamMock = {}; + const InviteMock = {}; + const TokenMock = {}; + let commit; + let rollback; + beforeEach(() => { + commit = sinon.spy(); + rollback = sinon.spy(); + sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ + commit, + rollback, + })); + }); + afterEach(sinon.restore); + it("createTeam - should create the team", async () => { + TeamMock.create = sinon + .stub(Team, "create") + .resolves({ id: 1, name: "team" }); + const team = await service.createTeam("team"); + expect(team).to.deep.equal({ id: 1, name: "team" }); + expect(commit.called).to.be.true; + }); + it("createTeam - should rollback the transaction and throw an error if something goes wrong", async () => { + TeamMock.create = sinon.stub(Team, "create").rejects(); + try { + await service.createTeam("team"); + } catch (err) { + expect(rollback.called).to.be.true; + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Failed to create team"); + } + }); + it("getTeam - should return the team and the users on the team if every thing goes right", async () => { + TeamMock.findOne = sinon + .stub(Team, "findOne") + .resolves({ id: 1, name: "team" }); + UserMock.findAll = sinon.stub(User, "findAll").resolves(validList); + const team = await service.getTeam(); + expect(team).to.deep.equal({ + team: { id: 1, name: "team" }, + users: validList, }); - it("getTeamCount - should return an object with a boolean if the teamCount is bigger than 0", async () => { - TeamMock.count = sinon.stub(Team, "count").resolves(1); - const teamCount = await service.getTeamCount(); - expect(teamCount).to.deep.equal({ teamExists: true }); + }); + it("getTeam - should throw an error if something goes wrong", async () => { + TeamMock.findOne = sinon.stub(Team, "findOne").rejects(); + try { + await service.getTeam(); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Failed to retrieve team"); + } + }); + it("getTeamCount - should return an object with a boolean if the teamCount is bigger than 0", async () => { + TeamMock.count = sinon.stub(Team, "count").resolves(1); + const teamCount = await service.getTeamCount(); + expect(teamCount).to.deep.equal({ teamExists: true }); + }); + it("getTeamCount - should throw an error if something goes wrong", async () => { + TeamMock.count = sinon.stub(Team, "count").rejects(); + try { + await service.getTeamCount(); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Failed to get team count"); + } + }); + it("updateTeam - should update the teams name", async () => { + TeamMock.update = sinon.stub(Team, "update").resolves(1); + await service.updateTeam("newName"); + expect(commit.called).to.be.true; + const params = TeamMock.update.getCall(0).args; + expect(params[0]).to.deep.equal({ + name: "newName", }); - it("getTeamCount - should throw an error if something goes wrong", async () => { - TeamMock.count = sinon.stub(Team, "count").rejects(); - try { - await service.getTeamCount(); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal("Failed to get team count"); - } + expect(params[1]).to.deep.equal({ + where: {}, }); - it("updateTeam - should update the teams name", async () => { - TeamMock.update = sinon.stub(Team, "update").resolves(1); + }); + it("updateTeam - should throw an error if something goes wrong", async () => { + TeamMock.update = sinon.stub(Team, "update").rejects(); + try { await service.updateTeam("newName"); - expect(commit.called).to.be.true; - const params = TeamMock.update.getCall(0).args; - expect(params[0]).to.deep.equal({ - name: "newName", - }); - expect(params[1]).to.deep.equal({ - where: {}, - }); - }); - it("updateTeam - should throw an error if something goes wrong", async () => { - TeamMock.update = sinon.stub(Team, "update").rejects(); - try { - await service.updateTeam("newName"); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal("Error Updating Team"); - } - }); - it("removeUserFromTeam - should throw an error if the userId is equal to the memberId", async () => { - try { - await service.removeUserFromTeam(1, 1); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal( - "Failed to remove user from team ~ User can't remove itself through team list" - ); - } - }); - it("removeUserFromTeam - should throw an error if the user to be removed is not found", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - try { - await service.removeUserFromTeam(1, 2); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal( - "Failed to remove user from team ~ User to be removed not found" - ); - } - }); - it("removeUserFromTeam - should remove the user, the invite and the token if everything goes right", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - InviteMock.destroy = sinon.stub(Invite, "destroy").resolves(1); - UserMock.destroy = sinon.stub(User, "destroy").resolves(1); - TokenMock.destroy = sinon.stub(Token, "destroy").resolves(1); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Error Updating Team"); + } + }); + it("removeUserFromTeam - should throw an error if the userId is equal to the memberId", async () => { + try { + await service.removeUserFromTeam(1, 1); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal( + "Failed to remove user from team ~ User can't remove itself through team list" + ); + } + }); + it("removeUserFromTeam - should throw an error if the user to be removed is not found", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + try { await service.removeUserFromTeam(1, 2); - expect(commit.called).to.be.true; - }); - it("removeUserFromTeam - should throw an error if something goes wrong", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - UserMock.destroy = sinon.stub(User, "destroy").rejects(); - try { - await service.removeUserFromTeam(1, 2); - } catch (err) { - expect(rollback.called).to.be.true; - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal( - "Failed to remove user from team ~ Error" - ); - } - }); - it("updateUserRole - should throw an error if the member is not found", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(null); - try { - await service.updateUserRole(1, "member"); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal( - "Failed to update user role ~ User Not Found" - ); - expect(rollback.called).to.be.true; - } - }); - it("updateUserRole - should throw an error if the team has only one admin", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - UserMock.count = sinon.stub(User, "count").resolves(1); - try { - await service.updateUserRole(1, "member"); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal("Failed to update user role ~ "); - expect(rollback.called).to.be.true; - } - }); - it("updateUserRole - should update the role", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - UserMock.count = sinon.stub(User, "count").resolves(2); - UserMock.update = sinon - .stub(User, "update") - .resolves({ ...user().build(), role: "member" }); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal( + "Failed to remove user from team ~ User to be removed not found" + ); + } + }); + it("removeUserFromTeam - should remove the user, the invite and the token if everything goes right", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + InviteMock.destroy = sinon.stub(Invite, "destroy").resolves(1); + UserMock.destroy = sinon.stub(User, "destroy").resolves(1); + TokenMock.destroy = sinon.stub(Token, "destroy").resolves(1); + await service.removeUserFromTeam(1, 2); + expect(commit.called).to.be.true; + }); + it("removeUserFromTeam - should throw an error if something goes wrong", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + UserMock.destroy = sinon.stub(User, "destroy").rejects(); + try { + await service.removeUserFromTeam(1, 2); + } catch (err) { + expect(rollback.called).to.be.true; + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal( + "Failed to remove user from team ~ Error" + ); + } + }); + it("updateUserRole - should throw an error if the member is not found", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(null); + try { await service.updateUserRole(1, "member"); - expect(commit.called).to.be.true; - expect(UserMock.update.called).to.be.true; - const params = UserMock.update.getCall(0).args; - expect(params[0]).to.deep.equal({ - role: "2", - }); - expect(params[1]).to.deep.equal({ - where: { id: 1 }, - }); - }); - it("updateUserRole - should throw an error if something goes wrong", async () => { - UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); - UserMock.count = sinon.stub(User, "count").resolves(2); - UserMock.update = sinon.stub(User, "update").rejects(); - try { - await service.updateUserRole(1, "member"); - } catch (err) { - expect(err).to.be.instanceOf(Error); - expect(err.message).to.be.equal("Failed to update user role ~ Error"); - expect(rollback.called).to.be.true; - } + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal( + "Failed to update user role ~ User Not Found" + ); + expect(rollback.called).to.be.true; + } + }); + it("updateUserRole - should throw an error if the team has only one admin", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + UserMock.count = sinon.stub(User, "count").resolves(1); + try { + await service.updateUserRole(1, "member"); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Failed to update user role ~ "); + expect(rollback.called).to.be.true; + } + }); + it("updateUserRole - should update the role", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + UserMock.count = sinon.stub(User, "count").resolves(2); + UserMock.update = sinon + .stub(User, "update") + .resolves({ ...user().build(), role: "member" }); + await service.updateUserRole(1, "member"); + expect(commit.called).to.be.true; + expect(UserMock.update.called).to.be.true; + const params = UserMock.update.getCall(0).args; + expect(params[0]).to.deep.equal({ + role: "2", + }); + expect(params[1]).to.deep.equal({ + where: { id: 1 }, }); }); -})(); + it("updateUserRole - should throw an error if something goes wrong", async () => { + UserMock.findOne = sinon.stub(User, "findOne").resolves(user().build()); + UserMock.count = sinon.stub(User, "count").resolves(2); + UserMock.update = sinon.stub(User, "update").rejects(); + try { + await service.updateUserRole(1, "member"); + } catch (err) { + expect(err).to.be.instanceOf(Error); + expect(err.message).to.be.equal("Failed to update user role ~ Error"); + expect(rollback.called).to.be.true; + } + }); +}); diff --git a/backend/src/test/unit/services/tour.test.js b/backend/src/test/unit/services/tour.test.js index 99e0635d..bd71c3a0 100644 --- a/backend/src/test/unit/services/tour.test.js +++ b/backend/src/test/unit/services/tour.test.js @@ -1,115 +1,113 @@ -(async () => { - const { describe, it, afterEach } = await import("mocha"); - const { expect } = await import("chai"); - const sinon = await import("sinon"); - const db = require("../../../models/index.js"); - const mocks = require("../../mocks/tour.mock.js"); - const tourService = require("../../../service/tour.service.js"); +const { describe, it, afterEach } = require("mocha"); +const { expect } = require("chai"); +const sinon = require("sinon"); +const db = require("../../../models/index.js"); +const mocks = require("../../mocks/tour.mock.js"); +const tourService = require("../../../service/tour.service.js"); - const Tour = db.Tour; - const tour = mocks.TourBuilder.tour; +const Tour = db.Tour; +const tour = mocks.TourBuilder.tour; - describe("Test tour service", () => { - const TourMock = {}; - afterEach(sinon.restore); - it("getAllTours - should return all tours with it's users", async () => { - TourMock.findAll = sinon.stub(Tour, "findAll").resolves(mocks.toursList); - const tours = await tourService.getAllTours(); - expect(tours).to.be.deep.equal(mocks.toursList); - expect(TourMock.findAll.called).to.be.true; - const params = TourMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - include: [{ model: db.User, as: "creator" }], - }); +describe("Test tour service", () => { + const TourMock = {}; + afterEach(sinon.restore); + it("getAllTours - should return all tours with it's users", async () => { + TourMock.findAll = sinon.stub(Tour, "findAll").resolves(mocks.toursList); + const tours = await tourService.getAllTours(); + expect(tours).to.be.deep.equal(mocks.toursList); + expect(TourMock.findAll.called).to.be.true; + const params = TourMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + include: [{ model: db.User, as: "creator" }], }); - it("getTours - should return only the tours created by the specific user", async () => { - const userId = 1; - TourMock.findAll = sinon.stub(Tour, "findAll").resolves(mocks.toursList); - const tours = await tourService.getTours(userId); - expect(tours).to.be.deep.equal(mocks.toursList); - expect(TourMock.findAll.called).to.be.true; - const params = TourMock.findAll.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { createdBy: userId }, - include: [{ model: db.User, as: "creator" }], - }); - }); - it("createTour - should return the tour created", async () => { - const newTour = tour(1).build(); - TourMock.create = sinon.stub(Tour, "create").resolves(newTour); - const createdTour = await tourService.createTour(newTour); - expect(createdTour).to.be.deep.equal(newTour); - expect(TourMock.create.called).to.be.true; - const params = TourMock.create.getCall(0).args[0]; - expect(params).to.be.deep.equal(newTour); - }); - it("deleteTour - if no tour is deleted, should return false", async () => { - const id = 1; - TourMock.destroy = sinon.stub(Tour, "destroy").resolves(0); - const isDeleted = await tourService.deleteTour(id); - expect(isDeleted).to.be.false; - expect(TourMock.destroy.called).to.be.true; - const params = TourMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id } }); - }); - it("deleteTour - if a tour is deleted, should return true", async () => { - const id = 1; - TourMock.destroy = sinon.stub(Tour, "destroy").resolves(1); - const isDeleted = await tourService.deleteTour(id); - expect(isDeleted).to.be.true; - expect(TourMock.destroy.called).to.be.true; - const params = TourMock.destroy.getCall(0).args[0]; - expect(params).to.be.deep.equal({ where: { id } }); - }); - it("updateTour - should return null if no tour is updated", async () => { - const id = 1; - const data = tour(1).build(); - TourMock.update = sinon.stub(Tour, "update").resolves([0, []]); - const updatedTour = await tourService.updateTour(id, data); - expect(updatedTour).to.be.null; - expect(TourMock.update.called).to.be.true; - const params = TourMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal(data); - expect(params[1]).to.be.deep.equal({ where: { id }, returning: true }); - }); - it("updateTour - should return the updated tour", async () => { - const id = 1; - const data = tour(1).build(); - TourMock.update = sinon.stub(Tour, "update").resolves([1, [data]]); - const updatedTour = await tourService.updateTour(id, data); - expect(updatedTour).to.be.deep.equal(data); - expect(TourMock.update.called).to.be.true; - const params = TourMock.update.getCall(0).args; - expect(params[0]).to.be.deep.equal(data); - expect(params[1]).to.be.deep.equal({ where: { id }, returning: true }); + }); + it("getTours - should return only the tours created by the specific user", async () => { + const userId = 1; + TourMock.findAll = sinon.stub(Tour, "findAll").resolves(mocks.toursList); + const tours = await tourService.getTours(userId); + expect(tours).to.be.deep.equal(mocks.toursList); + expect(TourMock.findAll.called).to.be.true; + const params = TourMock.findAll.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { createdBy: userId }, + include: [{ model: db.User, as: "creator" }], }); - it("getTourById - should return the found tour", async () => { - const tourId = 1; - const expectedTour = tour(1).build(); - TourMock.findOne = sinon.stub(Tour, "findOne").resolves(expectedTour); - const foundTour = await tourService.getTourById(tourId); - expect(foundTour).to.be.deep.equal(expectedTour); - expect(TourMock.findOne.called).to.be.true; - const params = TourMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: tourId }, - include: [{ model: db.User, as: "creator" }], - }); + }); + it("createTour - should return the tour created", async () => { + const newTour = tour(1).build(); + TourMock.create = sinon.stub(Tour, "create").resolves(newTour); + const createdTour = await tourService.createTour(newTour); + expect(createdTour).to.be.deep.equal(newTour); + expect(TourMock.create.called).to.be.true; + const params = TourMock.create.getCall(0).args[0]; + expect(params).to.be.deep.equal(newTour); + }); + it("deleteTour - if no tour is deleted, should return false", async () => { + const id = 1; + TourMock.destroy = sinon.stub(Tour, "destroy").resolves(0); + const isDeleted = await tourService.deleteTour(id); + expect(isDeleted).to.be.false; + expect(TourMock.destroy.called).to.be.true; + const params = TourMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id } }); + }); + it("deleteTour - if a tour is deleted, should return true", async () => { + const id = 1; + TourMock.destroy = sinon.stub(Tour, "destroy").resolves(1); + const isDeleted = await tourService.deleteTour(id); + expect(isDeleted).to.be.true; + expect(TourMock.destroy.called).to.be.true; + const params = TourMock.destroy.getCall(0).args[0]; + expect(params).to.be.deep.equal({ where: { id } }); + }); + it("updateTour - should return null if no tour is updated", async () => { + const id = 1; + const data = tour(1).build(); + TourMock.update = sinon.stub(Tour, "update").resolves([0, []]); + const updatedTour = await tourService.updateTour(id, data); + expect(updatedTour).to.be.null; + expect(TourMock.update.called).to.be.true; + const params = TourMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal(data); + expect(params[1]).to.be.deep.equal({ where: { id }, returning: true }); + }); + it("updateTour - should return the updated tour", async () => { + const id = 1; + const data = tour(1).build(); + TourMock.update = sinon.stub(Tour, "update").resolves([1, [data]]); + const updatedTour = await tourService.updateTour(id, data); + expect(updatedTour).to.be.deep.equal(data); + expect(TourMock.update.called).to.be.true; + const params = TourMock.update.getCall(0).args; + expect(params[0]).to.be.deep.equal(data); + expect(params[1]).to.be.deep.equal({ where: { id }, returning: true }); + }); + it("getTourById - should return the found tour", async () => { + const tourId = 1; + const expectedTour = tour(1).build(); + TourMock.findOne = sinon.stub(Tour, "findOne").resolves(expectedTour); + const foundTour = await tourService.getTourById(tourId); + expect(foundTour).to.be.deep.equal(expectedTour); + expect(TourMock.findOne.called).to.be.true; + const params = TourMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: tourId }, + include: [{ model: db.User, as: "creator" }], }); - it("getTourById - should throw an error if the tour is not found", async () => { - const tourId = 1; - TourMock.findOne = sinon.stub(Tour, "findOne").rejects(); - try { - await tourService.getTourById(tourId); - } catch (error) { - expect(error.message).to.be.equal("Error retrieving tour by ID"); - } - expect(TourMock.findOne.called).to.be.true; - const params = TourMock.findOne.getCall(0).args[0]; - expect(params).to.be.deep.equal({ - where: { id: tourId }, - include: [{ model: db.User, as: "creator" }], - }); + }); + it("getTourById - should throw an error if the tour is not found", async () => { + const tourId = 1; + TourMock.findOne = sinon.stub(Tour, "findOne").rejects(); + try { + await tourService.getTourById(tourId); + } catch (error) { + expect(error.message).to.be.equal("Error retrieving tour by ID"); + } + expect(TourMock.findOne.called).to.be.true; + const params = TourMock.findOne.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { id: tourId }, + include: [{ model: db.User, as: "creator" }], }); }); -})(); +}); diff --git a/backend/src/test/unit/services/user.test.js b/backend/src/test/unit/services/user.test.js index 871a3831..4385c022 100644 --- a/backend/src/test/unit/services/user.test.js +++ b/backend/src/test/unit/services/user.test.js @@ -1,273 +1,268 @@ -(async () => { - const { describe, it, afterEach } = await import("mocha"); - const { expect } = await import("chai"); - const sinon = await import("sinon"); - const db = require("../../../models/index.js"); - const UserService = require("../../../service/user.service.js"); - const mocks = require("../../mocks/user.mock.js"); +const { describe, it, afterEach } = require("mocha"); +const { expect } = require("chai"); +const sinon = require("sinon"); +const db = require("../../../models/index.js"); +const UserService = require("../../../service/user.service.js"); +const mocks = require("../../mocks/user.mock.js"); - const service = new UserService(); +const service = new UserService(); - describe("Unit test user service", () => { - let User; - let Invite; - let Token; - let Sequelize; - let commit; - let rollback; - beforeEach(() => { - commit = sinon.spy(); - rollback = sinon.spy(); - sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ - commit, - rollback, - })); - Sequelize = sinon.spy(db, "Sequelize"); - }); - afterEach(() => { - sinon.restore(); - }); - it("getUser - should throw an error if something goes wrong", async () => { - User = sinon.stub(db.User, "findOne").rejects(); - try { - await service.getUser(1); - } catch (err) { - expect(err).to.have.property("message", "Error retrieving User by ID"); - expect(err).to.be.instanceOf(Error); - } - expect(User.callCount).to.be.equal(1); - expect( - User.calledWith({ - where: { id: 1 }, - }) - ).to.be.true; - }); - it("getUser - should return the user if everything is ok", async () => { - User = sinon.stub(db.User, "findOne").resolves(mocks.validUser); - const user = await service.getUser(1); - expect(User.threw()).to.be.false; - expect(User.callCount).to.be.equal(1); - expect( - User.calledWith({ - where: { id: 1 }, - }) - ).to.be.true; - expect(user).to.be.equal(mocks.validUser); - }); - it("getUsers - should return all the users if the search param is an empty string", async () => { - User = sinon - .stub(db.User, "findAndCountAll") - .resolves(mocks.validList.slice(0, 2)); - const users = await service.getUsers({ search: "", page: 1, limit: 2 }); +describe("Unit test user service", () => { + let User; + let Invite; + let Token; + let Sequelize; + let commit; + let rollback; + beforeEach(() => { + commit = sinon.spy(); + rollback = sinon.spy(); + sinon.stub(db.sequelize, "transaction").callsFake(async () => ({ + commit, + rollback, + })); + Sequelize = sinon.spy(db, "Sequelize"); + }); + afterEach(() => { + sinon.restore(); + }); + it("getUser - should throw an error if something goes wrong", async () => { + User = sinon.stub(db.User, "findOne").rejects(); + try { + await service.getUser(1); + } catch (err) { + expect(err).to.have.property("message", "Error retrieving User by ID"); + expect(err).to.be.instanceOf(Error); + } + expect(User.callCount).to.be.equal(1); + expect( + User.calledWith({ + where: { id: 1 }, + }) + ).to.be.true; + }); + it("getUser - should return the user if everything is ok", async () => { + User = sinon.stub(db.User, "findOne").resolves(mocks.validUser); + const user = await service.getUser(1); + expect(User.threw()).to.be.false; + expect(User.callCount).to.be.equal(1); + expect( + User.calledWith({ + where: { id: 1 }, + }) + ).to.be.true; + expect(user).to.be.equal(mocks.validUser); + }); + it("getUsers - should return all the users if the search param is an empty string", async () => { + User = sinon + .stub(db.User, "findAndCountAll") + .resolves(mocks.validList.slice(0, 2)); + const users = await service.getUsers({ search: "", page: 1, limit: 2 }); - expect( - User.calledWith({ - where: { - [Sequelize.Op.or]: [ - { - name: { - [Sequelize.Op.like]: `%%`, - }, + expect( + User.calledWith({ + where: { + [Sequelize.Op.or]: [ + { + name: { + [Sequelize.Op.like]: `%%`, }, - { - surname: { - [Sequelize.Op.like]: `%%`, - }, + }, + { + surname: { + [Sequelize.Op.like]: `%%`, }, - ], - }, - limit: 2, - offset: 0, - }) - ).to.be.true; - expect(users).not.to.be.equal(mocks.validList); - expect(users).to.have.length(2); + }, + ], + }, + limit: 2, + offset: 0, + }) + ).to.be.true; + expect(users).not.to.be.equal(mocks.validList); + expect(users).to.have.length(2); + }); + it("getUsers - should filter users when search param is provided", async () => { + User = sinon + .stub(db.User, "findAndCountAll") + .resolves(mocks.validList.filter((u) => u.name.includes("Harry"))); + await service.getUsers({ search: "Harry", page: 1, limit: 2 }); + const params = User.getCall(0).args[0]; + expect(params).to.be.deep.equal({ + where: { + [Sequelize.Op.or]: [ + { name: { [Sequelize.Op.like]: `%Harry%` } }, + { surname: { [Sequelize.Op.like]: `%Harry%` } }, + ], + }, + limit: 2, + offset: 0, + }); + }); + it("getUsers - should return the correct pagination when the page changes", async () => { + User = sinon + .stub(db.User, "findAndCountAll") + .onFirstCall() + .resolves(mocks.validList.slice(0, 2)) + .onSecondCall() + .resolves(mocks.validList.slice(2, 4)); + const firstList = await service.getUsers({ + search: "", + page: 1, + limit: 2, }); - it("getUsers - should filter users when search param is provided", async () => { - User = sinon - .stub(db.User, "findAndCountAll") - .resolves(mocks.validList.filter((u) => u.name.includes("Harry"))); - await service.getUsers({ search: "Harry", page: 1, limit: 2 }); - const params = User.getCall(0).args[0]; - expect(params).to.be.deep.equal({ + expect( + User.calledWith({ where: { [Sequelize.Op.or]: [ - { name: { [Sequelize.Op.like]: `%Harry%` } }, - { surname: { [Sequelize.Op.like]: `%Harry%` } }, + { + name: { + [Sequelize.Op.like]: `%%`, + }, + }, + { + surname: { + [Sequelize.Op.like]: `%%`, + }, + }, ], }, limit: 2, offset: 0, - }); + }) + ).to.be.true; + expect(firstList).not.to.be.equal(mocks.validList); + expect(firstList).to.have.length(2); + const secondList = await service.getUsers({ + search: "", + page: 2, + limit: 2, }); - it("getUsers - should return the correct pagination when the page changes", async () => { - User = sinon - .stub(db.User, "findAndCountAll") - .onFirstCall() - .resolves(mocks.validList.slice(0, 2)) - .onSecondCall() - .resolves(mocks.validList.slice(2, 4)); - const firstList = await service.getUsers({ - search: "", - page: 1, - limit: 2, - }); - expect( - User.calledWith({ - where: { - [Sequelize.Op.or]: [ - { - name: { - [Sequelize.Op.like]: `%%`, - }, + expect( + User.calledWith({ + where: { + [Sequelize.Op.or]: [ + { + name: { + [Sequelize.Op.like]: `%%`, }, - { - surname: { - [Sequelize.Op.like]: `%%`, - }, + }, + { + surname: { + [Sequelize.Op.like]: `%%`, }, - ], - }, - limit: 2, - offset: 0, - }) - ).to.be.true; - expect(firstList).not.to.be.equal(mocks.validList); - expect(firstList).to.have.length(2); - const secondList = await service.getUsers({ - search: "", - page: 2, + }, + ], + }, limit: 2, - }); - expect( - User.calledWith({ - where: { - [Sequelize.Op.or]: [ - { - name: { - [Sequelize.Op.like]: `%%`, - }, - }, - { - surname: { - [Sequelize.Op.like]: `%%`, - }, - }, - ], - }, - limit: 2, - offset: 2, - }) - ).to.be.true; - expect(secondList).to.have.length(2); - expect(secondList).not.to.be.equal(firstList); - }); - it("getUsers - should throw the error message 'Error retrieving users list' if something goes wrong", async () => { - User = sinon.stub(db.User, "findAndCountAll").rejects({}); - try { - await service.getUsers({ search: "", page: 1, limit: 2 }); - } catch (error) { - expect(error).to.have.property( - "message", - "Error retrieving users list" - ); - expect(error).to.be.instanceOf(Error); - } - expect( - User.calledWith({ - where: { - [Sequelize.Op.or]: [ - { - name: { - [Sequelize.Op.like]: `%%`, - }, + offset: 2, + }) + ).to.be.true; + expect(secondList).to.have.length(2); + expect(secondList).not.to.be.equal(firstList); + }); + it("getUsers - should throw the error message 'Error retrieving users list' if something goes wrong", async () => { + User = sinon.stub(db.User, "findAndCountAll").rejects({}); + try { + await service.getUsers({ search: "", page: 1, limit: 2 }); + } catch (error) { + expect(error).to.have.property("message", "Error retrieving users list"); + expect(error).to.be.instanceOf(Error); + } + expect( + User.calledWith({ + where: { + [Sequelize.Op.or]: [ + { + name: { + [Sequelize.Op.like]: `%%`, }, - { - surname: { - [Sequelize.Op.like]: `%%`, - }, + }, + { + surname: { + [Sequelize.Op.like]: `%%`, }, - ], - }, - limit: 2, - offset: 0, - }) - ).to.be.true; - expect(User.callCount).to.be.equal(1); - }); - it("updateUser - if the user is updated, should return the updated user", async () => { - const details = { - name: "Harry", - surname: "Potter", - email: "harry.potter@wizards.com", - }; - User = sinon - .stub(db.User, "update") - .resolves([1, [{ ...mocks.validUser, ...details }]]); - const user = await service.updateUser(1, details); - expect( - User.calledWith(details, { - where: { id: 1 }, - returning: true, - }) - ).to.be.true; - expect(user).not.to.equal(mocks.validUser); - expect(user).to.have.property("name", "Harry"); - }); - it("updateUser - if something goes wrong, should throw an error 'Error updating user'", async () => { - const details = { - name: "Harry", - surname: "Potter", - email: "harry.potter@wizards.com", - }; - User = sinon.stub(db.User, "update").rejects(); - try { - await service.updateUser(1, details); - } catch (error) { - expect(error).to.have.property("message", "Error updating user"); - expect(error).to.be.instanceOf(Error); - } - expect( - User.calledWith(details, { - where: { id: 1 }, - returning: true, - }) - ).to.be.true; - }); - it("deleteUser - if the user is the only admin role, should throw an error", async () => { - sinon.stub(db.User, "findOne").resolves(mocks.validUser); - sinon.stub(db.User, "count").resolves(1); - User = sinon.stub(db.User, "destroy"); - Token = sinon.stub(db.Token, "destroy"); - Invite = sinon.stub(db.Invite, "destroy"); - try { - await service.deleteUser(1); - } catch (error) { - expect(error).to.be.instanceOf(Error); - expect(error).to.have.property( - "message", - "Error deleting user ~ The team has only single admin and can't delete themselves" - ); - } - expect(User.called).to.be.false; - expect(Invite.called).to.be.false; - expect(Token.called).to.be.false; - expect(commit.called).to.be.false; - expect(rollback.called).to.be.true; - }); - it("deleteUser - if the user is not the admin role, should delete the user, the invite and the token", async () => { - sinon.stub(db.User, "findOne").resolves(mocks.validUser); - sinon.stub(db.User, "count").resolves(2); - User = sinon.stub(db.User, "destroy"); - Token = sinon.stub(db.Token, "destroy"); - Invite = sinon.stub(db.Invite, "destroy"); + }, + ], + }, + limit: 2, + offset: 0, + }) + ).to.be.true; + expect(User.callCount).to.be.equal(1); + }); + it("updateUser - if the user is updated, should return the updated user", async () => { + const details = { + name: "Harry", + surname: "Potter", + email: "harry.potter@wizards.com", + }; + User = sinon + .stub(db.User, "update") + .resolves([1, [{ ...mocks.validUser, ...details }]]); + const user = await service.updateUser(1, details); + expect( + User.calledWith(details, { + where: { id: 1 }, + returning: true, + }) + ).to.be.true; + expect(user).not.to.equal(mocks.validUser); + expect(user).to.have.property("name", "Harry"); + }); + it("updateUser - if something goes wrong, should throw an error 'Error updating user'", async () => { + const details = { + name: "Harry", + surname: "Potter", + email: "harry.potter@wizards.com", + }; + User = sinon.stub(db.User, "update").rejects(); + try { + await service.updateUser(1, details); + } catch (error) { + expect(error).to.have.property("message", "Error updating user"); + expect(error).to.be.instanceOf(Error); + } + expect( + User.calledWith(details, { + where: { id: 1 }, + returning: true, + }) + ).to.be.true; + }); + it("deleteUser - if the user is the only admin role, should throw an error", async () => { + sinon.stub(db.User, "findOne").resolves(mocks.validUser); + sinon.stub(db.User, "count").resolves(1); + User = sinon.stub(db.User, "destroy"); + Token = sinon.stub(db.Token, "destroy"); + Invite = sinon.stub(db.Invite, "destroy"); + try { + await service.deleteUser(1); + } catch (error) { + expect(error).to.be.instanceOf(Error); + expect(error).to.have.property( + "message", + "Error deleting user ~ The team has only single admin and can't delete themselves" + ); + } + expect(User.called).to.be.false; + expect(Invite.called).to.be.false; + expect(Token.called).to.be.false; + expect(commit.called).to.be.false; + expect(rollback.called).to.be.true; + }); + it("deleteUser - if the user is not the admin role, should delete the user, the invite and the token", async () => { + sinon.stub(db.User, "findOne").resolves(mocks.validUser); + sinon.stub(db.User, "count").resolves(2); + User = sinon.stub(db.User, "destroy"); + Token = sinon.stub(db.Token, "destroy"); + Invite = sinon.stub(db.Invite, "destroy"); - const result = await service.deleteUser(1); - expect(User.called).to.be.true; - expect(Invite.called).to.be.true; - expect(Token.called).to.be.true; - expect(commit.called).to.be.true; - expect(rollback.called).to.be.false; - }); + const result = await service.deleteUser(1); + expect(User.called).to.be.true; + expect(Invite.called).to.be.true; + expect(Token.called).to.be.true; + expect(commit.called).to.be.true; + expect(rollback.called).to.be.false; }); -})(); +}); From 3cf29b6a8f54a37c3a19c11cb9cab51fc9a1a995 Mon Sep 17 00:00:00 2001 From: Debora Serra Date: Sat, 7 Dec 2024 11:31:33 -0800 Subject: [PATCH 121/178] docs: remove --watch from test script --- backend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/package.json b/backend/package.json index 9bcc84a0..21211d1b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -7,7 +7,7 @@ "start": "node index.js", "pretest": "NODE_ENV=test docker rm -f test-postgres || true && docker run --name test-postgres --env-file .env.test -p 5432:5432 -d postgres && npx wait-on tcp:5432 && npx sequelize-cli db:create --env test || true && npx sequelize-cli db:migrate --env test", "posttest": "docker stop test-postgres && docker rm test-postgres", - "test": "NODE_ENV=test nyc mocha --extension js,mjs --watch 'src/test/**/*.test.*'", + "test": "NODE_ENV=test nyc mocha --extension js,mjs 'src/test/**/*.test.*'", "test:e2e": "npm run pretest && NODE_ENV=test mocha 'src/test/e2e/**/*.test.mjs'", "test:unit": "NODE_ENV=test mocha 'src/test/unit/**/*.test.js' --watch", "dev": "nodemon index.js", From 5859fd514f98b15d4a22c76d2f9e069c1a6afd42 Mon Sep 17 00:00:00 2001 From: tunckiral Date: Tue, 10 Dec 2024 03:13:28 -0500 Subject: [PATCH 122/178] corrections --- backend/.env | 2 +- backend/Dockerfile | 2 +- backend/package-lock.json | 552 ++------------------------- backend/package.json | 2 +- backend/src/routes/guide.routes.js | 2 +- backend/src/service/popup.service.js | 8 + frontend/Dockerfile | 2 +- jsAgent/main.js | 32 +- 8 files changed, 59 insertions(+), 543 deletions(-) diff --git a/backend/.env b/backend/.env index f1ebcc98..c3ee6081 100644 --- a/backend/.env +++ b/backend/.env @@ -5,7 +5,7 @@ NODE_ENV=development DEV_DB_USERNAME=user123 DEV_DB_PASSWORD=password123 DEV_DB_NAME=onboarding_db -DEV_DB_HOST=db +DEV_DB_HOST=localhost DEV_DB_PORT=5432 EMAIL_ENABLE=false diff --git a/backend/Dockerfile b/backend/Dockerfile index 3679a783..d17a4a51 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22-alpine3.20 +FROM node:22 WORKDIR /app diff --git a/backend/package-lock.json b/backend/package-lock.json index 178862c7..ed1fd7b3 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -9,7 +9,6 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "bcrypt": "^5.1.1", "bcryptjs": "^2.4.3", "cors": "^2.8.5", "dotenv": "^16.4.5", @@ -20,7 +19,7 @@ "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", "nodemailer": "^6.9.15", - "pg": "^8.11.5", + "pg": "^8.13.1", "sequelize": "^6.37.3" }, "devDependencies": { @@ -131,26 +130,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, "node_modules/@one-ini/wasm": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@one-ini/wasm/-/wasm-0.1.1.tgz", @@ -199,12 +178,6 @@ "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==", "license": "MIT" }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC" - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -218,45 +191,11 @@ "node": ">= 0.6" } }, - "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==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/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==", - "license": "MIT" - }, "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, "license": "MIT", "engines": { "node": ">=8" @@ -292,26 +231,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "license": "ISC" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", - "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -332,22 +251,9 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, - "node_modules/bcrypt": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", - "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.11", - "node-addon-api": "^5.0.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -402,6 +308,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -480,15 +387,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/cli-color": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.4.tgz", @@ -538,15 +436,6 @@ "dev": true, "license": "MIT" }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -561,6 +450,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, "license": "MIT" }, "node_modules/config-chain": { @@ -574,12 +464,6 @@ "proto-list": "~1.2.1" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "license": "ISC" - }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -684,12 +568,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "license": "MIT" - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -709,15 +587,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, "node_modules/dotenv": { "version": "16.4.5", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", @@ -807,6 +676,7 @@ "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, "license": "MIT" }, "node_modules/encodeurl": { @@ -1107,36 +977,6 @@ "node": ">=10" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "license": "ISC" - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1161,27 +1001,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", - "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1211,27 +1030,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", - "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/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -1331,12 +1129,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "license": "ISC" - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -1383,42 +1175,6 @@ "node": ">= 0.8" } }, - "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==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/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==", - "license": "MIT" - }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -1447,17 +1203,6 @@ ], "license": "MIT" }, - "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==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "license": "ISC", - "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", @@ -1523,6 +1268,7 @@ "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, "license": "MIT", "engines": { "node": ">=8" @@ -1823,30 +1569,6 @@ "es5-ext": "~0.10.2" } }, - "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==", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -1931,6 +1653,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -1952,48 +1675,12 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, "license": "ISC", "engines": { "node": ">=8" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/moment": { "version": "2.30.1", "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", @@ -2043,32 +1730,6 @@ "dev": true, "license": "ISC" }, - "node_modules/node-addon-api": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", - "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/nodemailer": { "version": "6.9.15", "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.15.tgz", @@ -2132,21 +1793,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -2157,19 +1803,6 @@ "node": ">=0.10.0" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", - "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "deprecated": "This package is no longer supported.", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -2203,15 +1836,6 @@ "node": ">= 0.8" } }, - "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==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", @@ -2228,15 +1852,6 @@ "node": ">= 0.8" } }, - "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==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -2278,14 +1893,14 @@ "license": "MIT" }, "node_modules/pg": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", - "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", + "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", "license": "MIT", "dependencies": { - "pg-connection-string": "^2.6.4", - "pg-pool": "^3.6.2", - "pg-protocol": "^1.6.1", + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.0", + "pg-protocol": "^1.7.0", "pg-types": "^2.1.0", "pgpass": "1.x" }, @@ -2312,9 +1927,9 @@ "optional": true }, "node_modules/pg-connection-string": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", - "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==", "license": "MIT" }, "node_modules/pg-int8": { @@ -2327,18 +1942,18 @@ } }, "node_modules/pg-pool": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", - "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", + "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", "license": "MIT", "peerDependencies": { "pg": ">=8.0" } }, "node_modules/pg-protocol": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", - "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==", "license": "MIT" }, "node_modules/pg-types": { @@ -2484,20 +2099,6 @@ "node": ">= 0.8" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -2545,22 +2146,6 @@ "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==", "license": "MIT" }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -2770,12 +2355,6 @@ "node": ">= 0.8.0" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "license": "ISC" - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -2840,12 +2419,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "license": "ISC" - }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -2886,19 +2459,11 @@ "node": ">= 0.8" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "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, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -2929,6 +2494,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -2977,23 +2543,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/timers-ext": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.8.tgz", @@ -3046,12 +2595,6 @@ "nodetouch": "bin/nodetouch.js" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "license": "MIT" - }, "node_modules/type": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz", @@ -3130,12 +2673,6 @@ "node": ">= 0.8" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -3172,22 +2709,6 @@ "node": ">= 0.8" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3204,15 +2725,6 @@ "node": ">= 8" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/wkx": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", @@ -3265,12 +2777,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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==", - "license": "ISC" - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -3290,12 +2796,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/backend/package.json b/backend/package.json index 9deb853d..08f38955 100644 --- a/backend/package.json +++ b/backend/package.json @@ -24,7 +24,7 @@ "helmet": "^7.1.0", "jsonwebtoken": "^9.0.2", "nodemailer": "^6.9.15", - + "pg": "^8.13.1", "sequelize": "^6.37.3" }, "devDependencies": { diff --git a/backend/src/routes/guide.routes.js b/backend/src/routes/guide.routes.js index 4904d726..adf32244 100644 --- a/backend/src/routes/guide.routes.js +++ b/backend/src/routes/guide.routes.js @@ -3,7 +3,7 @@ const guideController = require("../controllers/guide.controller.js"); const router = express.Router(); -router.get("/get_guides_by_url", guideController.getGuidesByUrl); +router.post("/get_guides_by_url", guideController.getGuidesByUrl); // router.get("/get_incomplete_guides_by_url", guideController.getIncompleteGuidesByUrl); module.exports = router; diff --git a/backend/src/service/popup.service.js b/backend/src/service/popup.service.js index 4a1497e3..21824d2c 100644 --- a/backend/src/service/popup.service.js +++ b/backend/src/service/popup.service.js @@ -72,6 +72,14 @@ class PopupService { throw new Error("Error retrieving popups for the given API and Client ID"); } } + + async getPopupByUrl(url) { + try { + return await Popup.findAll({ where: { url } }); + } catch (error) { + throw new Error("Error retrieving Popup by URL"); + } + }; } module.exports = new PopupService(); diff --git a/frontend/Dockerfile b/frontend/Dockerfile index f3badd6d..8306193c 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,4 +1,4 @@ -FROM node:22-alpine3.20 +FROM node:22 WORKDIR /app diff --git a/jsAgent/main.js b/jsAgent/main.js index 86d64c08..2005d795 100644 --- a/jsAgent/main.js +++ b/jsAgent/main.js @@ -1,10 +1,8 @@ //CONSTANTS -const BW_SERVER_ENDPOINT_BASE = 'localhost:3000/api/'; -const BW_POPUP_JS_URL ='popup/get_popup/1'; -const BW_BANNER_JS_URL =''; -const BW_TOUR_JS_URL =''; -const BW_LINKS_JS_URL =''; +const BW_SERVER_ENDPOINT_BASE = 'http://localhost:3000/api/'; +const BW_POPUP_JS_URL= 'http://localhost:8082/popup.js' +const BW_GUIDE_URL='guide/get_guides_by_url'; const BW_USER_KEY = 'BW_USER_KEY'; //GLOBALS @@ -83,11 +81,14 @@ bw.data={ const requestOptions = { method: "POST", headers: myHeaders, - body: JSON.stringify({ userId }), + body: JSON.stringify({ + userId, + url : location.origin + }), redirect: "follow" }; - const response = await fetch(`${BW_SERVER_ENDPOINT_BASE}/mock/onboard`, requestOptions); + const response = await fetch(`${BW_SERVER_ENDPOINT_BASE}${BW_GUIDE_URL}`, requestOptions); const data = await response.json(); return data; } @@ -126,6 +127,7 @@ bw.user = { bw.store.remove(BW_USER_KEY); } } + bw.init = (cb) => { if(!bw.user.checkIfBwUserCreated()){ bw.user.createUser(); @@ -138,17 +140,23 @@ bw.init = (cb) => { function () { bw.init(async function (){ - const onBoardConfig = await bw.data.getData(window.BW_USER); + + try { + const onBoardConfig = await bw.data.getData(window.BW_USER); debugger; - if (onBoardConfig.popupData) { + if (onBoardConfig.popup.length > 0) { bw.util.loadScriptAsync(BW_POPUP_JS_URL); - } else if (onBoardConfig.tourData) { + } else if (onBoardConfig.tour?.length > 0) { bw.util.loadScriptAsync(BW_TOUR_JS_URL); - } else if(onBoardConfig.bannerData){ + } else if(onBoardConfig.banner?.length > 0){ bw.util.loadScriptAsync(BW_BANNER_JS_URL); - } else if(onBoardConfig.linkData){ + } else if(onBoardConfig.link?.length > 0){ bw.util.loadScriptAsync(BW_LINKS_JS_URL); } + } catch (error) { + console.log('error :', error); + } + }); } )(); \ No newline at end of file From f46f9272d6c05bba1395958b33b1f5973211700d Mon Sep 17 00:00:00 2001 From: tunckiral Date: Tue, 10 Dec 2024 04:50:07 -0500 Subject: [PATCH 123/178] adding up functionalities --- .DS_Store | Bin 6148 -> 6148 bytes jsAgent/main.js | 3 +- jsAgent/popup.js | 92 +++++++++++++++++++++++++++++------------------ 3 files changed, 60 insertions(+), 35 deletions(-) diff --git a/.DS_Store b/.DS_Store index 50d86b883aa6ddc4c5ed3ff7ea417814bf25652f..0882062e027ae90a4707b1c05d8620db97fbb5a2 100644 GIT binary patch delta 334 zcmZoMXfc=|#>B)qu~2NHo+2a5!~pA!4;mPOj2`QHc7`m5Vg^TsbcR%hJcg2_^5TM| zoctsP28JC;1v#0;B?bo97@3$^SlQUwIoY|{V}mpD%Y#c2OG=BK5{sfiypa6-oFo`K zF)1uFwLD%x#5q5&Br!8DwFs;sGbI(MBqlsFFD1X+DZex?r5LQYJ{Tgy$;rVPFCbA} zZE9wqqhM-gS*xQ^ZD|B#n^+pv)^c))D(hPZ#b@W_=H+(*9R~!Aj1ZcE7fQpZZXg5A zTV=sTc{%xc=|CBnE{N)l_YSdaX6NAN0EW-Ti{F_i^NZ+;fTTdm8Xz=S$L0``4a^f8 FSO6O)QS<-+ delta 74 zcmZoMXfc=|#>CJzu~2NHo+2aD!~pBb1|lqz`I#&>yD%SS*&M)J%e0xDgP#MaXtN{p ccjn3bBD$Q63=9khfS6&j4UhEZ7?CB+0OK1HY5)KL diff --git a/jsAgent/main.js b/jsAgent/main.js index 2005d795..c67aa4ed 100644 --- a/jsAgent/main.js +++ b/jsAgent/main.js @@ -143,7 +143,8 @@ bw.init = (cb) => { try { const onBoardConfig = await bw.data.getData(window.BW_USER); - debugger; + console.log('data loaded:' , onBoardConfig); + window.bwonboarddata=onBoardConfig; if (onBoardConfig.popup.length > 0) { bw.util.loadScriptAsync(BW_POPUP_JS_URL); } else if (onBoardConfig.tour?.length > 0) { diff --git a/jsAgent/popup.js b/jsAgent/popup.js index 82ac7f39..22ee314c 100644 --- a/jsAgent/popup.js +++ b/jsAgent/popup.js @@ -1,8 +1,5 @@ const defaultOptions = { - padding: 16, - hasFooter: true, - - + padding: 20, closeButtonAction: "no action", popupSize: "small", url: "https://", @@ -13,9 +10,24 @@ const defaultOptions = { buttonBackgroundColor: "#7F56D9", buttonTextColor: "#FFFFFF", header: "default", - content: "", + content: "" } +const PopUpSize = Object.freeze({ + small:{ + width: 400, + height: 250 + }, + medium:{ + width: 500, + height: 300 + }, + large:{ + width: 700, + height: 350 + } +}); + bw.popup = { init: function () { @@ -29,45 +41,57 @@ bw.popup = { document.body.insertAdjacentHTML('afterbegin', `
`); }, addModal: function (cb) { - const options = window + const options = window.bwonboarddata.popup[0]; let overlay = document.getElementById('bw-overlay'); - for (let i = 0; i < options.length; i++) { - let option = { - ...defaultOptions, - ...options[i] - }; - let temp_html = ` -
- ` + overlay.insertAdjacentHTML('afterbegin', temp_html); cb && cb(); }, addHeader: function(headerTitle, bgColor, textColor, padding){ - let headerHtml = `