From 0e35c6a1e9f6ef211321cfdd28e4e8abfa0106e7 Mon Sep 17 00:00:00 2001 From: AykutSarac Date: Sun, 16 Jul 2023 15:44:10 +0300 Subject: [PATCH] chore: optimize bundle --- .eslintrc.json | 19 +- next.config.js | 35 +- package.json | 47 +- public/assets/multidata.png | Bin 47887 -> 0 bytes public/assets/multidata.webp | Bin 0 -> 16342 bytes src/api/altogic.ts | 13 - src/{pages => assets/fonts}/Mona-Sans.woff2 | Bin src/components/AdTest/index.tsx | 9 +- src/components/CarbonAds/index.tsx | 3 +- src/components/CustomNode/ObjectNode.tsx | 5 +- src/components/CustomNode/TextNode.tsx | 6 +- src/components/CustomNode/index.tsx | 1 + src/components/GoogleAnalytics/index.tsx | 4 +- src/components/Graph/PremiumView.tsx | 24 +- src/components/Graph/index.tsx | 18 +- src/components/HovercardAds/index.tsx | 1 + src/constants/customFonts.ts | 2 +- src/constants/file.ts | 11 - src/containers/Editor/JsonEditor/index.tsx | 2 + src/containers/Editor/LiveEditor/Tools.tsx | 8 +- src/containers/Editor/Panes.tsx | 5 +- .../Modals/CancelPremiumModal/index.tsx | 2 +- src/containers/Modals/DownloadModal/index.tsx | 1 + src/containers/Modals/JWTModal/index.tsx | 1 + src/containers/Modals/NodeModal/index.tsx | 8 +- src/containers/Modals/SchemaModal/index.tsx | 1 + src/hooks/useFocusNode.ts | 3 +- src/hooks/useToggleHide.ts | 3 + .../{DevMode => ExternalMode}/index.tsx | 5 +- src/layout/ModalController/index.tsx | 48 +- src/lib/api/altogic.ts | 14 + src/{ => lib}/utils/core/addEdgeToGraph.ts | 0 src/{ => lib}/utils/core/addNodeToGraph.ts | 5 +- src/{ => lib}/utils/core/calculateNodeSize.ts | 5 + src/{ => lib}/utils/core/traverse.ts | 14 +- src/{ => lib}/utils/graph/getChildrenEdges.ts | 2 + src/{ => lib}/utils/graph/getNextDirection.ts | 0 src/{ => lib}/utils/graph/getOutgoers.ts | 3 + src/{ => lib}/utils/graph/search.ts | 1 + src/{ => lib}/utils/json/getNodePath.ts | 8 +- src/{ => lib}/utils/json/jsonAdapter.ts | 6 +- src/{ => lib}/utils/json/jsonParser.ts | 8 +- src/{ => lib}/utils/widget.ts | 0 src/pages/_app.tsx | 10 +- src/pages/docs.tsx | 4 +- src/pages/editor.tsx | 4 +- src/pages/index.tsx | 18 +- src/pages/reset-password.tsx | 2 +- src/pages/sign-in.tsx | 3 +- src/services/json.ts | 7 +- src/store/useFile.ts | 9 +- src/store/useGraph.ts | 49 +- src/store/useUser.ts | 14 +- src/{typings => types}/altogic.ts | 0 src/{typings => types}/global.d.ts | 0 src/types/models.ts | 30 + src/{typings => types}/styled.d.ts | 0 src/typings/types.d.ts | 32 - tsconfig.json | 3 +- yarn.lock | 610 +++++++++--------- 60 files changed, 639 insertions(+), 507 deletions(-) delete mode 100644 public/assets/multidata.png create mode 100644 public/assets/multidata.webp delete mode 100644 src/api/altogic.ts rename src/{pages => assets/fonts}/Mona-Sans.woff2 (100%) delete mode 100644 src/constants/file.ts rename src/layout/{DevMode => ExternalMode}/index.tsx (97%) create mode 100644 src/lib/api/altogic.ts rename src/{ => lib}/utils/core/addEdgeToGraph.ts (100%) rename src/{ => lib}/utils/core/addNodeToGraph.ts (86%) rename src/{ => lib}/utils/core/calculateNodeSize.ts (99%) rename src/{ => lib}/utils/core/traverse.ts (97%) rename src/{ => lib}/utils/graph/getChildrenEdges.ts (81%) rename src/{ => lib}/utils/graph/getNextDirection.ts (100%) rename src/{ => lib}/utils/graph/getOutgoers.ts (94%) rename src/{ => lib}/utils/graph/search.ts (99%) rename src/{ => lib}/utils/json/getNodePath.ts (90%) rename src/{ => lib}/utils/json/jsonAdapter.ts (97%) rename src/{ => lib}/utils/json/jsonParser.ts (94%) rename src/{ => lib}/utils/widget.ts (100%) rename src/{typings => types}/altogic.ts (100%) rename src/{typings => types}/global.d.ts (100%) create mode 100644 src/types/models.ts rename src/{typings => types}/styled.d.ts (100%) delete mode 100644 src/typings/types.d.ts diff --git a/.eslintrc.json b/.eslintrc.json index 6de70390e76..2a0ddc71a30 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 6b9165ace62..377f76565a1 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 7d714cee1c8..159c46053e1 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 37bc59c815bd812d8df21bd607284d0628617fc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47887 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 HS_J(c7g>eK diff --git a/public/assets/multidata.webp b/public/assets/multidata.webp new file mode 100644 index 0000000000000000000000000000000000000000..cbd0fad41e719773810e0c9f67892dd149ea5314 GIT binary patch literal 16342 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

5c>YU#t1_GceXEB^+tZ!#*0qItx#1T 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 literal 0 HcmV?d00001 diff --git a/src/api/altogic.ts b/src/api/altogic.ts deleted file mode 100644 index 00ae964c993..00000000000 --- 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 8ddbc6f920f..3850a882d59 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 5df011c1f54..beb4e968689 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 1d5f444b03c..0d48dc07fda 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 6088c325378..2fea2a07020 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 cdba555357b..c0f5de097cc 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 549170779d1..6c81ce857ad 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 bd204f7d86c..1e249b1603b 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 fbfef5cac07..00000000000 --- 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 38818af4f8b..63ea2575c27 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 4384bc59d96..ac8bdb0f278 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 d4a85cc8426..408415b0f31 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 817c38ff7cf..de58cc05195 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 e537b94174a..0f1a65f0fce 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 f17e809866b..77f2198d263 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 7f31c5d1a99..8fc14239f20 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 b81103c46e4..7bfc5a0e1b8 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 9ca7e0d2460..d41f0274041 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 f2dea0c6ce3..06e9abe74ed 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 bd99f68ce72..275997e7a88 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 bb348115b8b..0822eb0074c 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 00000000000..5ce4616e286 --- /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 8b611e999d7..faa1b42fe4b 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 d5a64299528..cac192c9e3f 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 4e6671ec8a7..16c7059e878 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 3882241a1d0..8beda1f3321 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 42b2cc78460..82074119ca7 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 fc2508d88f9..e8d536fc06f 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 79d2500f1f3..6d586c3735b 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 7d30dc49534..75be48dd68b 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 d526eb01024..b618aa51b27 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 8f4a55000c8..dd004e95a37 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 2a6d224ff80..5d04301f5b1 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 d7fc19fce47..1de7947b19b 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 6c2146b63b6..bec0cc0f996 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 907130123bc..06425a744a6 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 dd0b8c3b562..5ca5136dc54 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 1225f9474d6..b009096fc9f 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 8d8a0992422..55125dd6107 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 f19d004b59e..d02cd219fb4 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 31c49d3d2ee..ed79bdc2f67 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 00000000000..9bdc48606e2 --- /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 25f0d8ffdab..00000000000 --- 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 8adba52aa71..f0c1a62667c 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 eaabf61decb..b6e1afcc8d9 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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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"