diff --git a/.eslintrc.json b/.eslintrc.json index 6de7039..2a0ddc7 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,7 +6,24 @@ "space-in-parens": "error", "no-empty": "error", "no-multiple-empty-lines": "error", - "no-irregular-whitespace": "error" + "no-irregular-whitespace": "error", + "strict": ["error", "never"], + "linebreak-style": ["error", "unix"], + "quotes": ["error", "double", { "avoidEscape": true }], + "semi": ["error", "always"], + "padding-line-between-statements": [ + "error", + { "blankLine": "always", "prev": ["const", "let", "var"], "next": "*" }, + { "blankLine": "any", "prev": ["const", "let", "var"], "next": ["const", "let", "var"] } + ], + "space-before-function-paren": [ + "error", + { + "anonymous": "always", + "named": "never", + "asyncArrow": "always" + } + ] }, "extends": ["next/core-web-vitals"], "plugins": ["prettier", "unused-imports"] diff --git a/next.config.js b/next.config.js index 6b9165a..377f765 100644 --- a/next.config.js +++ b/next.config.js @@ -1,9 +1,13 @@ const { withSentryConfig } = require("@sentry/nextjs"); +const withBundleAnalyzer = require("@next/bundle-analyzer")({ + enabled: process.env.ANALYZE === "true", +}); /** * @type {import('next').NextConfig} */ const config = { + output: "export", reactStrictMode: false, productionBrowserSourceMaps: true, compiler: { @@ -11,17 +15,20 @@ const config = { }, }; -module.exports = withSentryConfig( - config, - { - silent: true, - org: "aykut-sarac", - project: "json-crack", - }, - { - widenClientFileUpload: true, - hideSourceMaps: true, - disableLogger: true, - disableServerWebpackPlugin: true, - } -); +module.exports = + process.env.ANALYZE === "true" + ? withBundleAnalyzer(config) + : withSentryConfig( + config, + { + silent: true, + org: "aykut-sarac", + project: "json-crack", + }, + { + widenClientFileUpload: true, + hideSourceMaps: true, + disableLogger: true, + disableServerWebpackPlugin: true, + } + ); diff --git a/package.json b/package.json index 7d714ce..159c460 100644 --- a/package.json +++ b/package.json @@ -1,59 +1,60 @@ { "name": "json-crack", "private": true, - "version": "v2.8.0", + "version": "v3.0.0", "author": "https://github.com/AykutSarac", "homepage": "https://jsoncrack.com", "scripts": { "dev": "next dev", - "build": "next build && next export", + "build": "next build", + "analyze": "ANALYZE=true npm run build", "start": "next start", "lint": "tsc && eslint src && prettier --check src", - "lint:fix": "prettier --write src & eslint --fix src", + "lint:fix": "eslint --fix src & prettier --write src", "deploy": "gh-pages -d out -t true" }, "dependencies": { "@emotion/react": "^11.11.1", "@emotion/server": "^11.11.0", - "@mantine/core": "^6.0.13", - "@mantine/form": "^6.0.13", - "@mantine/hooks": "^6.0.13", - "@mantine/next": "^6.0.13", - "@mantine/prism": "^6.0.13", + "@mantine/core": "^6.0.16", + "@mantine/form": "^6.0.16", + "@mantine/hooks": "^6.0.16", + "@mantine/next": "^6.0.16", + "@mantine/prism": "^6.0.16", "@monaco-editor/react": "^4.5.1", "@sentry/nextjs": "^7.55.2", - "@tanstack/react-query": "^4.29.14", + "@tanstack/react-query": "^4.29.25", "allotment": "^1.19.0", "altogic": "^2.3.9", "axios": "^1.4.0", - "dayjs": "^1.11.8", + "dayjs": "^1.11.9", "html-to-image": "^1.11.11", "json-2-csv": "^4.0.0", "jsonc-parser": "^3.2.0", - "jsonwebtoken": "^9.0.0", + "jsonwebtoken": "^9.0.1", "jxon": "^2.0.0-beta.5", "lodash.debounce": "^4.0.8", "lodash.get": "^4.4.2", "lodash.set": "^4.3.2", "lz-string": "^1.5.0", - "next": "13.2.3", + "next": "13.3.0", "react": "^18.2.0", "react-color": "^2.19.3", "react-dom": "^18.2.0", "react-hot-toast": "^2.4.1", - "react-icons": "^4.9.0", + "react-icons": "^4.10.1", "react-linkify-it": "^1.0.7", "react-simple-typewriter": "^5.0.1", "react-syntax-highlighter": "^15.5.0", - "react-zoom-pan-pinch": "^3.0.8", + "react-zoom-pan-pinch": "^3.1.0", "reaflow": "5.1.2", "styled-components": "^5.3.8", "toml": "^3.0.0", "universal-cookie": "^4.0.4", - "zustand": "^4.3.8" + "zustand": "^4.3.9" }, "devDependencies": { - "@next/bundle-analyzer": "^13.4.3", + "@next/bundle-analyzer": "^13.4.10", "@testing-library/react": "^14.0.0", "@trivago/prettier-plugin-sort-imports": "^4.1.1", "@types/jsonwebtoken": "^9.0.2", @@ -61,17 +62,17 @@ "@types/lodash.get": "^4.4.7", "@types/lodash.set": "^4.3.7", "@types/lz-string": "^1.5.0", - "@types/node": "^20.2.1", + "@types/node": "^20.4.2", "@types/react": "18.2.6", "@types/react-color": "^3.0.6", "@types/react-syntax-highlighter": "^15.5.7", "@types/styled-components": "^5.1.26", - "eslint": "8.43.0", - "eslint-config-next": "13.4.6", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-unused-imports": "^2.0.0", - "prettier": "^2.8.8", + "eslint": "8.45.0", + "eslint-config-next": "13.4.10", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-unused-imports": "^3.0.0", + "prettier": "^3.0.0", "ts-node": "^10.9.1", - "typescript": "5.0.4" + "typescript": "5.1.6" } } diff --git a/public/assets/multidata.png b/public/assets/multidata.png deleted file mode 100644 index 37bc59c..0000000 Binary files a/public/assets/multidata.png and /dev/null differ diff --git a/public/assets/multidata.webp b/public/assets/multidata.webp new file mode 100644 index 0000000..cbd0fad Binary files /dev/null and b/public/assets/multidata.webp differ diff --git a/src/api/altogic.ts b/src/api/altogic.ts deleted file mode 100644 index 00ae964..0000000 --- a/src/api/altogic.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { APIError, createClient } from "altogic"; - -let envUrl = process.env.NEXT_PUBLIC_ALTOGIC_ENV_URL as string; -let clientKey = process.env.NEXT_PUBLIC_ALTOGIC_CLIENT_KEY as string; - -const altogic = createClient(envUrl, clientKey); - -export interface AltogicResponse { - data: T; - errors: APIError | null; -} - -export { altogic }; diff --git a/src/pages/Mona-Sans.woff2 b/src/assets/fonts/Mona-Sans.woff2 similarity index 100% rename from src/pages/Mona-Sans.woff2 rename to src/assets/fonts/Mona-Sans.woff2 diff --git a/src/components/AdTest/index.tsx b/src/components/AdTest/index.tsx index 8ddbc6f..3850a88 100644 --- a/src/components/AdTest/index.tsx +++ b/src/components/AdTest/index.tsx @@ -45,13 +45,17 @@ const AdWrapper = styled.div` background: #fff; box-shadow: 0 1px 4px 1px hsla(0, 0%, 0%, 0.15); opacity: 0; - transition: transform 0.2s ease-in-out, opacity 0.1s ease-in-out; + transition: + transform 0.2s ease-in-out, + opacity 0.1s ease-in-out; transform: scale(1) translateY(-50px); } & #native-button:checked + .native-overlay { opacity: 1; - transition: transform 0.2s ease-in-out, opacity 0.4s ease-in-out; + transition: + transform 0.2s ease-in-out, + opacity 0.4s ease-in-out; transform: scale(1) translateY(0); } @@ -119,6 +123,7 @@ export const AdTest = () => { if (window.innerWidth < 660) return; ref.current.innerHTML = ""; const s = document.createElement("script"); + s.id = "_carbonads_js"; s.innerHTML = `(function() { if (typeof _bsa !== 'undefined' && _bsa) { diff --git a/src/components/CarbonAds/index.tsx b/src/components/CarbonAds/index.tsx index 5df011c..beb4e96 100644 --- a/src/components/CarbonAds/index.tsx +++ b/src/components/CarbonAds/index.tsx @@ -9,8 +9,9 @@ export const CarbonAds = () => { if (!premium) { ref.current.innerHTML = ""; const s = document.createElement("script"); + s.id = "_carbonads_js"; - s.src = `//cdn.carbonads.com/carbon.js?serve=CE7IPKQL&placement=jsoncrackcom`; + s.src = "//cdn.carbonads.com/carbon.js?serve=CE7IPKQL&placement=jsoncrackcom"; ref.current.appendChild(s); } }, [premium]); diff --git a/src/components/CustomNode/ObjectNode.tsx b/src/components/CustomNode/ObjectNode.tsx index 1d5f444..0d48dc0 100644 --- a/src/components/CustomNode/ObjectNode.tsx +++ b/src/components/CustomNode/ObjectNode.tsx @@ -5,11 +5,12 @@ import * as Styled from "./styles"; const Node: React.FC = ({ node, x, y }) => { const { text, width, height, data } = node; - if (data.isEmpty) return null; + + if (data?.isEmpty) return null; return ( - {text.map((val, idx) => { + {(text as [string, unknown][]).map((val, idx) => { return ( = ({ node, x, y, hasCollapse = false }) => const expandNodes = useGraph(state => state.expandNodes); const collapseNodes = useGraph(state => state.collapseNodes); const isExpanded = useGraph(state => state.collapsedParents.includes(id)); - const isImage = imagePreview && isContentImage(text); + const isImage = imagePreview && isContentImage(text as string); const handleExpand = (e: React.MouseEvent) => { e.stopPropagation(); @@ -75,7 +75,7 @@ const Node: React.FC = ({ node, x, y, hasCollapse = false }) => > {isImage ? ( - + ) : ( { +const GoogleAnalytics: React.FC = () => { if (isDevelopment) return null; return ( @@ -30,3 +30,5 @@ export const GoogleAnalytics: React.FC = () => { ); }; + +export default GoogleAnalytics; diff --git a/src/components/Graph/PremiumView.tsx b/src/components/Graph/PremiumView.tsx index 6088c32..2fea2a0 100644 --- a/src/components/Graph/PremiumView.tsx +++ b/src/components/Graph/PremiumView.tsx @@ -64,20 +64,32 @@ const StyledPremiumView = styled.div` .glowing span:nth-child(3n + 1)::before { background: rgba(134, 255, 0, 1); - box-shadow: 0 0 20px rgba(134, 255, 0, 1), 0 0 40px rgba(134, 255, 0, 1), - 0 0 60px rgba(134, 255, 0, 1), 0 0 80px rgba(134, 255, 0, 1), 0 0 0 8px rgba(134, 255, 0, 0.1); + box-shadow: + 0 0 20px rgba(134, 255, 0, 1), + 0 0 40px rgba(134, 255, 0, 1), + 0 0 60px rgba(134, 255, 0, 1), + 0 0 80px rgba(134, 255, 0, 1), + 0 0 0 8px rgba(134, 255, 0, 0.1); } .glowing span:nth-child(3n + 2)::before { background: rgba(255, 214, 0, 1); - box-shadow: 0 0 20px rgba(255, 214, 0, 1), 0 0 40px rgba(255, 214, 0, 1), - 0 0 60px rgba(255, 214, 0, 1), 0 0 80px rgba(255, 214, 0, 1), 0 0 0 8px rgba(255, 214, 0, 0.1); + box-shadow: + 0 0 20px rgba(255, 214, 0, 1), + 0 0 40px rgba(255, 214, 0, 1), + 0 0 60px rgba(255, 214, 0, 1), + 0 0 80px rgba(255, 214, 0, 1), + 0 0 0 8px rgba(255, 214, 0, 0.1); } .glowing span:nth-child(3n + 3)::before { background: rgba(0, 226, 255, 1); - box-shadow: 0 0 20px rgba(0, 226, 255, 1), 0 0 40px rgba(0, 226, 255, 1), - 0 0 60px rgba(0, 226, 255, 1), 0 0 80px rgba(0, 226, 255, 1), 0 0 0 8px rgba(0, 226, 255, 0.1); + box-shadow: + 0 0 20px rgba(0, 226, 255, 1), + 0 0 40px rgba(0, 226, 255, 1), + 0 0 60px rgba(0, 226, 255, 1), + 0 0 80px rgba(0, 226, 255, 1), + 0 0 0 8px rgba(0, 226, 255, 0.1); } .glowing span:nth-child(3n + 1) { diff --git a/src/components/Graph/index.tsx b/src/components/Graph/index.tsx index cdba555..c0f5de0 100644 --- a/src/components/Graph/index.tsx +++ b/src/components/Graph/index.tsx @@ -8,11 +8,14 @@ import useToggleHide from "src/hooks/useToggleHide"; import useGraph from "src/store/useGraph"; import useModal from "src/store/useModal"; import useUser from "src/store/useUser"; +import { NodeData } from "src/types/models"; import { Loading } from "../../layout/Loading"; import { ErrorView } from "./ErrorView"; import { PremiumView } from "./PremiumView"; -const Canvas = dynamic(() => import("reaflow").then(r => r.Canvas)); +const Canvas = dynamic(() => import("reaflow").then(r => r.Canvas), { + ssr: false, +}); interface GraphProps { isWidget?: boolean; @@ -32,8 +35,16 @@ const StyledEditorWrapper = styled.div<{ widget: boolean }>` linear-gradient(90deg, var(--line-color-1) 1.5px, transparent 1.5px), linear-gradient(var(--line-color-2) 1px, transparent 1px), linear-gradient(90deg, var(--line-color-2) 1px, transparent 1px); - background-position: -1.5px -1.5px, -1.5px -1.5px, -1px -1px, -1px -1px; - background-size: 100px 100px, 100px 100px, 20px 20px, 20px 20px; + background-position: + -1.5px -1.5px, + -1.5px -1.5px, + -1px -1px, + -1px -1px; + background-size: + 100px 100px, + 100px 100px, + 20px 20px, + 20px 20px; :active { cursor: move; @@ -116,6 +127,7 @@ export const Graph = ({ isWidget = false }: GraphProps) => { const memoizedNode = React.useCallback( (props: JSX.IntrinsicAttributes & NodeProps) => ( + // @ts-ignore ), [handleNodeClick] diff --git a/src/components/HovercardAds/index.tsx b/src/components/HovercardAds/index.tsx index 5491707..6c81ce8 100644 --- a/src/components/HovercardAds/index.tsx +++ b/src/components/HovercardAds/index.tsx @@ -6,6 +6,7 @@ export const HovercardAds = () => { React.useEffect(() => { const isAvailable = document.querySelectorAll("#_hellobar_")[0]; + if (typeof window._bsa !== "undefined" && window._bsa && !!!isAvailable) { window._bsa.init("hellobar", "CE7IPKQL", "placement:jsoncrackcom"); } diff --git a/src/constants/customFonts.ts b/src/constants/customFonts.ts index bd204f7..1e249b1 100644 --- a/src/constants/customFonts.ts +++ b/src/constants/customFonts.ts @@ -1,7 +1,7 @@ import localFont from "next/font/local"; const monaSans = localFont({ - src: "../pages/Mona-Sans.woff2", + src: "../assets/fonts/Mona-Sans.woff2", variable: "--mona-sans", display: "swap", fallback: ["Arial, Helvetica, sans-serif", "Tahoma, Verdana, sans-serif"], diff --git a/src/constants/file.ts b/src/constants/file.ts deleted file mode 100644 index fbfef5c..0000000 --- a/src/constants/file.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* eslint unused-imports/no-unused-imports: 0 */ - -enum FileFormat { - "JSON" = "json", - "YAML" = "yaml", - "XML" = "xml", - "TOML" = "toml", - "CSV" = "csv", -} - -export { FileFormat }; diff --git a/src/containers/Editor/JsonEditor/index.tsx b/src/containers/Editor/JsonEditor/index.tsx index 38818af..63ea257 100644 --- a/src/containers/Editor/JsonEditor/index.tsx +++ b/src/containers/Editor/JsonEditor/index.tsx @@ -16,3 +16,5 @@ export const JsonEditor: React.FC = () => { ); }; + +export default JsonEditor; diff --git a/src/containers/Editor/LiveEditor/Tools.tsx b/src/containers/Editor/LiveEditor/Tools.tsx index 4384bc5..ac8bdb0 100644 --- a/src/containers/Editor/LiveEditor/Tools.tsx +++ b/src/containers/Editor/LiveEditor/Tools.tsx @@ -18,16 +18,16 @@ import { VscSettingsGear, } from "react-icons/vsc"; import { SearchInput } from "src/components/SearchInput"; -import { FileFormat } from "src/constants/file"; import { JSONCrackLogo } from "src/layout/JsonCrackLogo"; +import { getNextDirection } from "src/lib/utils/graph/getNextDirection"; +import { isIframe } from "src/lib/utils/widget"; import useFile from "src/store/useFile"; import useGraph from "src/store/useGraph"; import useJson from "src/store/useJson"; import useModal from "src/store/useModal"; import useStored from "src/store/useStored"; import useUser from "src/store/useUser"; -import { getNextDirection } from "src/utils/graph/getNextDirection"; -import { isIframe } from "src/utils/widget"; +import { FileFormat } from "src/types/models"; export const StyledTools = styled.div` position: relative; @@ -121,6 +121,7 @@ export const Tools: React.FC<{ isWidget?: boolean }> = ({ isWidget = false }) => const toggleDirection = () => { const nextDirection = getNextDirection(direction); + setDirection(nextDirection); }; @@ -149,6 +150,7 @@ export const Tools: React.FC<{ isWidget?: boolean }> = ({ isWidget = false }) => "mod+f", () => { const input = document.querySelector("#search-node") as HTMLInputElement; + input.focus(); }, ], diff --git a/src/containers/Editor/Panes.tsx b/src/containers/Editor/Panes.tsx index d4a85cc..408415b 100644 --- a/src/containers/Editor/Panes.tsx +++ b/src/containers/Editor/Panes.tsx @@ -3,7 +3,6 @@ import dynamic from "next/dynamic"; import styled from "styled-components"; import { Allotment } from "allotment"; import "allotment/dist/style.css"; -import { JsonEditor } from "src/containers/Editor/JsonEditor"; import useGraph from "src/store/useGraph"; export const StyledEditor = styled(Allotment)` @@ -17,6 +16,10 @@ export const StyledEditor = styled(Allotment)` } `; +const JsonEditor = dynamic(() => import("src/containers/Editor/JsonEditor"), { + ssr: false, +}); + const LiveEditor = dynamic(() => import("src/containers/Editor/LiveEditor"), { ssr: false, }); diff --git a/src/containers/Modals/CancelPremiumModal/index.tsx b/src/containers/Modals/CancelPremiumModal/index.tsx index 817c38f..de58cc0 100644 --- a/src/containers/Modals/CancelPremiumModal/index.tsx +++ b/src/containers/Modals/CancelPremiumModal/index.tsx @@ -1,7 +1,7 @@ import React from "react"; import { Modal, Group, Button, Divider, ModalProps, Text, Image, Anchor } from "@mantine/core"; import { toast } from "react-hot-toast"; -import { altogic } from "src/api/altogic"; +import { altogic } from "src/lib/api/altogic"; export const CancelPremiumModal: React.FC = ({ opened, onClose }) => { const [cancelling, setCancelling] = React.useState(false); diff --git a/src/containers/Modals/DownloadModal/index.tsx b/src/containers/Modals/DownloadModal/index.tsx index e537b94..0f1a65f 100644 --- a/src/containers/Modals/DownloadModal/index.tsx +++ b/src/containers/Modals/DownloadModal/index.tsx @@ -43,6 +43,7 @@ const swatches = [ function downloadURI(uri: string, name: string) { var link = document.createElement("a"); + link.download = name; link.href = uri; document.body.appendChild(link); diff --git a/src/containers/Modals/JWTModal/index.tsx b/src/containers/Modals/JWTModal/index.tsx index f17e809..77f2198 100644 --- a/src/containers/Modals/JWTModal/index.tsx +++ b/src/containers/Modals/JWTModal/index.tsx @@ -10,6 +10,7 @@ export const JWTModal: React.FC = ({ opened, onClose }) => { const resolve = () => { if (!token) return; const json = decode(token); + setContents({ contents: JSON.stringify(json, null, 2) }); setToken(""); onClose(); diff --git a/src/containers/Modals/NodeModal/index.tsx b/src/containers/Modals/NodeModal/index.tsx index 7f31c5d..8fc1423 100644 --- a/src/containers/Modals/NodeModal/index.tsx +++ b/src/containers/Modals/NodeModal/index.tsx @@ -6,12 +6,12 @@ import vsDark from "prism-react-renderer/themes/vsDark"; import vsLight from "prism-react-renderer/themes/vsLight"; import { VscLock } from "react-icons/vsc"; import { shallow } from "zustand/shallow"; +import { isIframe } from "src/lib/utils/widget"; import useFile from "src/store/useFile"; import useGraph from "src/store/useGraph"; import useModal from "src/store/useModal"; import useStored from "src/store/useStored"; import useUser from "src/store/useUser"; -import { isIframe } from "src/utils/widget"; const dataToString = (data: any) => { const text = Array.isArray(data) ? Object.fromEntries(data) : data; @@ -53,9 +53,9 @@ export const NodeModal: React.FC = ({ opened, onClose }) => { const lightmode = useStored(state => (state.lightmode ? "light" : "vs-dark")); const [nodeData, path, isParent] = useGraph( state => [ - dataToString(state.selectedNode.text), - state.selectedNode.path, - state.selectedNode.data?.isParent, + dataToString(state.selectedNode?.text), + state.selectedNode?.path, + state.selectedNode?.data?.isParent, ], shallow ); diff --git a/src/containers/Modals/SchemaModal/index.tsx b/src/containers/Modals/SchemaModal/index.tsx index b81103c..7bfc5a0 100644 --- a/src/containers/Modals/SchemaModal/index.tsx +++ b/src/containers/Modals/SchemaModal/index.tsx @@ -13,6 +13,7 @@ export const SchemaModal: React.FC = ({ opened, onClose }) => { const onApply = () => { try { const parsedSchema = JSON.parse(schema); + setJsonSchema(parsedSchema); toast.success("Applied schema!"); onClose(); diff --git a/src/hooks/useFocusNode.ts b/src/hooks/useFocusNode.ts index 9ca7e0d..d41f027 100644 --- a/src/hooks/useFocusNode.ts +++ b/src/hooks/useFocusNode.ts @@ -1,7 +1,7 @@ import React from "react"; import { useDebouncedValue } from "@mantine/hooks"; +import { searchQuery, cleanupHighlight, highlightMatchedNodes } from "src/lib/utils/graph/search"; import useGraph from "src/store/useGraph"; -import { searchQuery, cleanupHighlight, highlightMatchedNodes } from "src/utils/graph/search"; export const useFocusNode = () => { const zoomPanPinch = useGraph(state => state.zoomPanPinch); @@ -34,6 +34,7 @@ export const useFocusNode = () => { (ref.offsetLeft - y) * newScale + ref.clientHeight / 8 - matchedNode.getBoundingClientRect().height / 8; + highlightMatchedNodes(matchedNodes, selectedNode); setNodeCount(matchedNodes.length); diff --git a/src/hooks/useToggleHide.ts b/src/hooks/useToggleHide.ts index f2dea0c..06e9abe 100644 --- a/src/hooks/useToggleHide.ts +++ b/src/hooks/useToggleHide.ts @@ -16,15 +16,18 @@ const useToggleHide = () => { const validateHiddenNodes = React.useCallback(() => { const hiddenItems = document.body.querySelectorAll(".hide"); + hiddenItems.forEach(item => item.classList.remove("hide")); if (nodeList.length) { const selectedNodes = document.body.querySelectorAll(nodeList.join(",")); + selectedNodes.forEach(node => node.classList.add("hide")); } if (edgeList.length) { const selectedEdges = document.body.querySelectorAll(edgeList.join(",")); + selectedEdges.forEach(edge => edge.classList.add("hide")); } }, [nodeList, edgeList]); diff --git a/src/layout/DevMode/index.tsx b/src/layout/ExternalMode/index.tsx similarity index 97% rename from src/layout/DevMode/index.tsx rename to src/layout/ExternalMode/index.tsx index bd99f68..275997e 100644 --- a/src/layout/DevMode/index.tsx +++ b/src/layout/ExternalMode/index.tsx @@ -43,8 +43,9 @@ const isExternal = () => { return false; }; -export const ExternalMode = () => { +const ExternalMode = () => { const [isOpen, setOpen] = React.useState(false); + if (!isExternal()) return null; const closeModal = () => setOpen(false); @@ -84,3 +85,5 @@ export const ExternalMode = () => { ); }; + +export default ExternalMode; diff --git a/src/layout/ModalController/index.tsx b/src/layout/ModalController/index.tsx index bb34811..0822eb0 100644 --- a/src/layout/ModalController/index.tsx +++ b/src/layout/ModalController/index.tsx @@ -1,43 +1,29 @@ import React from "react"; import { ModalProps } from "@mantine/core"; -import { - AccountModal, - ClearModal, - DownloadModal, - ImportModal, - JWTModal, - LoginModal, - Modal, - NodeModal, - PremiumModal, - SchemaModal, - SettingsModal, - ShareModal, - CancelPremiumModal, -} from "src/containers/Modals"; -import { CloudModal } from "src/containers/Modals/CloudModal"; +import * as Modals from "src/containers/Modals"; +import { Modal } from "src/containers/Modals"; import useModal from "src/store/useModal"; import { EditorMantine } from "../EditorMantine"; type ModalComponent = { key: Modal; component: React.FC }; const modalComponents: ModalComponent[] = [ - { key: "import", component: ImportModal }, - { key: "clear", component: ClearModal }, - { key: "download", component: DownloadModal }, - { key: "settings", component: SettingsModal }, - { key: "cloud", component: CloudModal }, - { key: "account", component: AccountModal }, - { key: "premium", component: PremiumModal }, - { key: "login", component: LoginModal }, - { key: "share", component: ShareModal }, - { key: "jwt", component: JWTModal }, - { key: "node", component: NodeModal }, - { key: "schema", component: SchemaModal }, - { key: "cancelPremium", component: CancelPremiumModal }, + { key: "import", component: Modals.ImportModal }, + { key: "clear", component: Modals.ClearModal }, + { key: "download", component: Modals.DownloadModal }, + { key: "settings", component: Modals.SettingsModal }, + { key: "cloud", component: Modals.CloudModal }, + { key: "account", component: Modals.AccountModal }, + { key: "premium", component: Modals.PremiumModal }, + { key: "login", component: Modals.LoginModal }, + { key: "share", component: Modals.ShareModal }, + { key: "jwt", component: Modals.JWTModal }, + { key: "node", component: Modals.NodeModal }, + { key: "schema", component: Modals.SchemaModal }, + { key: "cancelPremium", component: Modals.CancelPremiumModal }, ]; -export const ModalController = () => { +const ModalController = () => { const setVisible = useModal(state => state.setVisible); const modalStates = useModal(state => modalComponents.map(modal => state[modal.key])); @@ -52,3 +38,5 @@ export const ModalController = () => { ); }; + +export default ModalController; diff --git a/src/lib/api/altogic.ts b/src/lib/api/altogic.ts new file mode 100644 index 0000000..5ce4616 --- /dev/null +++ b/src/lib/api/altogic.ts @@ -0,0 +1,14 @@ +import { APIError, createClient } from "altogic"; + +const envUrl = process.env.NEXT_PUBLIC_ALTOGIC_ENV_URL as string; +const clientKey = process.env.NEXT_PUBLIC_ALTOGIC_CLIENT_KEY as string; + +const altogic = createClient(envUrl, clientKey); + +interface AltogicResponse { + data: T; + errors: APIError | null; +} + +export { altogic }; +export type { AltogicResponse }; diff --git a/src/utils/core/addEdgeToGraph.ts b/src/lib/utils/core/addEdgeToGraph.ts similarity index 100% rename from src/utils/core/addEdgeToGraph.ts rename to src/lib/utils/core/addEdgeToGraph.ts diff --git a/src/utils/core/addNodeToGraph.ts b/src/lib/utils/core/addNodeToGraph.ts similarity index 86% rename from src/utils/core/addNodeToGraph.ts rename to src/lib/utils/core/addNodeToGraph.ts index 8b611e9..faa1b42 100644 --- a/src/utils/core/addNodeToGraph.ts +++ b/src/lib/utils/core/addNodeToGraph.ts @@ -1,11 +1,12 @@ +import { NodeType } from "jsonc-parser"; import { Graph } from "../json/jsonParser"; import { calculateNodeSize } from "./calculateNodeSize"; type Props = { graph: Graph; - text: any; + text: string | [string, string][]; isEmpty?: boolean; - type?: "string" | "number" | "boolean" | "object" | "array" | "null"; + type?: NodeType; }; export const addNodeToGraph = ({ graph, text, type = "null", isEmpty = false }: Props) => { diff --git a/src/utils/core/calculateNodeSize.ts b/src/lib/utils/core/calculateNodeSize.ts similarity index 99% rename from src/utils/core/calculateNodeSize.ts rename to src/lib/utils/core/calculateNodeSize.ts index d5a6429..cac192c 100644 --- a/src/utils/core/calculateNodeSize.ts +++ b/src/lib/utils/core/calculateNodeSize.ts @@ -12,6 +12,7 @@ export const isContentImage = (value: string | [string, string][]) => { const isImageURL = /(https?:\/\/.*\.(?:png|jpg|gif))/i.test(value); const isBase64 = value.startsWith("data:image/") && value.includes("base64"); + return isImageURL || isBase64; }; @@ -21,6 +22,7 @@ const calculateWidthAndHeight = (str: string, single = false) => { if (!str) return { width: 45, height: 45 }; const dummyElement = document.createElement("div"); + dummyElement.style.whiteSpace = single ? "nowrap" : "pre-wrap"; dummyElement.innerHTML = str; dummyElement.style.fontSize = "12px"; @@ -34,6 +36,7 @@ const calculateWidthAndHeight = (str: string, single = false) => { const width = dummyElement.offsetWidth + 4; const height = dummyElement.offsetHeight; + document.body.removeChild(dummyElement); return { width, height }; @@ -49,6 +52,7 @@ export const calculateNodeSize = (text: string | [string, string][], isParent = // check cache if (sizeCache.has(cacheKey)) { const size = sizeCache.get(cacheKey); + if (size) return size; } @@ -59,6 +63,7 @@ export const calculateNodeSize = (text: string | [string, string][], isParent = } let sizes = calculateWidthAndHeight(lines, typeof text === "string"); + if (isImage) sizes = { width: 80, height: 80 }; if (foldNodes) sizes.width = 300; if (isParent && foldNodes) sizes.width = 170; diff --git a/src/utils/core/traverse.ts b/src/lib/utils/core/traverse.ts similarity index 97% rename from src/utils/core/traverse.ts rename to src/lib/utils/core/traverse.ts index 4e6671e..16c7059 100644 --- a/src/utils/core/traverse.ts +++ b/src/lib/utils/core/traverse.ts @@ -33,13 +33,14 @@ function handleNoChildren( if (parentType === "property" && nextType !== "object" && nextType !== "array") { states.brothersParentId = myParentId; - if (nextType === undefined) { + if (nextType === undefined && Array.isArray(states.brothersNode)) { states.brothersNode.push([states.brotherKey, value]); } else { states.brotherKey = value; } } else if (parentType === "array") { const nodeFromArrayId = addNodeToGraph({ graph, text: String(value) }); + if (myParentId) { addEdgeToGraph(graph, myParentId, nodeFromArrayId); } @@ -77,8 +78,9 @@ function handleHasChildren( const modifyNodes = [...graph.nodes]; const foundNode = modifyNodes[findNodeIndex]; - foundNode.text = foundNode.text.concat(states.brothersNode); + foundNode.text = foundNode.text.concat(states.brothersNode as any); const { width, height } = calculateNodeSize(foundNode.text, false); + foundNode.width = width; foundNode.height = height; @@ -87,6 +89,7 @@ function handleHasChildren( } } else { const brothersNodeId = addNodeToGraph({ graph, text: states.brothersNode }); + states.brothersNode = []; if (states.brothersParentId) { @@ -142,6 +145,7 @@ function handleHasChildren( const traverseArray = () => { children.forEach((objectToTraverse, index, array) => { const nextType = array[index + 1]?.type; + traverseObject(objectToTraverse, nextType); }); }; @@ -166,10 +170,11 @@ function handleHasChildren( const modifyNodes = [...graph.nodes]; const findNodeIndex = modifyNodes.findIndex(e => e.id === findBrothersNode?.id); - if (modifyNodes[findNodeIndex]) { + if (modifyNodes[findNodeIndex] && typeof states.brothersNode === "string") { modifyNodes[findNodeIndex].text += states.brothersNode; const { width, height } = calculateNodeSize(modifyNodes[findNodeIndex].text, false); + modifyNodes[findNodeIndex].width = width; modifyNodes[findNodeIndex].height = height; @@ -178,6 +183,7 @@ function handleHasChildren( } } else { const brothersNodeId = addNodeToGraph({ graph, text: states.brothersNode }); + states.brothersNode = []; if (states.brothersParentId) { @@ -191,6 +197,7 @@ function handleHasChildren( parentId: states.brothersParentId, objectsFromArrayId: states.objectsFromArray[states.objectsFromArray.length - 1], }; + states.brothersNodeProps = [...states.brothersNodeProps, brothersNodeProps]; } } @@ -213,6 +220,7 @@ function handleHasChildren( graph.nodes = graph.nodes.map((node, index) => { if (index === parentIndex) { const childrenCount = myChildren.length; + return { ...node, data: { ...node.data, childrenCount } }; } return node; diff --git a/src/utils/graph/getChildrenEdges.ts b/src/lib/utils/graph/getChildrenEdges.ts similarity index 81% rename from src/utils/graph/getChildrenEdges.ts rename to src/lib/utils/graph/getChildrenEdges.ts index 3882241..8beda1f 100644 --- a/src/utils/graph/getChildrenEdges.ts +++ b/src/lib/utils/graph/getChildrenEdges.ts @@ -1,3 +1,5 @@ +import { NodeData, EdgeData } from "src/types/models"; + export const getChildrenEdges = (nodes: NodeData[], edges: EdgeData[]): EdgeData[] => { const nodeIds = nodes.map(node => node.id); diff --git a/src/utils/graph/getNextDirection.ts b/src/lib/utils/graph/getNextDirection.ts similarity index 100% rename from src/utils/graph/getNextDirection.ts rename to src/lib/utils/graph/getNextDirection.ts diff --git a/src/utils/graph/getOutgoers.ts b/src/lib/utils/graph/getOutgoers.ts similarity index 94% rename from src/utils/graph/getOutgoers.ts rename to src/lib/utils/graph/getOutgoers.ts index 42b2cc7..8207411 100644 --- a/src/utils/graph/getOutgoers.ts +++ b/src/lib/utils/graph/getOutgoers.ts @@ -1,3 +1,5 @@ +import { NodeData, EdgeData } from "src/types/models"; + export const getOutgoers = ( nodeId: string, nodes: NodeData[], @@ -9,6 +11,7 @@ export const getOutgoers = ( if (parent.includes(nodeId)) { const initialParentNode = nodes.find(n => n.id === nodeId); + if (initialParentNode) outgoerNodes.push(initialParentNode); } diff --git a/src/utils/graph/search.ts b/src/lib/utils/graph/search.ts similarity index 99% rename from src/utils/graph/search.ts rename to src/lib/utils/graph/search.ts index fc2508d..e8d536f 100644 --- a/src/utils/graph/search.ts +++ b/src/lib/utils/graph/search.ts @@ -13,6 +13,7 @@ export const cleanupHighlight = () => { export const highlightMatchedNodes = (nodes: NodeListOf, selectedNode: number) => { nodes.forEach(node => { const foreignObject = node.parentElement?.closest("foreignObject"); + if (foreignObject) { foreignObject.classList.add("searched"); } diff --git a/src/utils/json/getNodePath.ts b/src/lib/utils/json/getNodePath.ts similarity index 90% rename from src/utils/json/getNodePath.ts rename to src/lib/utils/json/getNodePath.ts index 79d2500..6d586c3 100644 --- a/src/utils/json/getNodePath.ts +++ b/src/lib/utils/json/getNodePath.ts @@ -1,3 +1,5 @@ +import { NodeData, EdgeData } from "src/types/models"; + export function getNodePath(nodes: NodeData[], edges: EdgeData[], nodeId: string) { const { getParentsForNodeId } = require("reaflow"); @@ -16,6 +18,7 @@ export function getNodePath(nodes: NodeData[], edges: EdgeData[], nodeId: string for (let i = 1; i < edges.length; i++) { const curNodeId = edges[i].from!; + if (rootArrayElementIds.includes(curNodeId)) continue; if (!edgesMap.has(curNodeId)) { rootArrayElementIds.push(curNodeId); @@ -33,17 +36,18 @@ export function getNodePath(nodes: NodeData[], edges: EdgeData[], nodeId: string const curNode = nodes[+curId - 1]; if (!curNode) break; - if (curNode.data.type === "array") { + if (curNode.data?.type === "array") { resolvedPath += `.${curNode.text}`; if (i !== path.length - 1) { const toNodeId = path[i + 1]; const idx = edgesMap.get(curId).indexOf(toNodeId); + resolvedPath += `[${idx}]`; } } - if (curNode.data.type === "object") { + if (curNode.data?.type === "object") { resolvedPath += `.${curNode.text}`; } } diff --git a/src/utils/json/jsonAdapter.ts b/src/lib/utils/json/jsonAdapter.ts similarity index 97% rename from src/utils/json/jsonAdapter.ts rename to src/lib/utils/json/jsonAdapter.ts index 7d30dc4..75be48d 100644 --- a/src/utils/json/jsonAdapter.ts +++ b/src/lib/utils/json/jsonAdapter.ts @@ -2,7 +2,7 @@ import { load, dump } from "js-yaml"; import { csv2json, json2csv } from "json-2-csv"; import jxon from "jxon"; import toml from "toml"; -import { FileFormat } from "src/constants/file"; +import { FileFormat } from "src/types/models"; const keyExists = (obj: object, key: string) => { if (!obj || (typeof obj !== "object" && !Array.isArray(obj))) { @@ -12,6 +12,7 @@ const keyExists = (obj: object, key: string) => { } else if (Array.isArray(obj)) { for (let i = 0; i < obj.length; i++) { const result = keyExists(obj[i], key); + if (result) { return result; } @@ -19,6 +20,7 @@ const keyExists = (obj: object, key: string) => { } else { for (const k in obj) { const result = keyExists(obj[k], key); + if (result) { return result; } @@ -31,6 +33,7 @@ const keyExists = (obj: object, key: string) => { const contentToJson = async (value: string, format = FileFormat.JSON): Promise => { try { let json: object = {}; + if (format === FileFormat.JSON) json = JSON.parse(value); if (format === FileFormat.YAML) json = load(value) as object; if (format === FileFormat.XML) json = jxon.stringToJs(value); @@ -47,6 +50,7 @@ const contentToJson = async (value: string, format = FileFormat.JSON): Promise => { try { let contents = json; + if (!json) return json; if (format === FileFormat.JSON) contents = json; if (format === FileFormat.YAML) contents = dump(JSON.parse(json)); diff --git a/src/utils/json/jsonParser.ts b/src/lib/utils/json/jsonParser.ts similarity index 94% rename from src/utils/json/jsonParser.ts rename to src/lib/utils/json/jsonParser.ts index d526eb0..b618aa5 100644 --- a/src/utils/json/jsonParser.ts +++ b/src/lib/utils/json/jsonParser.ts @@ -1,4 +1,5 @@ import { parseTree } from "jsonc-parser"; +import { EdgeData, NodeData } from "src/types/models"; import { addEdgeToGraph } from "../core/addEdgeToGraph"; import { addNodeToGraph } from "../core/addNodeToGraph"; import { traverse } from "../core/traverse"; @@ -15,7 +16,7 @@ export type States = { objectsFromArray: number[]; objectsFromArrayId: number; notHaveParent: string[]; - brothersNode: [string, string][]; + brothersNode: [string, string][] | string; brothersParentId: string | undefined; brotherKey: string; brothersNodeProps: { @@ -48,6 +49,7 @@ export function parser(jsonStr: string): Graph { try { const states = initializeStates(); const parsedJsonTree = parseTree(jsonStr); + if (!parsedJsonTree) { throw new Error("Invalid document"); } @@ -55,9 +57,11 @@ export function parser(jsonStr: string): Graph { traverse({ states, objectToTraverse: parsedJsonTree }); const { notHaveParent, graph } = states; + if (notHaveParent.length > 1 && parsedJsonTree.type !== "array") { const emptyNode = { id: null, text: "", isEmpty: true, data: {} }; const emptyId = addNodeToGraph({ graph, ...emptyNode }); + notHaveParent.forEach(childId => addEdgeToGraph(graph, emptyId, childId)); } @@ -74,6 +78,8 @@ export function parser(jsonStr: string): Graph { path: getNodePath(states.graph.nodes, states.graph.edges, node.id), })); + console.log(states.graph); + return states.graph; } catch (error) { console.error(error); diff --git a/src/utils/widget.ts b/src/lib/utils/widget.ts similarity index 100% rename from src/utils/widget.ts rename to src/lib/utils/widget.ts diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index 8f4a550..dd004e9 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,15 +1,17 @@ import React from "react"; import type { AppProps } from "next/app"; +import dynamic from "next/dynamic"; import { ThemeProvider } from "styled-components"; import { MantineProvider } from "@mantine/core"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { Toaster } from "react-hot-toast"; -import { GoogleAnalytics } from "src/components/GoogleAnalytics"; import { monaSans } from "src/constants/customFonts"; import GlobalStyle from "src/constants/globalStyle"; import { lightTheme } from "src/constants/theme"; -import { ExternalMode } from "src/layout/DevMode"; -import { ModalController } from "src/layout/ModalController"; + +const Toaster = dynamic(() => import("react-hot-toast").then(c => c.Toaster)); +const ExternalMode = dynamic(() => import("src/layout/ExternalMode")); +const GoogleAnalytics = dynamic(() => import("src/components/GoogleAnalytics")); +const ModalController = dynamic(() => import("src/layout/ModalController")); const queryClient = new QueryClient({ defaultOptions: { diff --git a/src/pages/docs.tsx b/src/pages/docs.tsx index 2a6d224..5d04301 100644 --- a/src/pages/docs.tsx +++ b/src/pages/docs.tsx @@ -133,7 +133,9 @@ const Docs = () => { where json is a string and options is an object that may contain the following: - {`{\n theme: "light" | "dark",\n direction: "TOP" | "RIGHT" | "DOWN" | "LEFT"\n}`} + { + '{\n theme: "light" | "dark",\n direction: "TOP" | "RIGHT" | "DOWN" | "LEFT"\n}' + } diff --git a/src/pages/editor.tsx b/src/pages/editor.tsx index d7fc19f..1de7947 100644 --- a/src/pages/editor.tsx +++ b/src/pages/editor.tsx @@ -1,17 +1,19 @@ import React from "react"; +import dynamic from "next/dynamic"; import Head from "next/head"; import { useRouter } from "next/router"; import styled from "styled-components"; import { defaultJson } from "src/constants/data"; import { BottomBar } from "src/containers/Editor/BottomBar"; import { Tools } from "src/containers/Editor/LiveEditor/Tools"; -import Panes from "src/containers/Editor/Panes"; import { EditorMantine } from "src/layout/EditorMantine"; import { Loading } from "src/layout/Loading"; import useFile from "src/store/useFile"; import useJson from "src/store/useJson"; import useUser from "src/store/useUser"; +const Panes = dynamic(() => import("src/containers/Editor/Panes")); + export const StyledPageWrapper = styled.div` height: calc(100vh - 27px); width: 100%; diff --git a/src/pages/index.tsx b/src/pages/index.tsx index 6c2146b..bec0cc0 100644 --- a/src/pages/index.tsx +++ b/src/pages/index.tsx @@ -1,4 +1,5 @@ import React from "react"; +import dynamic from "next/dynamic"; import Head from "next/head"; import Link from "next/link"; import styled, { ThemeProvider } from "styled-components"; @@ -20,9 +21,10 @@ import { SiVisualstudiocode } from "react-icons/si"; import { Typewriter } from "react-simple-typewriter"; import { HovercardAds } from "src/components/HovercardAds"; import { lightTheme } from "src/constants/theme"; -import { Footer } from "src/layout/Footer"; import { Navbar } from "src/layout/Navbar"; +const Footer = dynamic(() => import("src/layout/Footer").then(c => c.Footer)); + const StyledHeroSection = styled.div` --bg-color: ${({ theme }) => theme.GRID_BG_COLOR}; --line-color-1: ${({ theme }) => theme.GRID_COLOR_PRIMARY}; @@ -33,8 +35,16 @@ const StyledHeroSection = styled.div` linear-gradient(90deg, var(--line-color-1) 1.5px, transparent 1.5px), linear-gradient(var(--line-color-2) 1px, transparent 1px), linear-gradient(90deg, var(--line-color-2) 1px, transparent 1px); - background-position: -1.5px -1.5px, -1.5px -1.5px, -1px -1px, -1px -1px; - background-size: 100px 100px, 100px 100px, 20px 20px, 20px 20px; + background-position: + -1.5px -1.5px, + -1.5px -1.5px, + -1px -1px, + -1px -1px; + background-size: + 100px 100px, + 100px 100px, + 20px 20px, + 20px 20px; @media only screen and (max-width: 1240px) { flex-direction: column; @@ -252,7 +262,7 @@ const Features = () => ( - multiple format support + multiple format support DYNAMIC DATA VISUALIZATION diff --git a/src/pages/reset-password.tsx b/src/pages/reset-password.tsx index 9071301..06425a7 100644 --- a/src/pages/reset-password.tsx +++ b/src/pages/reset-password.tsx @@ -4,10 +4,10 @@ import { useRouter } from "next/router"; import styled from "styled-components"; import { PaperProps, Center, Button, Group, Paper, Stack, TextInput, Text } from "@mantine/core"; import { toast } from "react-hot-toast"; -import { altogic } from "src/api/altogic"; import { Footer } from "src/layout/Footer"; import { JSONCrackLogo } from "src/layout/JsonCrackLogo"; import { Navbar } from "src/layout/Navbar"; +import { altogic } from "src/lib/api/altogic"; import useUser from "src/store/useUser"; const StyledPageWrapper = styled.div` diff --git a/src/pages/sign-in.tsx b/src/pages/sign-in.tsx index dd0b8c3..5ca5136 100644 --- a/src/pages/sign-in.tsx +++ b/src/pages/sign-in.tsx @@ -22,10 +22,10 @@ import { useForm } from "@mantine/form"; import { useToggle, upperFirst } from "@mantine/hooks"; import { toast } from "react-hot-toast"; import { AiOutlineGithub, AiOutlineGoogle } from "react-icons/ai"; -import { altogic } from "src/api/altogic"; import { Footer } from "src/layout/Footer"; import { JSONCrackLogo } from "src/layout/JsonCrackLogo"; import { Navbar } from "src/layout/Navbar"; +import { altogic } from "src/lib/api/altogic"; import useUser from "src/store/useUser"; export function AuthenticationForm(props: PaperProps) { @@ -54,6 +54,7 @@ export function AuthenticationForm(props: PaperProps) { const onSubmit = (e: React.FormEvent) => { e.preventDefault(); const validate = form.validate(); + if (validate.hasErrors) return; setLoading(true); diff --git a/src/services/json.ts b/src/services/json.ts index 1225f94..b009096 100644 --- a/src/services/json.ts +++ b/src/services/json.ts @@ -1,8 +1,8 @@ import dayjs from "dayjs"; import { decompressFromBase64 } from "lz-string"; -import { altogic, AltogicResponse } from "src/api/altogic"; -import { FileFormat } from "src/constants/file"; +import { altogic, AltogicResponse } from "src/lib/api/altogic"; import { File } from "src/store/useFile"; +import { FileFormat } from "src/types/models"; const saveToCloud = async ( id: string | null, @@ -21,6 +21,7 @@ const getFromCloud = async (id: string) => { if (errors) throw errors; const isCompressed = dayjs("2023-04-20T07:04:25.255Z").isAfter(data?.updatedAt); + if (isCompressed) { return { ...data, json: decompressFromBase64(data.json) }; } @@ -29,7 +30,7 @@ const getFromCloud = async (id: string) => { }; const getAllJson = async (): Promise> => - await altogic.endpoint.get(`json`); + await altogic.endpoint.get("json"); const updateJson = async (id: string, data: object) => await altogic.endpoint.put(`json/${id}`, { diff --git a/src/store/useFile.ts b/src/store/useFile.ts index 8d8a099..55125dd 100644 --- a/src/store/useFile.ts +++ b/src/store/useFile.ts @@ -4,9 +4,9 @@ import _set from "lodash.set"; import { toast } from "react-hot-toast"; import { create } from "zustand"; import { defaultJson } from "src/constants/data"; -import { FileFormat } from "src/constants/file"; +import { contentToJson, jsonToContent } from "src/lib/utils/json/jsonAdapter"; import { getFromCloud, saveToCloud } from "src/services/json"; -import { contentToJson, jsonToContent } from "src/utils/json/jsonAdapter"; +import { FileFormat } from "src/types/models"; import useGraph from "./useGraph"; import useJson from "./useJson"; import useStored from "./useStored"; @@ -99,9 +99,11 @@ const useFile = create()((set, get) => ({ setFormat: async format => { try { const prevFormat = get().format; + set({ format }); const contentJson = await contentToJson(get().contents, prevFormat); const jsonContent = await jsonToContent(JSON.stringify(contentJson, null, 2), format); + get().setContents({ contents: jsonContent, hasChanges: false }); } catch (error) { get().clear(); @@ -112,6 +114,7 @@ const useFile = create()((set, get) => ({ try { set({ ...(contents && { contents }), error: null, hasChanges }); const json = await contentToJson(get().contents, get().format); + if (!useStored.getState().liveTransform && skipUpdate) return; debouncedUpdateJson(json); @@ -164,6 +167,7 @@ const useFile = create()((set, get) => ({ if (isURL(id)) return get().fetchUrl(id); const file = await getFromCloud(id); + get().setFile(file); } catch (error) { useJson.setState({ loading: false }); @@ -195,6 +199,7 @@ const useFile = create()((set, get) => ({ ); const contents = await jsonToContent(JSON.stringify(newJson, null, 2), get().format); + get().setContents({ contents }); if (callback) callback(); } catch (error) { diff --git a/src/store/useGraph.ts b/src/store/useGraph.ts index f19d004..d02cd21 100644 --- a/src/store/useGraph.ts +++ b/src/store/useGraph.ts @@ -1,29 +1,44 @@ import { ReactZoomPanPinchRef } from "react-zoom-pan-pinch"; import { CanvasDirection } from "reaflow/dist/layout/elkLayout"; import { create } from "zustand"; -import { getChildrenEdges } from "src/utils/graph/getChildrenEdges"; -import { getOutgoers } from "src/utils/graph/getOutgoers"; -import { parser } from "src/utils/json/jsonParser"; +import { getChildrenEdges } from "src/lib/utils/graph/getChildrenEdges"; +import { getOutgoers } from "src/lib/utils/graph/getOutgoers"; +import { parser } from "src/lib/utils/json/jsonParser"; +import { NodeData, EdgeData } from "src/types/models"; import useJson from "./useJson"; -const initialStates = { - zoomPanPinch: null as ReactZoomPanPinchRef | null, - direction: "RIGHT" as CanvasDirection, +export interface Graph { + zoomPanPinch: ReactZoomPanPinchRef | null; + direction: CanvasDirection; + loading: boolean; + graphCollapsed: boolean; + foldNodes: boolean; + fullscreen: boolean; + nodes: NodeData[]; + edges: EdgeData[]; + collapsedNodes: string[]; + collapsedEdges: string[]; + collapsedParents: string[]; + selectedNode: NodeData | null; + path: string; +} + +const initialStates: Graph = { + zoomPanPinch: null, + direction: "RIGHT", loading: true, graphCollapsed: false, foldNodes: false, fullscreen: false, - nodes: [] as NodeData[], - edges: [] as EdgeData[], - collapsedNodes: [] as string[], - collapsedEdges: [] as string[], - collapsedParents: [] as string[], - selectedNode: {} as NodeData, + nodes: [], + edges: [], + collapsedNodes: [], + collapsedEdges: [], + collapsedParents: [], + selectedNode: null, path: "", }; -export type Graph = typeof initialStates; - interface GraphActions { setGraph: (json?: string, options?: Partial[]) => void; setLoading: (loading: boolean) => void; @@ -48,6 +63,7 @@ const useGraph = create((set, get) => ({ setSelectedNode: nodeData => set({ selectedNode: nodeData }), setGraph: (data, options) => { const { nodes, edges } = parser(data ?? useJson.getState().json); + set({ nodes, edges, @@ -119,7 +135,7 @@ const useGraph = create((set, get) => ({ .map(edge => edge.to); const collapsedParents = get() - .nodes.filter(node => !parentNodesIds.includes(node.id) && node.data.isParent) + .nodes.filter(node => !parentNodesIds.includes(node.id) && node.data?.isParent) .map(node => node.id); const collapsedNodes = get() @@ -151,6 +167,7 @@ const useGraph = create((set, get) => ({ }, zoomIn: () => { const zoomPanPinch = get().zoomPanPinch; + zoomPanPinch?.setTransform( zoomPanPinch?.state.positionX, zoomPanPinch?.state.positionY, @@ -159,6 +176,7 @@ const useGraph = create((set, get) => ({ }, zoomOut: () => { const zoomPanPinch = get().zoomPanPinch; + zoomPanPinch?.setTransform( zoomPanPinch?.state.positionX, zoomPanPinch?.state.positionY, @@ -168,6 +186,7 @@ const useGraph = create((set, get) => ({ centerView: () => { const zoomPanPinch = get().zoomPanPinch; const canvas = document.querySelector(".jsoncrack-canvas") as HTMLElement; + if (zoomPanPinch && canvas) zoomPanPinch.zoomToElement(canvas); }, toggleFold: foldNodes => { diff --git a/src/store/useUser.ts b/src/store/useUser.ts index 31c49d3..ed79bdc 100644 --- a/src/store/useUser.ts +++ b/src/store/useUser.ts @@ -1,8 +1,8 @@ -import * as Sentry from "@sentry/nextjs"; +import { setUser } from "@sentry/nextjs"; import toast from "react-hot-toast"; import { create } from "zustand"; -import { altogic } from "src/api/altogic"; -import { AltogicAuth, User } from "src/typings/altogic"; +import { altogic } from "src/lib/api/altogic"; +import { AltogicAuth, User } from "src/types/altogic"; import useModal from "./useModal"; const isDevelopment = process.env.NODE_ENV === "development"; @@ -43,9 +43,11 @@ const useUser = create()(set => ({ setUser: (key, value) => set({ [key]: value }), logout: async () => { const session = altogic.auth.getSession(); + if (!session) return; const { errors } = await altogic.auth.signOut(session.token); + if (errors?.items) return console.error(errors); set(initialStates); @@ -63,6 +65,7 @@ const useUser = create()(set => ({ if (currentSession) { const { user, errors } = await altogic.auth.getUserFromDB(); + if (errors?.items || !user) { altogic.auth.clearLocalData(); return; @@ -72,10 +75,11 @@ const useUser = create()(set => ({ altogic.auth.setSession(currentSession); const { data: premiumData } = await altogic.endpoint.get("/isPremium"); - Sentry.setUser({ id: user._id, email: user.email, username: user.name }); + setUser({ id: user._id, email: user.email, username: user.name }); set({ user: user as User, isAuthenticated: true, premium: premiumData.premium }); } else if (new URLSearchParams(window.location.search).get("access_token")) { const { errors, user } = await altogic.auth.getAuthGrant(); + if (errors?.items) { toast.error(errors.items[0].message); return; @@ -84,7 +88,7 @@ const useUser = create()(set => ({ if (user) { const { data: premiumData } = await altogic.endpoint.get("/isPremium"); - Sentry.setUser({ id: user._id, email: user.email, username: user.name }); + setUser({ id: user._id, email: user.email, username: user.name }); set({ user: user as User, isAuthenticated: true, premium: premiumData.premium }); } } diff --git a/src/typings/altogic.ts b/src/types/altogic.ts similarity index 100% rename from src/typings/altogic.ts rename to src/types/altogic.ts diff --git a/src/typings/global.d.ts b/src/types/global.d.ts similarity index 100% rename from src/typings/global.d.ts rename to src/types/global.d.ts diff --git a/src/types/models.ts b/src/types/models.ts new file mode 100644 index 0000000..9bdc486 --- /dev/null +++ b/src/types/models.ts @@ -0,0 +1,30 @@ +/* eslint unused-imports/no-unused-imports: 0 */ +import { NodeType } from "jsonc-parser"; + +export interface NodeData { + id: string; + text: string | [string, string][]; + width: number; + height: number; + path?: string; + data: { + type: NodeType; + isParent: boolean; + isEmpty: boolean; + childrenCount: number; + }; +} + +export interface EdgeData { + id: string; + from: string; + to: string; +} + +export enum FileFormat { + "JSON" = "json", + "YAML" = "yaml", + "XML" = "xml", + "TOML" = "toml", + "CSV" = "csv", +} diff --git a/src/typings/styled.d.ts b/src/types/styled.d.ts similarity index 100% rename from src/typings/styled.d.ts rename to src/types/styled.d.ts diff --git a/src/typings/types.d.ts b/src/typings/types.d.ts deleted file mode 100644 index 25f0d8f..0000000 --- a/src/typings/types.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -interface NodeData { - id: string; - disabled?: boolean; - text?: any; - path?: string; - height?: number; - width?: number; - isParent?: string; - ports?: PortData[]; - icon?: IconData; - nodePadding?: number | [number, number] | [number, number, number, number]; - data?: T; - className?: string; - layoutOptions?: ElkNodeLayoutOptions; - selectionDisabled?: boolean; -} - -interface EdgeData { - id: string; - disabled?: boolean; - text?: any; - from?: string; - to?: string; - fromPort?: string; - toPort?: string; - data?: T; - className?: string; - containerClassName?: string; - arrowHeadType?: any; - parent?: string; - selectionDisabled?: boolean; -} diff --git a/tsconfig.json b/tsconfig.json index 8adba52..f0c1a62 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -15,7 +15,8 @@ "isolatedModules": true, "jsx": "preserve", "incremental": true, - "noImplicitAny": false + "noImplicitAny": false, + "typeRoots": ["types"] }, "include": ["src", "next-env.d.ts",], "exclude": ["node_modules"] diff --git a/yarn.lock b/yarn.lock index eaabf61..b6e1afc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" @@ -316,14 +321,14 @@ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.1.tgz#cdd35dce4fa1a89a4fd42b1599eb35b3af408884" integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== -"@eslint/eslintrc@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.3.tgz#4910db5505f4d503f27774bf356e3704818a0331" - integrity sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ== +"@eslint/eslintrc@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.0.tgz#82256f164cc9e0b59669efc19d57f8092706841d" + integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.2" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -331,10 +336,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.43.0": - version "8.43.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.43.0.tgz#559ca3d9ddbd6bf907ad524320a0d14b85586af0" - integrity sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg== +"@eslint/js@8.44.0": + version "8.44.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.44.0.tgz#961a5903c74139390478bdc808bcde3fc45ab7af" + integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== "@floating-ui/core@^1.2.2": version "1.2.2" @@ -433,67 +438,67 @@ resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== -"@mantine/core@^6.0.13": - version "6.0.13" - resolved "https://registry.yarnpkg.com/@mantine/core/-/core-6.0.13.tgz#f05a952e1e2e3cc6eb24d4d77b6c96a1c23fb0bb" - integrity sha512-FjVUGgat2qISV9WD1maVJa81y7H0JjKJ3m0cJj65PzgrXT20hzdEda7S3i4j+a8vUnx+836x5q/yS+RDHvoSlA== +"@mantine/core@^6.0.16": + version "6.0.16" + resolved "https://registry.yarnpkg.com/@mantine/core/-/core-6.0.16.tgz#bd5271ec907cf2d7df2f9b791bc5d406f75dafe1" + integrity sha512-ai7HfWo214JLmf+QNEmFfTaBgxreMpY/ZK7dIDNkFfCmDAWjFxwCSc7flh8NHX2ZJN5uTc82p2i0MLJ/GZ5xrA== dependencies: "@floating-ui/react" "^0.19.1" - "@mantine/styles" "6.0.13" - "@mantine/utils" "6.0.13" + "@mantine/styles" "6.0.16" + "@mantine/utils" "6.0.16" "@radix-ui/react-scroll-area" "1.0.2" react-remove-scroll "^2.5.5" react-textarea-autosize "8.3.4" -"@mantine/form@^6.0.13": - version "6.0.13" - resolved "https://registry.yarnpkg.com/@mantine/form/-/form-6.0.13.tgz#9d0e87efb0e139702b01f387fdec0d977ecdc385" - integrity sha512-oR/bnnJEd6T42N5pUhXYZ5RaKC4EZozEFW2jHCWDKIAJDjIgGUQrLL/tCjclQ2NwtghaoCTz+9zu32CuXer7TA== +"@mantine/form@^6.0.16": + version "6.0.16" + resolved "https://registry.yarnpkg.com/@mantine/form/-/form-6.0.16.tgz#c6b7064a87df17dad82101a71ebe96ccd37e686f" + integrity sha512-4TwxJKGQQRx7rj5yb9WgS0z/Ud8ckg0mMCiD3grKTxDCp0g8Tvk2Df7ptWFx2n+hxhBYVwMQSKggWuuDMFWBNA== dependencies: fast-deep-equal "^3.1.3" klona "^2.0.5" -"@mantine/hooks@^6.0.13": - version "6.0.13" - resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-6.0.13.tgz#d90fa315ee30a900e0d9a460c6bb00c9a65f18e0" - integrity sha512-fHuE3zXo5OP/Q1dMOTnegU6U+tI9GuhO2tgOz6szVuOxrrk0Hzuq1Na9NUSv27HShSRbAfQk+hvyIh+iVV7KXA== +"@mantine/hooks@^6.0.16": + version "6.0.16" + resolved "https://registry.yarnpkg.com/@mantine/hooks/-/hooks-6.0.16.tgz#507c322347659424a915ec6b541d848f53abcf6a" + integrity sha512-DnfMYSTSjYxbQJ80TzKHO5gRXGTIQKxBnRQVc+n4RANTwgWMiwEmxIwqRjbulfLzIhEvplskhqGgElunIAfw7g== -"@mantine/next@^6.0.13": - version "6.0.13" - resolved "https://registry.yarnpkg.com/@mantine/next/-/next-6.0.13.tgz#018d9dc8a93430d45176df505978f8025e420588" - integrity sha512-dUQ3cxZ/6f6hxegx6zV4aCPAgZSb9NlCQkDlELvtiAJXpIKtogOcVxxKWaDSEHD5YHVeV2f+CBPVqaa3LddiYg== +"@mantine/next@^6.0.16": + version "6.0.16" + resolved "https://registry.yarnpkg.com/@mantine/next/-/next-6.0.16.tgz#3d266a96446a3da8ec8296f12b227e2e93cb4fc1" + integrity sha512-shIcYK/tK/jQpdJkzdgukgwwpqiBxoskaCJDcuZxPVckPYssKLscZlxaiyBShFmPqd1bxULJ0L9w+F73qibECw== dependencies: - "@mantine/ssr" "6.0.13" - "@mantine/styles" "6.0.13" + "@mantine/ssr" "6.0.16" + "@mantine/styles" "6.0.16" -"@mantine/prism@^6.0.13": - version "6.0.13" - resolved "https://registry.yarnpkg.com/@mantine/prism/-/prism-6.0.13.tgz#ef840bf2cd59d567db203bba167e9c77155eda39" - integrity sha512-048dxoEw4XeJAVh8sBzMguhk+pG8ULDPVGI+aQBsuoERezSV4WVqeKl1+ddoOew3qXbsH/UH4ox5lmf1S4WTwg== +"@mantine/prism@^6.0.16": + version "6.0.16" + resolved "https://registry.yarnpkg.com/@mantine/prism/-/prism-6.0.16.tgz#a183d6899bb1dd8e0b90725a7d00708d9b8c4518" + integrity sha512-bWnwRMA7fBfSMpZO2YHIsJ4yt3JTZmPp1nQ62JKpey7rfCJMMuzuCXagCHZthEChZZoQnwmndr4agEzuNIIxmA== dependencies: - "@mantine/utils" "6.0.13" + "@mantine/utils" "6.0.16" prism-react-renderer "^1.2.1" -"@mantine/ssr@6.0.13": - version "6.0.13" - resolved "https://registry.yarnpkg.com/@mantine/ssr/-/ssr-6.0.13.tgz#5ccfdc8b7c26e16c326b7f91200f6a38bb58965e" - integrity sha512-IMeWkzTvBM5/LjAprdF6o0Xn6U8mv/Hi88YDZpTLDkRAc9QBEOy4P9zOmpHz3YLRFHQm+Hqr078YckDh5F+KXQ== +"@mantine/ssr@6.0.16": + version "6.0.16" + resolved "https://registry.yarnpkg.com/@mantine/ssr/-/ssr-6.0.16.tgz#020ea4d9509321206c1c0c4cdeb8d30fe2caac8c" + integrity sha512-caF6MQrYMlydVZBvqsZWetA1UECZsYH6EOUix2VNwRGC66PdWFXW98IROBTYZGVixNB1gxcTrcXsoJ1UrsFJwA== dependencies: - "@mantine/styles" "6.0.13" + "@mantine/styles" "6.0.16" html-react-parser "1.4.12" -"@mantine/styles@6.0.13": - version "6.0.13" - resolved "https://registry.yarnpkg.com/@mantine/styles/-/styles-6.0.13.tgz#a3dc542e1613e7cc461dd8b11c6069b5dd8143d7" - integrity sha512-+27oX8ObiBv8jHHDxXKjqe+7cfTJyaAV/Ie00T49EE4LuHuS6nL4vlXHmqamFtDCj2ypEWBV0sdXDev/DNAXSg== +"@mantine/styles@6.0.16": + version "6.0.16" + resolved "https://registry.yarnpkg.com/@mantine/styles/-/styles-6.0.16.tgz#625e5be80fc964fa6634f10e798c19f5a4c265ce" + integrity sha512-0rDE3BzJOKVdPAbnL3XokVWNYgo1z323UgAURdB+WvzwZY7PhblwvrxUDwvvV77qCUENg2vU0LKHqTQD1DDLTg== dependencies: clsx "1.1.1" csstype "3.0.9" -"@mantine/utils@6.0.13": - version "6.0.13" - resolved "https://registry.yarnpkg.com/@mantine/utils/-/utils-6.0.13.tgz#a7adc128a2e7c07031c7221c1533800d0c80279a" - integrity sha512-iqIU9wurqAeccVbWjM0yr1JGne5VP+ob55M03QAXOEN4+ck93VDTjCkZJR2RFhDcs5q0twQFoOmU/gULR8aKIA== +"@mantine/utils@6.0.16": + version "6.0.16" + resolved "https://registry.yarnpkg.com/@mantine/utils/-/utils-6.0.16.tgz#b39e47ef8fa4463322e9aa10cdd5980f4310b705" + integrity sha512-UFel9DbifL3zS8pTJlr6GfwGd6464OWXCJdUq0oLydgimbC1VV2PnptBr6FMwIpPVcxouLOtY1cChzwFH95PSA== "@monaco-editor/loader@^1.3.3": version "1.3.3" @@ -562,89 +567,69 @@ hey-listen "^1.0.8" tslib "^2.3.1" -"@next/bundle-analyzer@^13.4.3": - version "13.4.3" - resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-13.4.3.tgz#7e48a91eac582e32e4d235d8cf7503843f100000" - integrity sha512-jzWk6eaCFaIXfIswyQQWnR6FN22HpWoSWe3nLa3JCNkNd2ksriJgn86oQyZRxgAPaEbVKQXBp8GZi8e5DrhVJg== +"@next/bundle-analyzer@^13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/bundle-analyzer/-/bundle-analyzer-13.4.10.tgz#b4393f74567e6cedf6f31e6f3d0dfcbb2ef4d3dc" + integrity sha512-QwjRH/x1coj8+2Q2suXKez01Irc/rZQXiZ7qE96jj/xR1C+zze6cEdlhWzMlsBFlLmazBhFeOb0PeK6r4dVImA== dependencies: webpack-bundle-analyzer "4.7.0" -"@next/env@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.2.3.tgz#77ca49edb3c1d7c5263bb8f2ebe686080e98279e" - integrity sha512-FN50r/E+b8wuqyRjmGaqvqNDuWBWYWQiigfZ50KnSFH0f+AMQQyaZl+Zm2+CIpKk0fL9QxhLxOpTVA3xFHgFow== +"@next/env@13.3.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.3.0.tgz#cc2e49f03060a4684ce7ec7fd617a21bc5b9edba" + integrity sha512-AjppRV4uG3No7L1plinoTQETH+j2F10TEnrMfzbTUYwze5sBUPveeeBAPZPm8OkJZ1epq9OyYKhZrvbD6/9HCQ== -"@next/eslint-plugin-next@13.4.6": - version "13.4.6" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.6.tgz#6a291305226b3f762fdbc01e123efadeb63e5aaf" - integrity sha512-bPigeu0RI7bgy1ucBA2Yqcfg539y0Lzo38P2hIkrRB1GNvFSbYg6RTu8n6tGqPVrH3TTlPTNKLXG01wc+5NuwQ== +"@next/eslint-plugin-next@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-13.4.10.tgz#ff19867396a7709ff75986645f2223787fbb2d9b" + integrity sha512-YJqyq6vk39JQfvaNtN83t/p5Jy45+bazRL+V4QI8FPd3FBqFYMEsULiwRLgSJMgFqkk4t4JbeZurz+gILEAFpA== dependencies: glob "7.1.7" -"@next/swc-android-arm-eabi@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.3.tgz#85eed560c87c7996558c868a117be9780778f192" - integrity sha512-mykdVaAXX/gm+eFO2kPeVjnOCKwanJ9mV2U0lsUGLrEdMUifPUjiXKc6qFAIs08PvmTMOLMNnUxqhGsJlWGKSw== +"@next/swc-darwin-arm64@13.3.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.3.0.tgz#38f18e0639cd4c7edc6a38d4b83fe00f38eea4f2" + integrity sha512-DmIQCNq6JtccLPPBzf0dgh2vzMWt5wjxbP71pCi5EWpWYE3MsP6FcRXi4MlAmFNDQOfcFXR2r7kBeG1LpZUh1w== -"@next/swc-android-arm64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-android-arm64/-/swc-android-arm64-13.2.3.tgz#8ac54ca9795a48afc4631b4823a4864bd5db0129" - integrity sha512-8XwHPpA12gdIFtope+n9xCtJZM3U4gH4vVTpUwJ2w1kfxFmCpwQ4xmeGSkR67uOg80yRMuF0h9V1ueo05sws5w== +"@next/swc-darwin-x64@13.3.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.3.0.tgz#b670ed1fd1d231aa21279173ec52e3ad56dc6aeb" + integrity sha512-oQoqFa88OGgwnYlnAGHVct618FRI/749se0N3S8t9Bzdv5CRbscnO0RcX901+YnNK4Q6yeiizfgO3b7kogtsZg== -"@next/swc-darwin-arm64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.3.tgz#f674e3c65aec505b6d218a662ade3fe248ccdbda" - integrity sha512-TXOubiFdLpMfMtaRu1K5d1I9ipKbW5iS2BNbu8zJhoqrhk3Kp7aRKTxqFfWrbliAHhWVE/3fQZUYZOWSXVQi1w== +"@next/swc-linux-arm64-gnu@13.3.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.3.0.tgz#b114935f6b4c94c123f6cac55a4823d483209ba5" + integrity sha512-Wzz2p/WqAJUqTVoLo6H18WMeAXo3i+9DkPDae4oQG8LMloJ3if4NEZTnOnTUlro6cq+S/W4pTGa97nWTrOjbGw== -"@next/swc-darwin-x64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.3.tgz#a15ea7fb4c46034a8f5e387906d0cad08387075a" - integrity sha512-GZctkN6bJbpjlFiS5pylgB2pifHvgkqLAPumJzxnxkf7kqNm6rOGuNjsROvOWVWXmKhrzQkREO/WPS2aWsr/yw== +"@next/swc-linux-arm64-musl@13.3.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.3.0.tgz#67a57309f8761c7d00d629d6785d56ed0567a0d2" + integrity sha512-xPVrIQOQo9WXJYgmoTlMnAD/HlR/1e1ZIWGbwIzEirXBVBqMARUulBEIKdC19zuvoJ477qZJgBDCKtKEykCpyQ== -"@next/swc-freebsd-x64@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.3.tgz#f7ac6ae4f7d706ff2431f33e40230a554c8c2cbc" - integrity sha512-rK6GpmMt/mU6MPuav0/M7hJ/3t8HbKPCELw/Uqhi4732xoq2hJ2zbo2FkYs56y6w0KiXrIp4IOwNB9K8L/q62g== +"@next/swc-linux-x64-gnu@13.3.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.3.0.tgz#11bd2bea7c00b40be111c0dd16e71171f3792086" + integrity sha512-jOFlpGuPD7W2tuXVJP4wt9a3cpNxWAPcloq5EfMJRiXsBBOjLVFZA7boXYxEBzSVgUiVVr1V9T0HFM7pULJ1qA== -"@next/swc-linux-arm-gnueabihf@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.3.tgz#84ad9e9679d55542a23b590ad9f2e1e9b2df62f7" - integrity sha512-yeiCp/Odt1UJ4KUE89XkeaaboIDiVFqKP4esvoLKGJ0fcqJXMofj4ad3tuQxAMs3F+qqrz9MclqhAHkex1aPZA== +"@next/swc-linux-x64-musl@13.3.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.3.0.tgz#d57e99f85890799b78719c3ea32a4624de8d701b" + integrity sha512-2OwKlzaBgmuet9XYHc3KwsEilzb04F540rlRXkAcjMHL7eCxB7uZIGtsVvKOnQLvC/elrUegwSw1+5f7WmfyOw== -"@next/swc-linux-arm64-gnu@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.3.tgz#56f9175bc632d647c60b9e8bedc0875edf92d8b7" - integrity sha512-/miIopDOUsuNlvjBjTipvoyjjaxgkOuvlz+cIbbPcm1eFvzX2ltSfgMgty15GuOiR8Hub4FeTSiq3g2dmCkzGA== +"@next/swc-win32-arm64-msvc@13.3.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.3.0.tgz#0c209aa35d1c88b01e78259a89cd68f4139b5093" + integrity sha512-OeHiA6YEvndxT46g+rzFK/MQTfftKxJmzslERMu9LDdC6Kez0bdrgEYed5eXFK2Z1viKZJCGRlhd06rBusyztA== -"@next/swc-linux-arm64-musl@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.3.tgz#7d4cf00e8f1729a3de464da0624773f5d0d14888" - integrity sha512-sujxFDhMMDjqhruup8LLGV/y+nCPi6nm5DlFoThMJFvaaKr/imhkXuk8uCTq4YJDbtRxnjydFv2y8laBSJVC2g== +"@next/swc-win32-ia32-msvc@13.3.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.3.0.tgz#52ae74da1dd6d840c3743923367d27ed013803dd" + integrity sha512-4aB7K9mcVK1lYEzpOpqWrXHEZympU3oK65fnNcY1Qc4HLJFLJj8AViuqQd4jjjPNuV4sl8jAwTz3gN5VNGWB7w== -"@next/swc-linux-x64-gnu@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.3.tgz#17de404910c4ebf7a1d366b19334d7e27e126ab0" - integrity sha512-w5MyxPknVvC9LVnMenAYMXMx4KxPwXuJRMQFvY71uXg68n7cvcas85U5zkdrbmuZ+JvsO5SIG8k36/6X3nUhmQ== - -"@next/swc-linux-x64-musl@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.3.tgz#07cb7b7f3a3a98034e2533f82638a9b099ba4ab1" - integrity sha512-CTeelh8OzSOVqpzMFMFnVRJIFAFQoTsI9RmVJWW/92S4xfECGcOzgsX37CZ8K982WHRzKU7exeh7vYdG/Eh4CA== - -"@next/swc-win32-arm64-msvc@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.3.tgz#b9ac98c954c71ec9de45d3497a8585096b873152" - integrity sha512-7N1KBQP5mo4xf52cFCHgMjzbc9jizIlkTepe9tMa2WFvEIlKDfdt38QYcr9mbtny17yuaIw02FXOVEytGzqdOQ== - -"@next/swc-win32-ia32-msvc@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.3.tgz#5ec48653a48fd664e940c69c96bba698fdae92eb" - integrity sha512-LzWD5pTSipUXTEMRjtxES/NBYktuZdo7xExJqGDMnZU8WOI+v9mQzsmQgZS/q02eIv78JOCSemqVVKZBGCgUvA== - -"@next/swc-win32-x64-msvc@13.2.3": - version "13.2.3" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.3.tgz#cd432f280beb8d8de5b7cd2501e9f502e9f3dd72" - integrity sha512-aLG2MaFs4y7IwaMTosz2r4mVbqRyCnMoFqOcmfTi7/mAS+G4IMH0vJp4oLdbshqiVoiVuKrAfqtXj55/m7Qu1Q== +"@next/swc-win32-x64-msvc@13.3.0": + version "13.3.0" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.3.0.tgz#db7b55fee834dc8c2c484c696469e65bae2ee770" + integrity sha512-Reer6rkLLcoOvB0dd66+Y7WrWVFH7sEEkF/4bJCIfsSKnTStTYaHtwIJAwbqnt9I392Tqvku0KkoqZOryWV9LQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -800,27 +785,27 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.2.0.tgz#8be36a1f66f3265389e90b5f9c9962146758f728" integrity sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg== -"@sentry-internal/tracing@7.55.2": - version "7.55.2" - resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.55.2.tgz#29687b8327cc9d980695603d451316706f2630ed" - integrity sha512-yBW+R7NfwLrOjpwOJHoOSvGDDoM3ZKod5OKXi7Gd5tYqVm1mCaL0n2/wlNMcGTbPbulLBtgzjoTU1bPJAGhmYw== +"@sentry-internal/tracing@7.58.1": + version "7.58.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/tracing/-/tracing-7.58.1.tgz#9be915092793da7f1e63eb0c56c7663c6e639933" + integrity sha512-kOWKqyjYdDgvO6CacXneE9UrFQHT3BXF1UpCAlnHchW/TqRFmg89sJAEUjEPGzN7y6IaX1G4j2dBPDE0OFQi3w== dependencies: - "@sentry/core" "7.55.2" - "@sentry/types" "7.55.2" - "@sentry/utils" "7.55.2" - tslib "^1.9.3" + "@sentry/core" "7.58.1" + "@sentry/types" "7.58.1" + "@sentry/utils" "7.58.1" + tslib "^2.4.1 || ^1.9.3" -"@sentry/browser@7.55.2": - version "7.55.2" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.55.2.tgz#32a5cf7cc2af14b83926ea04ea140e1024f000a6" - integrity sha512-RgA4KOD6t8XHVLm6D2oTh9KW19g3DoQ0QsrUmAq4+giSj2AyDW67VP2V4E72mCZ9Ln9AkNhY0Eh3XuD3opiFQA== +"@sentry/browser@7.58.1": + version "7.58.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.58.1.tgz#ad6ab07339f814c46add84e5dc4390b738f38730" + integrity sha512-7+6Z/T7m0A/2/ImMCakpMOaWTPxmENzTdaojhkyVQKuYUZr7mCe4nco0jsongwY634zSUziuVsibi0jxMMTdBA== dependencies: - "@sentry-internal/tracing" "7.55.2" - "@sentry/core" "7.55.2" - "@sentry/replay" "7.55.2" - "@sentry/types" "7.55.2" - "@sentry/utils" "7.55.2" - tslib "^1.9.3" + "@sentry-internal/tracing" "7.58.1" + "@sentry/core" "7.58.1" + "@sentry/replay" "7.58.1" + "@sentry/types" "7.58.1" + "@sentry/utils" "7.58.1" + tslib "^2.4.1 || ^1.9.3" "@sentry/cli@^1.74.6": version "1.75.0" @@ -834,89 +819,89 @@ proxy-from-env "^1.1.0" which "^2.0.2" -"@sentry/core@7.55.2": - version "7.55.2" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.55.2.tgz#a3988393ab791eba5d7fe735dfecea5a615e9e50" - integrity sha512-clzQirownxqADv9+fopyMJTHzaoWedkN2+mi4ro1LxjLgROdXBFurMCC1nT+7cH/xvQ5gMIRkM/y/4gRtKy2Ew== +"@sentry/core@7.58.1": + version "7.58.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.58.1.tgz#d4010f2b0bcfe87b57fa490c0c7ab7a567ed4707" + integrity sha512-hpeB5fZ5T6Jg1CBqz486jHgWuJ5R/HD0wyYX+S3LDDsHCJo6V3TxNuoxYDlTTerRRfZdTwr9GYJXskehpU26IA== dependencies: - "@sentry/types" "7.55.2" - "@sentry/utils" "7.55.2" - tslib "^1.9.3" + "@sentry/types" "7.58.1" + "@sentry/utils" "7.58.1" + tslib "^2.4.1 || ^1.9.3" -"@sentry/integrations@7.55.2": - version "7.55.2" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.55.2.tgz#f4d528f95a36748c10a5edf40e28207b2abe2d02" - integrity sha512-QgHx7MKMLMx1e5XgQyeUYtZA+xPc7IjS0MaZTpIRehtxD8Fg1tWkOxV4PP2nUXksLjfkoISo0jpYLtuDSCGFTw== +"@sentry/integrations@7.58.1": + version "7.58.1" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.58.1.tgz#da033779e244cbed56598f94382a9e1da2e50371" + integrity sha512-fKZV/QDPM7rIZhaJpFwgxD4rzWLtRuag7cOWfvHCsezJnhXEF8u45sBak/VWmSr8SbcvJAIJSZbWYi0N91hNHQ== dependencies: - "@sentry/types" "7.55.2" - "@sentry/utils" "7.55.2" + "@sentry/types" "7.58.1" + "@sentry/utils" "7.58.1" localforage "^1.8.1" - tslib "^1.9.3" + tslib "^2.4.1 || ^1.9.3" "@sentry/nextjs@^7.55.2": - version "7.55.2" - resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-7.55.2.tgz#03a6d6779b30d25bb87e4bbfaba4457b40eae0ab" - integrity sha512-YIq/gLMCCdcKmPln5zglWHKwQB8KWGblOJ19t/JuHSyffWXL1x1IYyBYgpdjzn6q0AgwsK4IM6TqTb3ISN8wLQ== + version "7.58.1" + resolved "https://registry.yarnpkg.com/@sentry/nextjs/-/nextjs-7.58.1.tgz#16f87ed26e4f8f474ee41f16f6e20a7ac7672904" + integrity sha512-/wNVWNJ4vdVHBAvbnjbrRfAX3YhGvdC/CR9IAN5h0tTNjD/LFaHUN97/MUn9oZ7FpFgOOveM5bqK/5b6QRCBCg== dependencies: "@rollup/plugin-commonjs" "24.0.0" - "@sentry/core" "7.55.2" - "@sentry/integrations" "7.55.2" - "@sentry/node" "7.55.2" - "@sentry/react" "7.55.2" - "@sentry/types" "7.55.2" - "@sentry/utils" "7.55.2" + "@sentry/core" "7.58.1" + "@sentry/integrations" "7.58.1" + "@sentry/node" "7.58.1" + "@sentry/react" "7.58.1" + "@sentry/types" "7.58.1" + "@sentry/utils" "7.58.1" "@sentry/webpack-plugin" "1.20.0" chalk "3.0.0" rollup "2.78.0" stacktrace-parser "^0.1.10" - tslib "^1.9.3" + tslib "^2.4.1 || ^1.9.3" -"@sentry/node@7.55.2": - version "7.55.2" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.55.2.tgz#4d63bc585816b64fc1ce67cbdfd896b5733eb804" - integrity sha512-43lGfMFFUD38Xerc4DqIuQkEOETHCh31JHUTI6r/gXdzmcKpWRscgH4nAcAUoCu+Myrv0fVXsOa12FM4DPfr8A== +"@sentry/node@7.58.1": + version "7.58.1" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-7.58.1.tgz#fc48b8f6ddfa0402cfdec3706cf162df60052b32" + integrity sha512-XsSu0xg5SYcltMbatnRBcIZw9pXwGJoGbYDLuPhhuqBz2mnQ0mQ9Try9dn/agDU7KZzT0IyA1qkPXk0NkMe3rw== dependencies: - "@sentry-internal/tracing" "7.55.2" - "@sentry/core" "7.55.2" - "@sentry/types" "7.55.2" - "@sentry/utils" "7.55.2" + "@sentry-internal/tracing" "7.58.1" + "@sentry/core" "7.58.1" + "@sentry/types" "7.58.1" + "@sentry/utils" "7.58.1" cookie "^0.4.1" https-proxy-agent "^5.0.0" lru_map "^0.3.3" - tslib "^1.9.3" + tslib "^2.4.1 || ^1.9.3" -"@sentry/react@7.55.2": - version "7.55.2" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.55.2.tgz#2b13ffe30dd1e7f8fa6dc104e7b3736c8f41ae06" - integrity sha512-7LqM8vQ73boESaOJ9TOmyVKfkUuLHMHU89ltKYsi4s6816Z6cuJ6UcAVUt0Ks4iLzNCVRVJ5OqeY37ge7pEaTA== +"@sentry/react@7.58.1": + version "7.58.1" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.58.1.tgz#b0901f75ceddaa0ffa5afd36964da50314cd6e69" + integrity sha512-0fh2JfKBxPU6Pm11PBt/5DgDg+l0cKcOf1WGhCWsBcFmRE2gAax+Q09+1fWm6+dqtg3piVR8AEEU6ZCBk3l4OQ== dependencies: - "@sentry/browser" "7.55.2" - "@sentry/types" "7.55.2" - "@sentry/utils" "7.55.2" + "@sentry/browser" "7.58.1" + "@sentry/types" "7.58.1" + "@sentry/utils" "7.58.1" hoist-non-react-statics "^3.3.2" - tslib "^1.9.3" + tslib "^2.4.1 || ^1.9.3" -"@sentry/replay@7.55.2": - version "7.55.2" - resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.55.2.tgz#001eeb4d0dd900630ddfcea99185556b0699c12a" - integrity sha512-G9iAcI9bvy5X8fvdz0QxF3LJ8oGB0Vxt0iOPdRZYhjIcPbNpE3NaeT6xZlNX1pCcHLroE6BMRF/6TTalcl5Erw== +"@sentry/replay@7.58.1": + version "7.58.1" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.58.1.tgz#daa389ba215f90f6579c388f67a9cf34b613c3a9" + integrity sha512-KKlpIxGrH1deTr/R3BErX8y16MnOzEylBVVn2I31BglLoZETFS9JAle6JNOgGxS5apFjwdQmD+69vX/mlVhMow== dependencies: - "@sentry/core" "7.55.2" - "@sentry/types" "7.55.2" - "@sentry/utils" "7.55.2" + "@sentry/core" "7.58.1" + "@sentry/types" "7.58.1" + "@sentry/utils" "7.58.1" -"@sentry/types@7.55.2": - version "7.55.2" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.55.2.tgz#1abd2e02308fcd9ff3e0ac0a56c6d67e36764964" - integrity sha512-mAtkA8wvUDrLjAAmy9tjn+NiXcxVz/ltbslTKaIW6JNgVRz5kMt1Ny8RJsgqaZqa4LFP8q+IvWw4Vd91kb57rA== +"@sentry/types@7.58.1": + version "7.58.1" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.58.1.tgz#c67f99f9af82ea930cdf895d71ae049575e38bf7" + integrity sha512-OnKG+yrilPBeVNQK3biF0u/4IDjwH+boJU1XzJOnYdMRO8uzTWxvaRqpt0C8sVE9VAetRi2eutkzOgCXZISRrw== -"@sentry/utils@7.55.2": - version "7.55.2" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.55.2.tgz#6a214c867c73305faac0997bdef4581f3bee0128" - integrity sha512-Yv9XtbOESdN7bkK2AMrKsmKMF5OOVv5v5hVcOqXtSTw1t2oMAtRjXXqGpUo+TkdTOjeoX6dr19ozVFHaGvqHkw== +"@sentry/utils@7.58.1": + version "7.58.1" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.58.1.tgz#b5e8ee53ce2f8ba7833a4a4e28044eaa1da9fa2f" + integrity sha512-iC9xZJBHp4+MDrZjKwcmMUhI5sTmpUcttwmsJL9HA6ACW+L1XX2eGSDky5pSlhhVFR7q7jJnQ7YUlMQ/jcd8eQ== dependencies: - "@sentry/types" "7.55.2" - tslib "^1.9.3" + "@sentry/types" "7.58.1" + tslib "^2.4.1 || ^1.9.3" "@sentry/webpack-plugin@1.20.0": version "1.20.0" @@ -938,17 +923,17 @@ dependencies: tslib "^2.4.0" -"@tanstack/query-core@4.29.14": - version "4.29.14" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.29.14.tgz#569de51719a0f4445fabff775012d5c09a173b96" - integrity sha512-ElEAahtLWA7Y7c2Haw10KdEf2tx+XZl/Z8dmyWxZehxWK3TPL5qtXtb7kUEhvt/8u2cSP62fLxgh2qqzMMGnDQ== +"@tanstack/query-core@4.29.25": + version "4.29.25" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-4.29.25.tgz#605d357968a740544af6754004eed1dfd4587cb8" + integrity sha512-DI4y4VC6Uw4wlTpOocEXDky69xeOScME1ezLKsj+hOk7DguC9fkqXtp6Hn39BVb9y0b5IBrY67q6kIX623Zj4Q== -"@tanstack/react-query@^4.29.14": - version "4.29.14" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.29.14.tgz#5e836d470c1c85d1aa3e53a6fc64f788dddb2ee5" - integrity sha512-wh4bd/QIy85YgTDBtj/7/9ZkpRX41QdZuUL8xKoSzuMCukXvAE1/oJ4p0F15lqQq9W3g2pgcbr2Aa+CNvqABhg== +"@tanstack/react-query@^4.29.25": + version "4.29.25" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-4.29.25.tgz#64df3260b65760fbd3c81ffae23b7b3802c71aa6" + integrity sha512-c1+Ezu+XboYrdAMdusK2fTdRqXPMgPAnyoTrzHOZQqr8Hqz6PNvV9DSKl8agUo6nXX4np7fdWabIprt+838dLg== dependencies: - "@tanstack/query-core" "4.29.14" + "@tanstack/query-core" "4.29.25" use-sync-external-store "^1.2.0" "@testing-library/dom@^9.0.0": @@ -1086,10 +1071,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.1.2.tgz#8fd63447e3f99aba6c3168fd2ec4580d5b97886f" integrity sha512-CTO/wa8x+rZU626cL2BlbCDzydgnFNgc19h4YvizpTO88MFQxab8wqisxaofQJ/9bLGugRdWIuX/TbIs6VVF6g== -"@types/node@^20.2.1": - version "20.3.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" - integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== +"@types/node@^20.4.2": + version "20.4.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.4.2.tgz#129cc9ae69f93824f92fac653eebfb4812ab4af9" + integrity sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw== "@types/parse-json@^4.0.0": version "4.0.0" @@ -1221,11 +1206,16 @@ acorn-walk@^8.0.0, acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.0.4, acorn@^8.4.1, acorn@^8.8.0: +acorn@^8.0.4, acorn@^8.4.1: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -1461,6 +1451,13 @@ buffer-from@~0.1.1: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.2.tgz#15f4b9bcef012044df31142c14333caf6e0260d0" integrity sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg== +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + calculate-size@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/calculate-size/-/calculate-size-1.1.1.tgz#ae7caa1c7795f82c4f035dc7be270e3581dae3ee" @@ -1683,10 +1680,10 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== -dayjs@^1.11.8: - version "1.11.8" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.8.tgz#4282f139c8c19dd6d0c7bd571e30c2d0ba7698ea" - integrity sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ== +dayjs@^1.11.9: + version "1.11.9" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a" + integrity sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA== debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@~4.3.1, debug@~4.3.2: version "4.3.4" @@ -2026,12 +2023,12 @@ escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -eslint-config-next@13.4.6: - version "13.4.6" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.4.6.tgz#ccccf5dad45b23a56418d66caad5339116297308" - integrity sha512-nlv4FYish1RYYHILbQwM5/rD37cOvEqtMfDjtQCYbXdE2O3MggqHu2q6IDeLE2Z6u8ZJyNPgWOA6OimWcxj3qw== +eslint-config-next@13.4.10: + version "13.4.10" + resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-13.4.10.tgz#59eaa37c805337972351b9920b1c28a79a14173e" + integrity sha512-+JjcM6lQmFR5Mw0ORm9o1CR29+z/uajgSfYAPEGIBxOhTHBgCMs7ysuwi72o7LkMmA8E3N7/h09pSGZxs0s85g== dependencies: - "@next/eslint-plugin-next" "13.4.6" + "@next/eslint-plugin-next" "13.4.10" "@rushstack/eslint-patch" "^1.1.3" "@typescript-eslint/parser" "^5.42.0" eslint-import-resolver-node "^0.3.6" @@ -2039,7 +2036,7 @@ eslint-config-next@13.4.6: eslint-plugin-import "^2.26.0" eslint-plugin-jsx-a11y "^6.5.1" eslint-plugin-react "^7.31.7" - eslint-plugin-react-hooks "^4.5.0" + eslint-plugin-react-hooks "5.0.0-canary-7118f5dd7-20230705" eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.7: version "0.3.7" @@ -2113,17 +2110,18 @@ eslint-plugin-jsx-a11y@^6.5.1: object.fromentries "^2.0.6" semver "^6.3.0" -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== +eslint-plugin-prettier@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz#6887780ed95f7708340ec79acfdf60c35b9be57a" + integrity sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w== dependencies: prettier-linter-helpers "^1.0.0" + synckit "^0.8.5" -eslint-plugin-react-hooks@^4.5.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== +eslint-plugin-react-hooks@5.0.0-canary-7118f5dd7-20230705: + version "5.0.0-canary-7118f5dd7-20230705" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.0.0-canary-7118f5dd7-20230705.tgz#4d55c50e186f1a2b0636433d2b0b2f592ddbccfd" + integrity sha512-AZYbMo/NW9chdL7vk6HQzQhT+PvTAEVqWk9ziruUoW2kAOcN5qNyelv70e0F1VNQAbvutOC9oc+xfWycI9FxDw== eslint-plugin-react@^7.31.7: version "7.32.2" @@ -2146,10 +2144,10 @@ eslint-plugin-react@^7.31.7: semver "^6.3.0" string.prototype.matchall "^4.0.8" -eslint-plugin-unused-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz#d8db8c4d0cfa0637a8b51ce3fd7d1b6bc3f08520" - integrity sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A== +eslint-plugin-unused-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-3.0.0.tgz#d25175b0072ff16a91892c3aa72a09ca3a9e69e7" + integrity sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw== dependencies: eslint-rule-composer "^0.3.0" @@ -2176,15 +2174,15 @@ eslint-visitor-keys@^3.4.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@8.43.0: - version "8.43.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.43.0.tgz#3e8c6066a57097adfd9d390b8fc93075f257a094" - integrity sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q== +eslint@8.45.0: + version "8.45.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.45.0.tgz#bab660f90d18e1364352c0a6b7c6db8edb458b78" + integrity sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" - "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.43.0" + "@eslint/eslintrc" "^2.1.0" + "@eslint/js" "8.44.0" "@humanwhocodes/config-array" "^0.11.10" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -2196,7 +2194,7 @@ eslint@8.43.0: escape-string-regexp "^4.0.0" eslint-scope "^7.2.0" eslint-visitor-keys "^3.4.1" - espree "^9.5.2" + espree "^9.6.0" esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" @@ -2206,7 +2204,6 @@ eslint@8.43.0: globals "^13.19.0" graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" @@ -2216,17 +2213,16 @@ eslint@8.43.0: lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.5.2: - version "9.5.2" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.2.tgz#e994e7dc33a082a7a82dceaf12883a829353215b" - integrity sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw== +espree@^9.6.0: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" eslint-visitor-keys "^3.4.1" @@ -2730,7 +2726,7 @@ immediate@~3.0.5: resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -3056,10 +3052,10 @@ jsonc-parser@^3.2.0: resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== -jsonwebtoken@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz#d0faf9ba1cc3a56255fe49c0961a67e520c1926d" - integrity sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw== +jsonwebtoken@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz#81d8c901c112c24e497a55daf6b2be1225b40145" + integrity sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg== dependencies: jws "^3.2.2" lodash "^4.17.21" @@ -3351,30 +3347,27 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -next@13.2.3: - version "13.2.3" - resolved "https://registry.yarnpkg.com/next/-/next-13.2.3.tgz#92d170e7aca421321f230ff80c35c4751035f42e" - integrity sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w== +next@13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/next/-/next-13.3.0.tgz#40632d303d74fc8521faa0a5bf4a033a392749b1" + integrity sha512-OVTw8MpIPa12+DCUkPqRGPS3thlJPcwae2ZL4xti3iBff27goH024xy4q2lhlsdoYiKOi8Kz6uJoLW/GXwgfOA== dependencies: - "@next/env" "13.2.3" + "@next/env" "13.3.0" "@swc/helpers" "0.4.14" + busboy "1.6.0" caniuse-lite "^1.0.30001406" postcss "8.4.14" styled-jsx "5.1.1" optionalDependencies: - "@next/swc-android-arm-eabi" "13.2.3" - "@next/swc-android-arm64" "13.2.3" - "@next/swc-darwin-arm64" "13.2.3" - "@next/swc-darwin-x64" "13.2.3" - "@next/swc-freebsd-x64" "13.2.3" - "@next/swc-linux-arm-gnueabihf" "13.2.3" - "@next/swc-linux-arm64-gnu" "13.2.3" - "@next/swc-linux-arm64-musl" "13.2.3" - "@next/swc-linux-x64-gnu" "13.2.3" - "@next/swc-linux-x64-musl" "13.2.3" - "@next/swc-win32-arm64-msvc" "13.2.3" - "@next/swc-win32-ia32-msvc" "13.2.3" - "@next/swc-win32-x64-msvc" "13.2.3" + "@next/swc-darwin-arm64" "13.3.0" + "@next/swc-darwin-x64" "13.3.0" + "@next/swc-linux-arm64-gnu" "13.3.0" + "@next/swc-linux-arm64-musl" "13.3.0" + "@next/swc-linux-x64-gnu" "13.3.0" + "@next/swc-linux-x64-musl" "13.3.0" + "@next/swc-win32-arm64-msvc" "13.3.0" + "@next/swc-win32-ia32-msvc" "13.3.0" + "@next/swc-win32-x64-msvc" "13.3.0" node-fetch@2.6.7: version "2.6.7" @@ -3484,17 +3477,17 @@ opener@^1.5.2: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" 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.3" p-cancelable@^3.0.0: version "3.0.0" @@ -3610,10 +3603,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.8.8: - version "2.8.8" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" - integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.0.tgz#e7b19f691245a21d618c68bc54dc06122f6105ae" + integrity sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g== pretty-format@^27.0.2: version "27.5.1" @@ -3728,10 +3721,10 @@ react-hot-toast@^2.4.1: dependencies: goober "^2.1.10" -react-icons@^4.9.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.9.0.tgz#ba44f436a053393adb1bdcafbc5c158b7b70d2a3" - integrity sha512-ijUnFr//ycebOqujtqtV9PFS7JjhWg0QU6ykURVHuL4cbofvRCf3f6GMn9+fBktEFQOIVZnuAYLZdiyadRQRFg== +react-icons@^4.10.1: + version "4.10.1" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-4.10.1.tgz#3f3b5eec1f63c1796f6a26174a1091ca6437a500" + integrity sha512-/ngzDP/77tlCfqthiiGNZeYFACw85fUjZtLbedmJ5DTlNDIwETxhwBzdOJ21zj4iJdvc0J3y7yOsX3PpxAJzrw== react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" @@ -3811,10 +3804,10 @@ react-use-gesture@^8.0.1: resolved "https://registry.yarnpkg.com/react-use-gesture/-/react-use-gesture-8.0.1.tgz#4360c0f7c9e26baf9fbe58f63fc9de7ef699c17f" integrity sha512-CXzUNkulUdgouaAlvAsC5ZVo0fi9KGSBSk81WrE4kOIcJccpANe9zZkAYr5YZZhqpicIFxitsrGVS4wmoMun9A== -react-zoom-pan-pinch@^3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.0.8.tgz#c649d644e8aef239afe678a65fd618e65746ddc9" - integrity sha512-z6O5SV5X+XBo/LLO59PgzNE2WT+tp8lw1w3M0y138jCXViwHWKK1MqorICbmSVSOOD5Fa2o6pcg1ppJj9vzqJA== +react-zoom-pan-pinch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/react-zoom-pan-pinch/-/react-zoom-pan-pinch-3.1.0.tgz#d87a66fd22a97f5dd56b54076411a9dce1f448cd" + integrity sha512-a3LlP8QPgTikvteCNkZ3X6wIWC0lrg1geP5WkUJyx2MXXAhHQek3r17N1nT/esOiWGuPIECnsd9AGoK8jOeGcg== react@^18.2.0: version "18.2.0" @@ -4102,6 +4095,11 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" @@ -4167,7 +4165,7 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -4233,7 +4231,7 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -synckit@^0.8.4: +synckit@^0.8.4, synckit@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== @@ -4364,7 +4362,7 @@ tslib@2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== -tslib@^1.8.1, tslib@^1.9.3: +tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -4374,6 +4372,11 @@ tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== +"tslib@^2.4.1 || ^1.9.3": + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -4407,10 +4410,10 @@ typed-array-length@^1.0.4: for-each "^0.3.3" is-typed-array "^1.1.9" -typescript@5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b" - integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw== +typescript@5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== unbox-primitive@^1.0.2: version "1.0.2" @@ -4572,11 +4575,6 @@ which@^2.0.1, which@^2.0.2: dependencies: isexe "^2.0.0" -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -4634,9 +4632,9 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zustand@^4.3.8: - version "4.3.8" - resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.8.tgz#37113df8e9e1421b0be1b2dca02b49b76210e7c4" - integrity sha512-4h28KCkHg5ii/wcFFJ5Fp+k1J3gJoasaIbppdgZFO4BPJnsNxL0mQXBSFgOgAdCdBj35aDTPvdAJReTMntFPGg== +zustand@^4.3.9: + version "4.3.9" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.3.9.tgz#a7d4332bbd75dfd25c6848180b3df1407217f2ad" + integrity sha512-Tat5r8jOMG1Vcsj8uldMyqYKC5IZvQif8zetmLHs9WoZlntTHmIoNM8TpLRY31ExncuUvUOXehd0kvahkuHjDw== dependencies: use-sync-external-store "1.2.0"