From 761c2b318e8c5c1c35ed145f46da8dcf2d24459f Mon Sep 17 00:00:00 2001 From: Ronen Mars Date: Wed, 3 Dec 2025 11:00:59 +0200 Subject: [PATCH 1/4] refactor: replace lodash with radash for smaller bundle size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Migrate all lodash imports to radash equivalents - Replace cloneDeep with native structuredClone - Update vite.config.ts manualChunks (lodash → radash) - Remove lodash and @types/lodash dependencies Bundle size reduction: ~12-15 kB minified, ~4-5 kB gzipped --- package-lock.json | 948 ++++++++---------- package.json | 7 +- src/assets/templates/kittehub.zip | Bin 2138801 -> 2135418 bytes src/components/molecules/copyButton.tsx | 6 +- .../molecules/popover/popoverListContent.tsx | 12 +- .../deployments/sessions/table/table.tsx | 8 +- src/components/organisms/editorTabs.tsx | 20 +- src/components/organisms/files/fileTree.tsx | 13 +- .../settings/organization/settings.tsx | 5 +- .../settings/user/organizations/table.tsx | 2 +- .../organisms/settings/user/profile.tsx | 4 +- .../organisms/topbar/project/buttons.tsx | 19 +- .../project/manualRun/manualRunButtons.tsx | 2 +- src/hooks/useSort.tsx | 29 +- src/routes.tsx | 343 +++++-- src/services/sessions.service.ts | 2 +- src/store/cache/useCacheStore.ts | 2 +- src/store/useProjectStore.ts | 2 +- .../calculateDeploymentSessionsStats.utils.ts | 4 +- ...onvertBuildRuntimesToViewTriggers.utils.ts | 4 +- src/utilities/fetchAndExtractZip.utils.ts | 8 +- src/utilities/openedEditorFilesState.utils.ts | 8 +- vite.config.ts | 41 +- 23 files changed, 791 insertions(+), 698 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6944e5ad10..e71b586150 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "autokitteh", - "version": "2.239.1", + "version": "2.234.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "autokitteh", - "version": "2.239.1", + "version": "2.234.2", "hasInstallScript": true, "dependencies": { "@bufbuild/protobuf": "^1.10.0", @@ -19,7 +19,7 @@ "@hookform/resolvers": "^3.9.1", "@monaco-editor/react": "^4.6.0", "@netlify/edge-functions": "^2.11.1", - "@types/lodash": "^4.17.13", + "@sentry/react": "^8.47.0", "@types/pako": "^2.0.3", "@uiw/react-json-view": "^2.0.0-alpha.30", "axios": "^1.9.0", @@ -33,7 +33,6 @@ "js-cookie": "^3.0.5", "js-yaml": "^4.1.0", "jszip": "^3.10.1", - "lodash": "^4.17.21", "mermaid": "^11.8.1", "monaco-editor-textmate": "^4.0.0", "monaco-textmate": "^3.0.1", @@ -42,6 +41,7 @@ "pako": "^2.1.0", "pdfjs-dist": "^5.4.394", "psl": "^1.15.0", + "radash": "^12.1.1", "randomatic": "^3.1.1", "react": "^18.3.1", "react-apexcharts": "^1.7.0", @@ -103,6 +103,7 @@ "@typescript-eslint/eslint-plugin": "^8.21.0", "@typescript-eslint/parser": "^8.18.2", "@vitejs/plugin-react": "^4.3.4", + "@vitejs/plugin-react-swc": "^4.2.2", "@vitest/ui": "^3.2.4", "autoprefixer": "^10.4.20", "babel-eslint": "^10.1.0", @@ -134,12 +135,12 @@ "openai": "^4.77.0", "postcss": "^8.4.49", "rollup": "^4.34.6", + "rollup-plugin-visualizer": "^6.0.5", "semantic-release-slack-bot": "^4.0.2", "storybook": "^8.6.3", "tailwind-config-viewer": "^2.0.4", "tailwindcss": "^3.4.17", "terser": "^5.37.0", - "tsx": "^4.21.0", "typescript": "^5.7.2", "vite": "^6.3.5", "vite-plugin-mkcert": "^1.17.6", @@ -4383,6 +4384,98 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@sentry-internal/browser-utils": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.55.0.tgz", + "integrity": "sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw==", + "license": "MIT", + "dependencies": { + "@sentry/core": "8.55.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/feedback": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.55.0.tgz", + "integrity": "sha512-cP3BD/Q6pquVQ+YL+rwCnorKuTXiS9KXW8HNKu4nmmBAyf7urjs+F6Hr1k9MXP5yQ8W3yK7jRWd09Yu6DHWOiw==", + "license": "MIT", + "dependencies": { + "@sentry/core": "8.55.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/replay": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.55.0.tgz", + "integrity": "sha512-roCDEGkORwolxBn8xAKedybY+Jlefq3xYmgN2fr3BTnsXjSYOPC7D1/mYqINBat99nDtvgFvNfRcZPiwwZ1hSw==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "8.55.0", + "@sentry/core": "8.55.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.55.0.tgz", + "integrity": "sha512-nIkfgRWk1091zHdu4NbocQsxZF1rv1f7bbp3tTIlZYbrH62XVZosx5iHAuZG0Zc48AETLE7K4AX9VGjvQj8i9w==", + "license": "MIT", + "dependencies": { + "@sentry-internal/replay": "8.55.0", + "@sentry/core": "8.55.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/browser": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.55.0.tgz", + "integrity": "sha512-1A31mCEWCjaMxJt6qGUK+aDnLDcK6AwLAZnqpSchNysGni1pSn1RWSmk9TBF8qyTds5FH8B31H480uxMPUJ7Cw==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "8.55.0", + "@sentry-internal/feedback": "8.55.0", + "@sentry-internal/replay": "8.55.0", + "@sentry-internal/replay-canvas": "8.55.0", + "@sentry/core": "8.55.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/core": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.55.0.tgz", + "integrity": "sha512-6g7jpbefjHYs821Z+EBJ8r4Z7LT5h80YSWRJaylGS4nW5W5Z2KXzpdnyFarv37O7QjauzVC2E+PABmpkw5/JGA==", + "license": "MIT", + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/react": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.55.0.tgz", + "integrity": "sha512-/qNBvFLpvSa/Rmia0jpKfJdy16d4YZaAnH/TuKLAtm0BWlsPQzbXCU4h8C5Hsst0Do0zG613MEtEmWpWrVOqWA==", + "license": "MIT", + "dependencies": { + "@sentry/browser": "8.55.0", + "@sentry/core": "8.55.0", + "hoist-non-react-statics": "^3.3.2" + }, + "engines": { + "node": ">=14.18" + }, + "peerDependencies": { + "react": "^16.14.0 || 17.x || 18.x || 19.x" + } + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -5430,6 +5523,232 @@ "@svgr/core": "*" } }, + "node_modules/@swc/core": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.15.3.tgz", + "integrity": "sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3", + "@swc/types": "^0.1.25" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.15.3", + "@swc/core-darwin-x64": "1.15.3", + "@swc/core-linux-arm-gnueabihf": "1.15.3", + "@swc/core-linux-arm64-gnu": "1.15.3", + "@swc/core-linux-arm64-musl": "1.15.3", + "@swc/core-linux-x64-gnu": "1.15.3", + "@swc/core-linux-x64-musl": "1.15.3", + "@swc/core-win32-arm64-msvc": "1.15.3", + "@swc/core-win32-ia32-msvc": "1.15.3", + "@swc/core-win32-x64-msvc": "1.15.3" + }, + "peerDependencies": { + "@swc/helpers": ">=0.5.17" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.15.3.tgz", + "integrity": "sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.15.3.tgz", + "integrity": "sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.15.3.tgz", + "integrity": "sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.15.3.tgz", + "integrity": "sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.15.3.tgz", + "integrity": "sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.15.3.tgz", + "integrity": "sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.15.3.tgz", + "integrity": "sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.15.3.tgz", + "integrity": "sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.15.3.tgz", + "integrity": "sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.15.3.tgz", + "integrity": "sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@swc/types": { + "version": "0.1.25", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.25.tgz", + "integrity": "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, "node_modules/@testing-library/dom": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", @@ -5994,12 +6313,6 @@ "license": "MIT", "peer": true }, - "node_modules/@types/lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", - "license": "MIT" - }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -6914,6 +7227,30 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-4.2.2.tgz", + "integrity": "sha512-x+rE6tsxq/gxrEJN3Nv3dIV60lFflPj94c90b+NNo6n1QV1QQUTLoL0MpaOVasUZ0zqVBn7ead1B5ecx1JAGfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.47", + "@swc/core": "^1.13.5" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4 || ^5 || ^6 || ^7" + } + }, + "node_modules/@vitejs/plugin-react-swc/node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.47", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.47.tgz", + "integrity": "sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==", + "dev": true, + "license": "MIT" + }, "node_modules/@vitest/expect": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", @@ -12456,7 +12793,7 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -14836,6 +15173,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, "license": "MIT" }, "node_modules/lodash-es": { @@ -20652,6 +20990,15 @@ ], "license": "MIT" }, + "node_modules/radash": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/radash/-/radash-12.1.1.tgz", + "integrity": "sha512-h36JMxKRqrAxVD8201FrCpyeNuUY9Y5zZwujr20fFO77tpUtGa6EZzfKw/3WaiBX95fq7+MpsuMLNdSnORAwSA==", + "license": "MIT", + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/raf": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", @@ -21904,7 +22251,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "devOptional": true, + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" @@ -22015,29 +22362,70 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.46.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", - "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/roughjs": { - "version": "4.6.6", - "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", - "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "node_modules/rollup-plugin-visualizer": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-6.0.5.tgz", + "integrity": "sha512-9+HlNgKCVbJDs8tVtjQ43US12eqaiHyyiLMdBwQ7vSZPiHMysGNo2E88TAp1si5wx8NAoYriI2A5kuKfIakmJg==", + "dev": true, "license": "MIT", "dependencies": { - "hachure-fill": "^0.5.2", - "path-data-parser": "^0.1.0", - "points-on-curve": "^0.2.0", - "points-on-path": "^0.2.1" + "open": "^8.0.0", + "picomatch": "^4.0.2", + "source-map": "^0.7.4", + "yargs": "^17.5.1" + }, + "bin": { + "rollup-plugin-visualizer": "dist/bin/cli.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "rolldown": "1.x || ^1.0.0-beta", + "rollup": "2.x || 3.x || 4.x" + }, + "peerDependenciesMeta": { + "rolldown": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/rollup-plugin-visualizer/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.46.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz", + "integrity": "sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" } }, "node_modules/rrweb-cssom": { @@ -24898,498 +25286,6 @@ "dev": true, "license": "0BSD" }, - "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.27.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", - "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", - "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", - "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", - "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", - "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", - "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", - "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", - "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", - "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", - "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", - "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", - "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", - "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", - "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", - "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", - "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", - "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", - "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", - "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", - "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", - "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", - "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", - "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", - "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", - "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", - "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.27.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", - "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", - "devOptional": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.1", - "@esbuild/android-arm": "0.27.1", - "@esbuild/android-arm64": "0.27.1", - "@esbuild/android-x64": "0.27.1", - "@esbuild/darwin-arm64": "0.27.1", - "@esbuild/darwin-x64": "0.27.1", - "@esbuild/freebsd-arm64": "0.27.1", - "@esbuild/freebsd-x64": "0.27.1", - "@esbuild/linux-arm": "0.27.1", - "@esbuild/linux-arm64": "0.27.1", - "@esbuild/linux-ia32": "0.27.1", - "@esbuild/linux-loong64": "0.27.1", - "@esbuild/linux-mips64el": "0.27.1", - "@esbuild/linux-ppc64": "0.27.1", - "@esbuild/linux-riscv64": "0.27.1", - "@esbuild/linux-s390x": "0.27.1", - "@esbuild/linux-x64": "0.27.1", - "@esbuild/netbsd-arm64": "0.27.1", - "@esbuild/netbsd-x64": "0.27.1", - "@esbuild/openbsd-arm64": "0.27.1", - "@esbuild/openbsd-x64": "0.27.1", - "@esbuild/openharmony-arm64": "0.27.1", - "@esbuild/sunos-x64": "0.27.1", - "@esbuild/win32-arm64": "0.27.1", - "@esbuild/win32-ia32": "0.27.1", - "@esbuild/win32-x64": "0.27.1" - } - }, - "node_modules/tsx/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", diff --git a/package.json b/package.json index c94cf1a6fe..a5412daf69 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "version": "2.239.1", "scripts": { "build": "node scripts/validateRuleConsistency.mjs && vite build", + "build:analyze": "ANALYZE=true npm run build", "build-storybook": "storybook build", "build:prod": "node scripts/fetchTemplates && node scripts/verifyTourStepIdsUniqueness.mjs && node scripts/validateRuleConsistency.mjs && NODE_ENV=production npm run build", "fetch-templates": "node scripts/fetchTemplates", @@ -79,7 +80,7 @@ "@hookform/resolvers": "^3.9.1", "@monaco-editor/react": "^4.6.0", "@netlify/edge-functions": "^2.11.1", - "@types/lodash": "^4.17.13", + "@sentry/react": "^8.47.0", "@types/pako": "^2.0.3", "@uiw/react-json-view": "^2.0.0-alpha.30", "axios": "^1.9.0", @@ -93,7 +94,6 @@ "js-cookie": "^3.0.5", "js-yaml": "^4.1.0", "jszip": "^3.10.1", - "lodash": "^4.17.21", "mermaid": "^11.8.1", "monaco-editor-textmate": "^4.0.0", "monaco-textmate": "^3.0.1", @@ -102,6 +102,7 @@ "pako": "^2.1.0", "pdfjs-dist": "^5.4.394", "psl": "^1.15.0", + "radash": "^12.1.1", "randomatic": "^3.1.1", "react": "^18.3.1", "react-apexcharts": "^1.7.0", @@ -163,6 +164,7 @@ "@typescript-eslint/eslint-plugin": "^8.21.0", "@typescript-eslint/parser": "^8.18.2", "@vitejs/plugin-react": "^4.3.4", + "@vitejs/plugin-react-swc": "^4.2.2", "@vitest/ui": "^3.2.4", "autoprefixer": "^10.4.20", "babel-eslint": "^10.1.0", @@ -194,6 +196,7 @@ "openai": "^4.77.0", "postcss": "^8.4.49", "rollup": "^4.34.6", + "rollup-plugin-visualizer": "^6.0.5", "semantic-release-slack-bot": "^4.0.2", "storybook": "^8.6.3", "tailwind-config-viewer": "^2.0.4", diff --git a/src/assets/templates/kittehub.zip b/src/assets/templates/kittehub.zip index 376487ba81b835b84c6cf7eabc1f8b00635e4afc..e7617df53b6507257d7482661efeb87fb6e6b741 100644 GIT binary patch delta 25427 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∓E(V<% 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 OR~tp5f+kA%U;hW(qNj}j diff --git a/src/components/molecules/copyButton.tsx b/src/components/molecules/copyButton.tsx index 89ae343d63..8545bd0a98 100644 --- a/src/components/molecules/copyButton.tsx +++ b/src/components/molecules/copyButton.tsx @@ -1,6 +1,6 @@ import React, { forwardRef, useImperativeHandle, useRef } from "react"; -import { debounce } from "lodash"; +import { debounce } from "radash"; import { useTranslation } from "react-i18next"; import { useToastStore } from "@src/store"; @@ -53,14 +53,14 @@ export const CopyButton = forwardRef< const addToast = useToastStore((state) => state.addToast); const copyTextToClipboardRef = useRef( - debounce(async (text: string) => { + debounce({ delay: 300 }, async (text: string) => { const { isError, message } = await copyToClipboard(text); addToast({ message: successMessage && !isError ? successMessage : message, type: isError ? "error" : "success", }); - }, 300) + }) ); const copyTextToClipboard = copyTextToClipboardRef.current; diff --git a/src/components/molecules/popover/popoverListContent.tsx b/src/components/molecules/popover/popoverListContent.tsx index c478b27a4f..1cc81fa171 100644 --- a/src/components/molecules/popover/popoverListContent.tsx +++ b/src/components/molecules/popover/popoverListContent.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useMemo, useRef, useState } from "react"; -import { debounce } from "lodash"; +import { debounce } from "radash"; import { PopoverContentBase } from "./popoverContentBase"; import { usePopoverListContext } from "@contexts/usePopover"; @@ -76,7 +76,7 @@ export const PopoverListContent = React.forwardRef< const debouncedFilter = useMemo( () => - debounce((filterTerm: string) => { + debounce({ delay: searchByTermDebounceTime }, (filterTerm: string) => { const filteredItems = items.filter((item) => { if (typeof item.label === "string") { return item.label.toLowerCase().includes(filterTerm); @@ -84,16 +84,10 @@ export const PopoverListContent = React.forwardRef< return item.id.toLowerCase().includes(filterTerm); }); setPopoverItems(filteredItems); - }, searchByTermDebounceTime), + }), [items] ); - useEffect(() => { - return () => { - debouncedFilter.cancel(); - }; - }, [debouncedFilter]); - const filterItemsBySearchTerm = (event: React.ChangeEvent) => { const filterTerm = event.target.value.toLowerCase(); setSearchTerm(filterTerm); diff --git a/src/components/organisms/deployments/sessions/table/table.tsx b/src/components/organisms/deployments/sessions/table/table.tsx index 2c28f58df3..6a0e70cd8d 100644 --- a/src/components/organisms/deployments/sessions/table/table.tsx +++ b/src/components/organisms/deployments/sessions/table/table.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useId, useMemo, useRef, useState } from "react"; -import { debounce, isEqual } from "lodash"; +import { debounce, isEqual } from "radash"; import { useTranslation } from "react-i18next"; import { Outlet, useParams, useSearchParams } from "react-router-dom"; import { ListOnItemsRenderedProps } from "react-window"; @@ -255,7 +255,7 @@ export const SessionsTable = () => { [projectId, deploymentId, urlSessionStateFilter, addToast, tErrors, lastSeenSession, navigateWithSettings] ); - const debouncedFetchSessions = useMemo(() => debounce(fetchSessions, 100), [fetchSessions]); + const debouncedFetchSessions = useMemo(() => debounce({ delay: 100 }, fetchSessions), [fetchSessions]); debouncedFetchSessionsRef.current = debouncedFetchSessions; const refreshData = useCallback( @@ -298,10 +298,6 @@ export const SessionsTable = () => { }; loadData(); - - return () => { - debouncedFetchSessionsRef.current?.cancel(); - }; }, [deployments]); const closeSessionLog = useCallback(() => { diff --git a/src/components/organisms/editorTabs.tsx b/src/components/organisms/editorTabs.tsx index 3185a9b774..c897d6e57a 100644 --- a/src/components/organisms/editorTabs.tsx +++ b/src/components/organisms/editorTabs.tsx @@ -2,8 +2,8 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from "react" import Editor, { Monaco } from "@monaco-editor/react"; import dayjs from "dayjs"; -import { debounce, last } from "lodash"; import * as monaco from "monaco-editor"; +import { debounce, last, throttle } from "radash"; import { useTranslation } from "react-i18next"; import Markdown from "react-markdown"; import { Document, Page, pdfjs } from "react-pdf"; @@ -457,21 +457,17 @@ export const EditorTabs = () => { // eslint-disable-next-line react-hooks/exhaustive-deps const debouncedManualSave = useCallback( - debounce( - () => { - const currentContent = editorRef.current?.getValue(); - if (currentContent !== undefined) { - updateContent(currentContent); - } - }, - 1500, - { leading: true, trailing: false } - ), + throttle({ interval: 1500 }, () => { + const currentContent = editorRef.current?.getValue(); + if (currentContent !== undefined) { + updateContent(currentContent); + } + }), [projectId, activeEditorFileName] ); // eslint-disable-next-line react-hooks/exhaustive-deps - const debouncedAutosave = useCallback(debounce(updateContent, 1500), [projectId, activeEditorFileName]); + const debouncedAutosave = useCallback(debounce({ delay: 1500 }, updateContent), [projectId, activeEditorFileName]); const saveFileWithContent = async (fileName: string, content: string): Promise => { if (!projectId) { diff --git a/src/components/organisms/files/fileTree.tsx b/src/components/organisms/files/fileTree.tsx index feab53d742..17fb66e74d 100644 --- a/src/components/organisms/files/fileTree.tsx +++ b/src/components/organisms/files/fileTree.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useRef, useState } from "react"; -import { debounce } from "lodash"; +import { debounce } from "radash"; import { Tree, TreeApi } from "react-arborist"; import { useTranslation } from "react-i18next"; @@ -40,18 +40,11 @@ export const FileTree = ({ const [treeHeight, setTreeHeight] = useState(600); const debouncedSetSearchTerm = useRef( - debounce((value: string) => { + debounce({ delay: fileTreeTiming.SEARCH_DEBOUNCE_MS }, (value: string) => { setSearchTerm(value); - }, fileTreeTiming.SEARCH_DEBOUNCE_MS) + }) ).current; - useEffect(() => { - return () => { - debouncedSetSearchTerm.cancel(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - useEffect(() => { const updateHeight = () => { if (containerRef.current) { diff --git a/src/components/organisms/settings/organization/settings.tsx b/src/components/organisms/settings/organization/settings.tsx index f91c04c5c3..cd5e3f5e75 100644 --- a/src/components/organisms/settings/organization/settings.tsx +++ b/src/components/organisms/settings/organization/settings.tsx @@ -1,7 +1,6 @@ import React, { useMemo, useState } from "react"; -import debounce from "lodash/debounce"; -import omit from "lodash/omit"; +import { debounce, omit } from "radash"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; @@ -70,7 +69,7 @@ export const OrganizationSettings = () => { setDisplaySuccess(false); }, 3000); }; - const debouncedRename = debounce(renameOrganization, 2000); + const debouncedRename = debounce({ delay: 2000 }, renameOrganization); if (!organization) { return null; diff --git a/src/components/organisms/settings/user/organizations/table.tsx b/src/components/organisms/settings/user/organizations/table.tsx index d8b675ec85..4403093a2c 100644 --- a/src/components/organisms/settings/user/organizations/table.tsx +++ b/src/components/organisms/settings/user/organizations/table.tsx @@ -1,6 +1,6 @@ import React from "react"; -import omit from "lodash/omit"; +import { omit } from "radash"; import { useTranslation } from "react-i18next"; import { useNavigate } from "react-router-dom"; diff --git a/src/components/organisms/settings/user/profile.tsx b/src/components/organisms/settings/user/profile.tsx index a4341ce98c..0d12dca3f8 100644 --- a/src/components/organisms/settings/user/profile.tsx +++ b/src/components/organisms/settings/user/profile.tsx @@ -1,6 +1,6 @@ import React, { useState } from "react"; -import debounce from "lodash/debounce"; +import { debounce } from "radash"; import { useTranslation } from "react-i18next"; import { version } from "@constants"; @@ -61,7 +61,7 @@ export const Profile = () => { setDisplaySuccess(false); }, 3000); }; - const debouncedRename = debounce(renameUser, 2000); + const debouncedRename = debounce({ delay: 2000 }, renameUser); return (
diff --git a/src/components/organisms/topbar/project/buttons.tsx b/src/components/organisms/topbar/project/buttons.tsx index 107e06a9bb..659c6f9785 100644 --- a/src/components/organisms/topbar/project/buttons.tsx +++ b/src/components/organisms/topbar/project/buttons.tsx @@ -1,6 +1,6 @@ -import React, { useCallback, useEffect, useMemo, useState } from "react"; +import React, { useCallback, useMemo, useState } from "react"; -import { debounce } from "lodash"; +import { throttle } from "radash"; import { useTranslation } from "react-i18next"; import { useNavigate, useParams } from "react-router-dom"; @@ -272,15 +272,8 @@ export const ProjectTopbarButtons = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [projectId]); - const debouncedBuild = useMemo(() => debounce(build, 1000, { leading: true, trailing: false }), [build]); - const debouncedDeploy = useMemo(() => debounce(deploy, 1000, { leading: true, trailing: false }), [deploy]); - - useEffect(() => { - return () => { - debouncedBuild.cancel(); - debouncedDeploy.cancel(); - }; - }, [debouncedBuild, debouncedDeploy]); + const throttledBuild = useMemo(() => throttle({ interval: 1000 }, build), [build]); + const throttledDeploy = useMemo(() => throttle({ interval: 1000 }, deploy), [deploy]); const isDeployAndBuildDisabled = Object.values(actionInProcess).some((value) => value); @@ -292,7 +285,7 @@ export const ProjectTopbarButtons = () => { ariaLabel={t("topbar.buttons.ariaBuildProject")} className="group h-8 whitespace-nowrap px-3.5 text-white maxScreenWidth-1600:px-2" disabled={isDeployAndBuildDisabled} - onClick={debouncedBuild} + onClick={throttledBuild} title={isValid ? t("topbar.buttons.build") : projectErrors} variant="outline" > @@ -321,7 +314,7 @@ export const ProjectTopbarButtons = () => { className="group h-8 items-center whitespace-nowrap px-3.5 text-white maxScreenWidth-1600:px-2" disabled={isDeployAndBuildDisabled} id={tourStepsHTMLIds.deployButton} - onClick={debouncedDeploy} + onClick={throttledDeploy} title={isValid ? t("topbar.buttons.deploy") : projectErrors} variant="outline" > diff --git a/src/components/organisms/topbar/project/manualRun/manualRunButtons.tsx b/src/components/organisms/topbar/project/manualRun/manualRunButtons.tsx index 92a87901fe..d775a43afc 100644 --- a/src/components/organisms/topbar/project/manualRun/manualRunButtons.tsx +++ b/src/components/organisms/topbar/project/manualRun/manualRunButtons.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect } from "react"; -import { isEqual } from "lodash"; +import { isEqual } from "radash"; import { useTranslation } from "react-i18next"; import { useParams } from "react-router-dom"; diff --git a/src/hooks/useSort.tsx b/src/hooks/useSort.tsx index 9669d59d41..dbca7938b1 100644 --- a/src/hooks/useSort.tsx +++ b/src/hooks/useSort.tsx @@ -1,6 +1,6 @@ import { useCallback, useMemo, useState } from "react"; -import { orderBy } from "lodash"; +import { sort } from "radash"; import { initialSortConfig } from "@constants"; import { SortDirectionVariant } from "@enums/components"; @@ -16,21 +16,18 @@ export const useSort = (items: T[], initialSortKey?: keyof T) => { return [...items]; } - return orderBy( - items, - [ - (item) => { - const value = sortConfig.key ? item[sortConfig.key] : undefined; - - if (value === undefined || value === null) { - return sortConfig.direction === SortDirectionVariant.ASC ? Number.MAX_VALUE : Number.MIN_VALUE; - } - - return typeof value === "string" ? value.toLowerCase() : value; - }, - ], - [sortConfig.direction] - ); + const getValue = (item: T) => { + const value = sortConfig.key ? item[sortConfig.key] : undefined; + + if (value === undefined || value === null) { + return sortConfig.direction === SortDirectionVariant.ASC ? Number.MAX_VALUE : Number.MIN_VALUE; + } + + return typeof value === "string" ? value.toLowerCase() : value; + }; + + const sorted = sort(items, getValue as (item: T) => number); + return sortConfig.direction === SortDirectionVariant.DESC ? sorted.reverse() : sorted; }, [items, sortConfig]); const requestSort = useCallback((key: keyof T) => { diff --git a/src/routes.tsx b/src/routes.tsx index 42e1fca929..5b2f8aa497 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -1,62 +1,156 @@ -import React from "react"; +import React, { Suspense, lazy } from "react"; import { Navigate } from "react-router-dom"; import { featureFlags } from "./constants"; import { MemberRole } from "@enums"; -import { EventsList } from "@shared-components"; import { legacyRoutes } from "@src/routes.legacy"; -import { - DeploymentsTable, - EventViewer, - ProtectedRoute, - SessionsTable, - GlobalConnectionsTable, -} from "@components/organisms"; -import { AddConnection, EditConnection } from "@components/organisms/configuration/connections"; -import { TemplatesCatalog } from "@components/organisms/dashboard/templates"; -import { SessionViewer } from "@components/organisms/deployments"; -import { ActivityList, SessionOutputs } from "@components/organisms/deployments/sessions/tabs"; -import { - AddOrganization, - OrganizationMembersTable, - OrganizationSettings, - SwitchOrganization, -} from "@components/organisms/settings/organization"; -import { OrganizationBilling } from "@components/organisms/settings/organization/billing"; -import { ClientConfiguration, Profile, UserOrganizationsTable } from "@components/organisms/settings/user"; -import { WelcomePage } from "@components/organisms/welcome"; -import { - AiLandingPage, - ChatPage, - CustomError, - Dashboard, - Internal404, - Intro, - Project, - TemplateLanding, -} from "@components/pages"; +import { ProtectedRoute } from "@components/organisms"; import { AppLayout, EventsLayout, GlobalConnectionsLayout } from "@components/templates"; import { ProjectWrapper } from "@components/templates/projectWrapper"; import { SettingsLayout } from "@components/templates/settingsLayout"; -const sessionViewRoutes = [ - { index: true, element: }, - { path: "executionflow", element: }, - { path: "settings/*", element: }, - { path: "executionflow/settings/*", element: }, -]; +const LazyDashboard = lazy(() => import("@components/pages/dashboard").then((m) => ({ default: m.Dashboard }))); +const LazyProject = lazy(() => import("@components/pages/project").then((m) => ({ default: m.Project }))); +const LazyAiLandingPage = lazy(() => + import("@components/pages/aiLandingPage").then((m) => ({ default: m.AiLandingPage })) +); +const LazyChatPage = lazy(() => import("@components/pages/chat").then((m) => ({ default: m.ChatPage }))); +const LazyIntro = lazy(() => import("@components/pages/intro").then((m) => ({ default: m.Intro }))); +const LazyTemplateLanding = lazy(() => + import("@components/pages/templateLanding").then((m) => ({ default: m.TemplateLanding })) +); +const LazyCustomError = lazy(() => import("@components/pages/customError").then((m) => ({ default: m.CustomError }))); +const LazyInternal404 = lazy(() => import("@components/pages/internal404").then((m) => ({ default: m.Internal404 }))); -const sessionRouteConfig = [ - { - path: ":sessionId", - element: , - children: sessionViewRoutes, - }, +const LazyDeploymentsTable = lazy(() => + import("@components/organisms/deployments/table").then((m) => ({ default: m.DeploymentsTable })) +); +const LazySessionsTable = lazy(() => + import("@components/organisms/deployments/sessions/table/table").then((m) => ({ default: m.SessionsTable })) +); +const LazySessionViewer = lazy(() => + import("@components/organisms/deployments/sessions/viewer").then((m) => ({ default: m.SessionViewer })) +); +const LazyEventViewer = lazy(() => + import("@components/organisms/events/viewer").then((m) => ({ default: m.EventViewer })) +); +const LazyEventsList = lazy(() => + import("@components/organisms/shared/events").then((m) => ({ default: m.EventsList })) +); +const LazyGlobalConnectionsTable = lazy(() => + import("@components/organisms/connections/globalConnectionsTable").then((m) => ({ + default: m.GlobalConnectionsTable, + })) +); + +const LazyProjectSettingsDrawer = lazy(() => + import("@components/organisms/configuration/configrationDrawer").then((m) => ({ + default: m.ProjectSettingsDrawer, + })) +); +const LazyProjectSettingsMainView = lazy(() => + import("@components/organisms/configuration/configurationView").then((m) => ({ + default: m.ProjectSettingsMainView, + })) +); +const LazyAddConnection = lazy(() => + import("@components/organisms/configuration/connections/add").then((m) => ({ default: m.AddConnection })) +); +const LazyEditConnection = lazy(() => + import("@components/organisms/configuration/connections/edit").then((m) => ({ + default: m.EditConnection, + })) +); +const LazyAddTrigger = lazy(() => + import("@components/organisms/configuration/triggers/add").then((m) => ({ default: m.AddTrigger })) +); +const LazyEditTrigger = lazy(() => + import("@components/organisms/configuration/triggers/edit").then((m) => ({ default: m.EditTrigger })) +); +const LazyAddVariable = lazy(() => + import("@components/organisms/configuration/variables/add").then((m) => ({ default: m.AddVariable })) +); +const LazyEditVariable = lazy(() => + import("@components/organisms/configuration/variables/edit").then((m) => ({ default: m.EditVariable })) +); + +const LazyTemplatesCatalog = lazy(() => + import("@components/organisms/dashboard/templates/catalog").then((m) => ({ default: m.TemplatesCatalog })) +); +const LazyWelcomePage = lazy(() => import("@components/organisms/welcome").then((m) => ({ default: m.WelcomePage }))); + +const LazyActivityList = lazy(() => + import("@components/organisms/deployments/sessions/tabs/activities").then((m) => ({ default: m.ActivityList })) +); +const LazySessionOutputs = lazy(() => + import("@components/organisms/deployments/sessions/tabs/outputs").then((m) => ({ + default: m.SessionOutputs, + })) +); + +const LazyProfile = lazy(() => + import("@components/organisms/settings/user/profile").then((m) => ({ default: m.Profile })) +); +const LazyClientConfiguration = lazy(() => + import("@components/organisms/settings/user/clientConfiguration").then((m) => ({ + default: m.ClientConfiguration, + })) +); +const LazyUserOrganizationsTable = lazy(() => + import("@components/organisms/settings/user/organizations/table").then((m) => ({ + default: m.UserOrganizationsTable, + })) +); +const LazyAddOrganization = lazy(() => + import("@components/organisms/settings/organization/add").then((m) => ({ + default: m.AddOrganization, + })) +); +const LazyOrganizationSettings = lazy(() => + import("@components/organisms/settings/organization/settings").then((m) => ({ default: m.OrganizationSettings })) +); +const LazyOrganizationMembersTable = lazy(() => + import("@components/organisms/settings/organization/members/table").then((m) => ({ + default: m.OrganizationMembersTable, + })) +); +const LazySwitchOrganization = lazy(() => + import("@components/organisms/settings/organization/switchOrganization").then((m) => ({ + default: m.SwitchOrganization, + })) +); +const LazyOrganizationBilling = lazy(() => + import("@components/organisms/settings/organization/billing/organizationBilling").then((m) => ({ + default: m.OrganizationBilling, + })) +); + +const PageLoader = () => ( +
+
+
+); + +const withSuspense = (Component: React.ReactNode) => }>{Component}; + +const settingsRouteConfig = [ + { index: true, element: withSuspense() }, + { path: "connections/new", element: withSuspense() }, + { path: "connections", element: withSuspense() }, + { path: "connections/:id/edit", element: withSuspense() }, + { path: "variables", element: withSuspense() }, + { path: "variables/new", element: withSuspense() }, + { path: "variables/:name/edit", element: withSuspense() }, + { path: "triggers", element: withSuspense() }, + { path: "triggers/new", element: withSuspense() }, + { path: "triggers/:id/edit", element: withSuspense() }, ]; -const noProjectHome = featureFlags.displayChatbot ? : ; +const noProjectHome = featureFlags.displayChatbot + ? withSuspense() + : withSuspense(); const globalConnectionsRoutes = featureFlags.displayGlobalConnections ? [ @@ -65,14 +159,19 @@ const globalConnectionsRoutes = featureFlags.displayGlobalConnections children: [ { path: "connections", - element: , + element: withSuspense(), children: [ - { path: "new", element: }, + { + path: "new", + element: withSuspense( + + ), + }, { path: ":id", element: null }, { path: ":id/edit", - element: ( - + element: withSuspense( + ), }, ], @@ -88,13 +187,13 @@ export const mainRoutes = [ path: "/", element: , children: [ - { index: true, element: }, + { index: true, element: withSuspense() }, { path: "ai", element: noProjectHome }, { path: "welcome", element: noProjectHome }, - { path: "intro", element: }, - { path: "templates-library", element: }, - { path: "404", element: }, - { path: "chat", element: }, + { path: "intro", element: withSuspense() }, + { path: "templates-library", element: withSuspense() }, + { path: "404", element: withSuspense() }, + { path: "chat", element: withSuspense() }, { path: "*", element: }, ], }, @@ -102,7 +201,7 @@ export const mainRoutes = [ path: "/template", element: , children: [ - { index: true, element: }, + { index: true, element: withSuspense() }, { path: "*", element: }, ], }, @@ -115,8 +214,17 @@ export const mainRoutes = [ children: [ { index: true, element: }, { path: "code", element: }, - { path: "explorer", element: }, - { path: "explorer/settings/*", element: }, + { + path: "explorer", + element: withSuspense(), + children: [ + { + path: "settings", + element: withSuspense(), + children: settingsRouteConfig, + }, + ], + }, ], }, ], @@ -128,12 +236,52 @@ export const mainRoutes = [ { element: , children: [ - { index: true, element: }, - { path: "settings/*", element: }, + { index: true, element: withSuspense() }, + { + path: "settings", + element: withSuspense( + <> + + + + ), + children: settingsRouteConfig, + }, + + { + path: ":deploymentId/sessions/settings", + element: withSuspense( + <> + + + + ), + children: settingsRouteConfig, + }, + { path: ":deploymentId/sessions", - element: , - children: sessionRouteConfig, + element: withSuspense(), + children: [ + { + path: ":sessionId", + element: withSuspense(), + children: [ + { index: true, element: withSuspense() }, + { path: "executionflow", element: withSuspense() }, + { + path: "settings", + element: withSuspense( + <> + + + + ), + children: settingsRouteConfig, + }, + ], + }, + ], }, { path: "*", element: }, ], @@ -147,11 +295,54 @@ export const mainRoutes = [ { element: , children: [ - { index: true, element: }, - { path: "settings/*", element: }, { - element: , - children: sessionRouteConfig, + index: true, + element: withSuspense(), + }, + { + path: "settings", + element: withSuspense( + <> + + + + ), + children: settingsRouteConfig, + }, + { + path: ":sessionId", + element: withSuspense(), + children: [ + { + index: true, + element: withSuspense(), + children: [ + { index: true, element: withSuspense() }, + { path: "executionflow", element: withSuspense() }, + ], + }, + ], + }, + { + path: ":sessionId/executionflow", + element: withSuspense(), + children: [ + { + index: true, + element: withSuspense(), + children: [{ index: true, element: withSuspense() }], + }, + ], + }, + { + path: ":sessionId/settings", + element: withSuspense( + <> + + + + ), + children: settingsRouteConfig, }, { path: "*", element: }, ], @@ -166,10 +357,10 @@ export const mainRoutes = [ ), children: [ - { index: true, element: }, - { path: "client-configuration", element: }, - { path: "organizations", element: }, - { path: "add-organization", element: }, + { index: true, element: withSuspense() }, + { path: "client-configuration", element: withSuspense() }, + { path: "organizations", element: withSuspense() }, + { path: "add-organization", element: withSuspense() }, { path: "*", element: }, ], }, @@ -185,7 +376,7 @@ export const mainRoutes = [ index: true, element: ( - + {withSuspense()} ), }, @@ -193,11 +384,11 @@ export const mainRoutes = [ path: "billing", element: ( - + {withSuspense()} ), }, - { path: "members", element: }, + { path: "members", element: withSuspense() }, { path: "*", element: }, ], }, @@ -206,8 +397,8 @@ export const mainRoutes = [ children: [ { path: "events", - element: , - children: [{ path: ":eventId", element: }], + element: withSuspense(), + children: [{ path: ":eventId", element: withSuspense() }], }, { path: "*", element: }, ], @@ -216,12 +407,12 @@ export const mainRoutes = [ { path: "switch-organization/:organizationId", element: , - children: [{ index: true, element: }], + children: [{ index: true, element: withSuspense() }], }, { path: "error", element: , - children: [{ index: true, element: }], + children: [{ index: true, element: withSuspense() }], }, ...legacyRoutes, { path: "*", element: }, diff --git a/src/services/sessions.service.ts b/src/services/sessions.service.ts index 882cfef74d..15c2e08613 100644 --- a/src/services/sessions.service.ts +++ b/src/services/sessions.service.ts @@ -1,5 +1,5 @@ import { t } from "i18next"; -import { omit } from "lodash"; +import { omit } from "radash"; import { Session as ProtoSession, diff --git a/src/store/cache/useCacheStore.ts b/src/store/cache/useCacheStore.ts index b1cf97db7f..3a264b1aa1 100644 --- a/src/store/cache/useCacheStore.ts +++ b/src/store/cache/useCacheStore.ts @@ -1,5 +1,5 @@ import { t } from "i18next"; -import isEqual from "lodash/isEqual"; +import { isEqual } from "radash"; import { createSelector } from "reselect"; import { StateCreator, create } from "zustand"; diff --git a/src/store/useProjectStore.ts b/src/store/useProjectStore.ts index eb63024956..c4f622d96e 100644 --- a/src/store/useProjectStore.ts +++ b/src/store/useProjectStore.ts @@ -1,6 +1,6 @@ import { t } from "i18next"; import { load } from "js-yaml"; -import isEqual from "lodash/isEqual"; +import { isEqual } from "radash"; import { StateCreator, create } from "zustand"; import { persist } from "zustand/middleware"; import { immer } from "zustand/middleware/immer"; diff --git a/src/utilities/calculateDeploymentSessionsStats.utils.ts b/src/utilities/calculateDeploymentSessionsStats.utils.ts index 2eeac705a9..e8fc662087 100644 --- a/src/utilities/calculateDeploymentSessionsStats.utils.ts +++ b/src/utilities/calculateDeploymentSessionsStats.utils.ts @@ -1,5 +1,3 @@ -import { cloneDeep } from "lodash"; - import { SessionStateType } from "@src/enums"; import { SessionStatsFilterType } from "@src/types/components"; import { Deployment } from "@src/types/models"; @@ -8,7 +6,7 @@ export const calculateDeploymentSessionsStats = (deployments: Deployment[]): Ses const allSessionStats = deployments.flatMap((deployment) => deployment.sessionStats || []); let totalSessionsCount = 0; - const resetSessionStats = cloneDeep(initialSessionCounts); + const resetSessionStats = structuredClone(initialSessionCounts); const sessionStats = allSessionStats.reduce>((acc, { count, state }) => { if (!state) return acc; diff --git a/src/utilities/convertBuildRuntimesToViewTriggers.utils.ts b/src/utilities/convertBuildRuntimesToViewTriggers.utils.ts index 9e1b5f61fb..c45070bd50 100644 --- a/src/utilities/convertBuildRuntimesToViewTriggers.utils.ts +++ b/src/utilities/convertBuildRuntimesToViewTriggers.utils.ts @@ -1,4 +1,4 @@ -import { uniqBy } from "lodash"; +import { unique } from "radash"; import { namespaces } from "@constants"; import { LoggerService } from "@services"; @@ -16,7 +16,7 @@ const processRuntime = (runtime: BuildInfoRuntimes): Record => .filter(({ location: { path }, symbol: name }) => path === fileName && !name.startsWith("_")) .map(({ symbol: name }) => name); - const uniqueEntrypoints = uniqBy(entrypointsForFile, (func) => func); + const uniqueEntrypoints = unique(entrypointsForFile, (func) => func); result[fileName] = uniqueEntrypoints; }); diff --git a/src/utilities/fetchAndExtractZip.utils.ts b/src/utilities/fetchAndExtractZip.utils.ts index 18494af9d7..2a40d6675b 100644 --- a/src/utilities/fetchAndExtractZip.utils.ts +++ b/src/utilities/fetchAndExtractZip.utils.ts @@ -2,7 +2,7 @@ import axios from "axios"; import frontMatter from "front-matter"; import { t } from "i18next"; import JSZip from "jszip"; -import { memoize } from "lodash"; +import { memo } from "radash"; import { DirectoryNode, @@ -16,9 +16,9 @@ import { LoggerService } from "@services/logger.service"; import { namespaces } from "@src/constants"; import { ProcessedRemoteCategory, RemoteTemplateCardWithFiles } from "@src/interfaces/store"; -const isFileNode = memoize((node: FileNode | DirectoryNode): node is FileNode => node?.type === "file"); +const isFileNode = memo((node: FileNode | DirectoryNode): node is FileNode => node?.type === "file"); -const isDirectoryNode = memoize((node: FileNode | DirectoryNode): node is DirectoryNode => node?.type === "directory"); +const isDirectoryNode = memo((node: FileNode | DirectoryNode): node is DirectoryNode => node?.type === "directory"); const directoryCache = new Map(); @@ -145,7 +145,7 @@ export const fetchAndUnpackZip = async (remoteTemplatesArchiveUrl: string): Prom } }; -const getFileName = memoize((path: string): string => path.split("/").pop() || path); +const getFileName = memo((path: string): string => path.split("/").pop() || path); const getDirectoryStructure = (fileStructure: FileStructure, targetPath: string): FileStructure | null => { if (!targetPath) return fileStructure; diff --git a/src/utilities/openedEditorFilesState.utils.ts b/src/utilities/openedEditorFilesState.utils.ts index e8182535e6..993741bff1 100644 --- a/src/utilities/openedEditorFilesState.utils.ts +++ b/src/utilities/openedEditorFilesState.utils.ts @@ -1,8 +1,8 @@ -import { map, uniqBy } from "lodash"; +import { unique } from "radash"; export const updateOpenedFilesState = (files: { isActive: boolean; name: string }[], name: string) => { - return uniqBy( - [...map(files, (file) => ({ ...file, isActive: file.name === name })), { isActive: true, name }], - "name" + return unique( + [...files.map((file) => ({ ...file, isActive: file.name === name })), { isActive: true, name }], + (f) => f.name ); }; diff --git a/vite.config.ts b/vite.config.ts index 49d795571e..fd70f8bf39 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,7 +1,8 @@ -import react from "@vitejs/plugin-react"; +import react from "@vitejs/plugin-react-swc"; import dotenv from "dotenv"; import fs from "fs"; import path from "path"; +import { visualizer } from "rollup-plugin-visualizer"; import { defineConfig } from "vite"; import { ViteEjsPlugin } from "vite-plugin-ejs"; import mkcert from "vite-plugin-mkcert"; @@ -30,11 +31,13 @@ export default defineConfig({ : 8000, }, build: { - sourcemap: true, + sourcemap: process.env.NODE_ENV === "production" ? "hidden" : true, minify: "terser", + chunkSizeWarningLimit: 1000, terserOptions: { compress: { dead_code: true, + drop_console: process.env.NODE_ENV === "production", if_return: true, unused: true, reduce_vars: true, @@ -42,6 +45,30 @@ export default defineConfig({ passes: 2, }, }, + rollupOptions: { + output: { + manualChunks: { + "vendor-react": ["react", "react-dom", "react-router-dom"], + "vendor-ui": [ + "motion", + "swiper", + "react-select", + "@floating-ui/react", + "react-arborist", + "react-complex-tree", + ], + "vendor-editor": ["@monaco-editor/react", "monaco-editor-textmate", "monaco-textmate", "onigasm"], + "vendor-charts": ["apexcharts", "react-apexcharts"], + "vendor-pdf": ["pdfjs-dist", "react-pdf"], + "vendor-mermaid": ["mermaid"], + "vendor-monitoring": ["@sentry/react", "@datadog/browser-rum", "@datadog/browser-rum-react"], + "vendor-utils": ["radash", "dayjs", "zod", "zustand", "immer", "clsx", "tailwind-merge"], + "vendor-forms": ["react-hook-form", "@hookform/resolvers"], + "vendor-i18n": ["i18next", "react-i18next"], + "vendor-markdown": ["react-markdown", "remark-gfm", "remark-github-blockquote-alert"], + }, + }, + }, }, define: { "import.meta.env.VITE_APP_VERSION": JSON.stringify(version), @@ -145,6 +172,16 @@ export default defineConfig({ ], }), reactVirtualized(), + ...(process.env.ANALYZE === "true" + ? [ + visualizer({ + open: true, + filename: "dist/stats.html", + gzipSize: true, + brotliSize: true, + }), + ] + : []), ], resolve: { alias: { From 336816bf7acb79d52b252e2f31d9f09d3d92f8e6 Mon Sep 17 00:00:00 2001 From: Ronen Mars Date: Wed, 3 Dec 2025 11:18:35 +0200 Subject: [PATCH 2/4] refactor: extract PageLoader component for better code organization - Moved PageLoader implementation to a new file in the atoms directory. - Updated routes.tsx to import and use the new PageLoader component. - Removed the inline PageLoader definition from routes.tsx for cleaner code. --- src/components/atoms/index.ts | 1 + src/components/atoms/pageLoader.tsx | 7 +++++++ src/routes.tsx | 7 +------ 3 files changed, 9 insertions(+), 6 deletions(-) create mode 100644 src/components/atoms/pageLoader.tsx diff --git a/src/components/atoms/index.ts b/src/components/atoms/index.ts index 84f8858b9f..ba723decf1 100644 --- a/src/components/atoms/index.ts +++ b/src/components/atoms/index.ts @@ -31,4 +31,5 @@ export { RadioButton } from "@components/atoms/radioButton"; export { DesignedForDesktopBanner } from "@components/atoms/designedForDesktopTopBanner"; export { CodeFixMessage } from "@components/atoms/codeFixMessage"; export { DeleteFileConfirmation } from "@components/atoms/deleteFileConfirmation"; +export { PageLoader } from "@components/atoms/pageLoader"; export { StatusIndicator } from "@components/atoms/statusIndicator"; diff --git a/src/components/atoms/pageLoader.tsx b/src/components/atoms/pageLoader.tsx new file mode 100644 index 0000000000..c867eb0b57 --- /dev/null +++ b/src/components/atoms/pageLoader.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +export const PageLoader = () => ( +
+
+
+); diff --git a/src/routes.tsx b/src/routes.tsx index 5b2f8aa497..b8c3c71b52 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -6,6 +6,7 @@ import { featureFlags } from "./constants"; import { MemberRole } from "@enums"; import { legacyRoutes } from "@src/routes.legacy"; +import { PageLoader } from "@components/atoms"; import { ProtectedRoute } from "@components/organisms"; import { AppLayout, EventsLayout, GlobalConnectionsLayout } from "@components/templates"; import { ProjectWrapper } from "@components/templates/projectWrapper"; @@ -127,12 +128,6 @@ const LazyOrganizationBilling = lazy(() => })) ); -const PageLoader = () => ( -
-
-
-); - const withSuspense = (Component: React.ReactNode) => }>{Component}; const settingsRouteConfig = [ From 84f3bbad0ab1b0b6a552740fc1d553838421fc68 Mon Sep 17 00:00:00 2001 From: Ronen Mars Date: Mon, 8 Dec 2025 01:39:52 +0200 Subject: [PATCH 3/4] refactor: update omit usage for consistency across components --- src/assets/templates/kittehub.zip | Bin 2135418 -> 2138801 bytes .../deployments/sessions/table/table.tsx | 2 +- .../settings/organization/settings.tsx | 4 ++-- .../settings/user/organizations/table.tsx | 2 +- src/services/sessions.service.ts | 2 +- src/utilities/fetchAndExtractZip.utils.ts | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/assets/templates/kittehub.zip b/src/assets/templates/kittehub.zip index e7617df53b6507257d7482661efeb87fb6e6b741..376487ba81b835b84c6cf7eabc1f8b00635e4afc 100644 GIT binary patch delta 28673 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∓E(V<% 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 OR~tp5f+kA%U;hW(qNj}j delta 25427 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 { return fetchedDeployments; } - if (isEqual(sessionsCountByState, sessionStats)) return; + if (isEqual(sessionsCountByState, sessionStats.sessionStats)) return; setSessionStats({ sessionStats: sessionsCountByState, totalDeployments, diff --git a/src/components/organisms/settings/organization/settings.tsx b/src/components/organisms/settings/organization/settings.tsx index cd5e3f5e75..e8701cb0c7 100644 --- a/src/components/organisms/settings/organization/settings.tsx +++ b/src/components/organisms/settings/organization/settings.tsx @@ -54,7 +54,7 @@ export const OrganizationSettings = () => { } setNameError(""); setOrganizationDisplayName(displayName); - const { error } = await updateOrganization({ ...omit(organization, "currentMember"), displayName }, [ + const { error } = await updateOrganization({ ...omit(organization!, ["currentMember"]), displayName }, [ "display_name", ]); if (error) { @@ -78,7 +78,7 @@ export const OrganizationSettings = () => { const onDelete = async () => { const deletingCurrentOrganization = organization.id === currentOrganization?.id; - const { error } = await deleteOrganization(omit(organization, "currentMember")); + const { error } = await deleteOrganization(omit(organization, ["currentMember"])); closeModal(ModalName.deleteOrganization); if (error) { diff --git a/src/components/organisms/settings/user/organizations/table.tsx b/src/components/organisms/settings/user/organizations/table.tsx index 4403093a2c..5515823d43 100644 --- a/src/components/organisms/settings/user/organizations/table.tsx +++ b/src/components/organisms/settings/user/organizations/table.tsx @@ -33,7 +33,7 @@ export const UserOrganizationsTable = () => { const onDelete = async (organization: EnrichedOrganization) => { const deletingCurrentOrganization = organization.id === currentOrganization?.id; - const { error } = await deleteOrganization(omit(organization, "currentMember")); + const { error } = await deleteOrganization(omit(organization, ["currentMember"])); closeModal(ModalName.deleteOrganization); if (error) { addToast({ diff --git a/src/services/sessions.service.ts b/src/services/sessions.service.ts index 15c2e08613..5da9cc6e41 100644 --- a/src/services/sessions.service.ts +++ b/src/services/sessions.service.ts @@ -177,7 +177,7 @@ export class SessionsService { projectId: string ): Promise> { try { - const sessionToStart = { ...omit(startSessionArgs, "jsonInputs"), projectId }; + const sessionToStart = { ...omit(startSessionArgs, ["jsonInputs"]), projectId }; const sessionAsStartRequest = { session: sessionToStart, jsonObjectInput: startSessionArgs.jsonInputs, diff --git a/src/utilities/fetchAndExtractZip.utils.ts b/src/utilities/fetchAndExtractZip.utils.ts index 2a40d6675b..63dbd0e3d7 100644 --- a/src/utilities/fetchAndExtractZip.utils.ts +++ b/src/utilities/fetchAndExtractZip.utils.ts @@ -16,9 +16,9 @@ import { LoggerService } from "@services/logger.service"; import { namespaces } from "@src/constants"; import { ProcessedRemoteCategory, RemoteTemplateCardWithFiles } from "@src/interfaces/store"; -const isFileNode = memo((node: FileNode | DirectoryNode): node is FileNode => node?.type === "file"); +const isFileNode = (node: FileNode | DirectoryNode): node is FileNode => node?.type === "file"; -const isDirectoryNode = memo((node: FileNode | DirectoryNode): node is DirectoryNode => node?.type === "directory"); +const isDirectoryNode = (node: FileNode | DirectoryNode): node is DirectoryNode => node?.type === "directory"; const directoryCache = new Map(); From 02c8d1b908963be18b2b4fae32ac048ce66bd6ca Mon Sep 17 00:00:00 2001 From: Ronen Mars Date: Tue, 9 Dec 2025 19:54:54 +0200 Subject: [PATCH 4/4] chore: update package version to 2.239.1 and remove @sentry/react dependency feat: refactor SessionsTable component by removing unused debouncedFetchSessionsRef refactor: update route configurations for project settings and global connections --- package-lock.json | 594 +++++++++++++++--- package.json | 3 +- .../deployments/sessions/table/table.tsx | 2 - src/routes.tsx | 79 +-- 4 files changed, 523 insertions(+), 155 deletions(-) diff --git a/package-lock.json b/package-lock.json index e71b586150..809fbe6a81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "autokitteh", - "version": "2.234.2", + "version": "2.239.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "autokitteh", - "version": "2.234.2", + "version": "2.239.1", "hasInstallScript": true, "dependencies": { "@bufbuild/protobuf": "^1.10.0", @@ -19,7 +19,6 @@ "@hookform/resolvers": "^3.9.1", "@monaco-editor/react": "^4.6.0", "@netlify/edge-functions": "^2.11.1", - "@sentry/react": "^8.47.0", "@types/pako": "^2.0.3", "@uiw/react-json-view": "^2.0.0-alpha.30", "axios": "^1.9.0", @@ -141,6 +140,7 @@ "tailwind-config-viewer": "^2.0.4", "tailwindcss": "^3.4.17", "terser": "^5.37.0", + "tsx": "^4.21.0", "typescript": "^5.7.2", "vite": "^6.3.5", "vite-plugin-mkcert": "^1.17.6", @@ -4384,98 +4384,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@sentry-internal/browser-utils": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.55.0.tgz", - "integrity": "sha512-ROgqtQfpH/82AQIpESPqPQe0UyWywKJsmVIqi3c5Fh+zkds5LUxnssTj3yNd1x+kxaPDVB023jAP+3ibNgeNDw==", - "license": "MIT", - "dependencies": { - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry-internal/feedback": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.55.0.tgz", - "integrity": "sha512-cP3BD/Q6pquVQ+YL+rwCnorKuTXiS9KXW8HNKu4nmmBAyf7urjs+F6Hr1k9MXP5yQ8W3yK7jRWd09Yu6DHWOiw==", - "license": "MIT", - "dependencies": { - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry-internal/replay": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.55.0.tgz", - "integrity": "sha512-roCDEGkORwolxBn8xAKedybY+Jlefq3xYmgN2fr3BTnsXjSYOPC7D1/mYqINBat99nDtvgFvNfRcZPiwwZ1hSw==", - "license": "MIT", - "dependencies": { - "@sentry-internal/browser-utils": "8.55.0", - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry-internal/replay-canvas": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.55.0.tgz", - "integrity": "sha512-nIkfgRWk1091zHdu4NbocQsxZF1rv1f7bbp3tTIlZYbrH62XVZosx5iHAuZG0Zc48AETLE7K4AX9VGjvQj8i9w==", - "license": "MIT", - "dependencies": { - "@sentry-internal/replay": "8.55.0", - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/browser": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.55.0.tgz", - "integrity": "sha512-1A31mCEWCjaMxJt6qGUK+aDnLDcK6AwLAZnqpSchNysGni1pSn1RWSmk9TBF8qyTds5FH8B31H480uxMPUJ7Cw==", - "license": "MIT", - "dependencies": { - "@sentry-internal/browser-utils": "8.55.0", - "@sentry-internal/feedback": "8.55.0", - "@sentry-internal/replay": "8.55.0", - "@sentry-internal/replay-canvas": "8.55.0", - "@sentry/core": "8.55.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/core": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.55.0.tgz", - "integrity": "sha512-6g7jpbefjHYs821Z+EBJ8r4Z7LT5h80YSWRJaylGS4nW5W5Z2KXzpdnyFarv37O7QjauzVC2E+PABmpkw5/JGA==", - "license": "MIT", - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/react": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.55.0.tgz", - "integrity": "sha512-/qNBvFLpvSa/Rmia0jpKfJdy16d4YZaAnH/TuKLAtm0BWlsPQzbXCU4h8C5Hsst0Do0zG613MEtEmWpWrVOqWA==", - "license": "MIT", - "dependencies": { - "@sentry/browser": "8.55.0", - "@sentry/core": "8.55.0", - "hoist-non-react-statics": "^3.3.2" - }, - "engines": { - "node": ">=14.18" - }, - "peerDependencies": { - "react": "^16.14.0 || 17.x || 18.x || 19.x" - } - }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -12793,7 +12701,7 @@ "version": "4.10.1", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -22251,7 +22159,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" @@ -25286,6 +25194,498 @@ "dev": true, "license": "0BSD" }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.1.tgz", + "integrity": "sha512-HHB50pdsBX6k47S4u5g/CaLjqS3qwaOVE5ILsq64jyzgMhLuCuZ8rGzM9yhsAjfjkbgUPMzZEPa7DAp7yz6vuA==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.1.tgz", + "integrity": "sha512-kFqa6/UcaTbGm/NncN9kzVOODjhZW8e+FRdSeypWe6j33gzclHtwlANs26JrupOntlcWmB0u8+8HZo8s7thHvg==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.1.tgz", + "integrity": "sha512-45fuKmAJpxnQWixOGCrS+ro4Uvb4Re9+UTieUY2f8AEc+t7d4AaZ6eUJ3Hva7dtrxAAWHtlEFsXFMAgNnGU9uQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/android-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.1.tgz", + "integrity": "sha512-LBEpOz0BsgMEeHgenf5aqmn/lLNTFXVfoWMUox8CtWWYK9X4jmQzWjoGoNb8lmAYml/tQ/Ysvm8q7szu7BoxRQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.1.tgz", + "integrity": "sha512-veg7fL8eMSCVKL7IW4pxb54QERtedFDfY/ASrumK/SbFsXnRazxY4YykN/THYqFnFwJ0aVjiUrVG2PwcdAEqQQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/darwin-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.1.tgz", + "integrity": "sha512-+3ELd+nTzhfWb07Vol7EZ+5PTbJ/u74nC6iv4/lwIU99Ip5uuY6QoIf0Hn4m2HoV0qcnRivN3KSqc+FyCHjoVQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.1.tgz", + "integrity": "sha512-/8Rfgns4XD9XOSXlzUDepG8PX+AVWHliYlUkFI3K3GB6tqbdjYqdhcb4BKRd7C0BhZSoaCxhv8kTcBrcZWP+xg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.1.tgz", + "integrity": "sha512-GITpD8dK9C+r+5yRT/UKVT36h/DQLOHdwGVwwoHidlnA168oD3uxA878XloXebK4Ul3gDBBIvEdL7go9gCUFzQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.1.tgz", + "integrity": "sha512-ieMID0JRZY/ZeCrsFQ3Y3NlHNCqIhTprJfDgSB3/lv5jJZ8FX3hqPyXWhe+gvS5ARMBJ242PM+VNz/ctNj//eA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.1.tgz", + "integrity": "sha512-W9//kCrh/6in9rWIBdKaMtuTTzNj6jSeG/haWBADqLLa9P8O5YSRDzgD5y9QBok4AYlzS6ARHifAb75V6G670Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.1.tgz", + "integrity": "sha512-VIUV4z8GD8rtSVMfAj1aXFahsi/+tcoXXNYmXgzISL+KB381vbSTNdeZHHHIYqFyXcoEhu9n5cT+05tRv13rlw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-loong64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.1.tgz", + "integrity": "sha512-l4rfiiJRN7sTNI//ff65zJ9z8U+k6zcCg0LALU5iEWzY+a1mVZ8iWC1k5EsNKThZ7XCQ6YWtsZ8EWYm7r1UEsg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.1.tgz", + "integrity": "sha512-U0bEuAOLvO/DWFdygTHWY8C067FXz+UbzKgxYhXC0fDieFa0kDIra1FAhsAARRJbvEyso8aAqvPdNxzWuStBnA==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.1.tgz", + "integrity": "sha512-NzdQ/Xwu6vPSf/GkdmRNsOfIeSGnh7muundsWItmBsVpMoNPVpM61qNzAVY3pZ1glzzAxLR40UyYM23eaDDbYQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.1.tgz", + "integrity": "sha512-7zlw8p3IApcsN7mFw0O1Z1PyEk6PlKMu18roImfl3iQHTnr/yAfYv6s4hXPidbDoI2Q0pW+5xeoM4eTCC0UdrQ==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-s390x": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.1.tgz", + "integrity": "sha512-cGj5wli+G+nkVQdZo3+7FDKC25Uh4ZVwOAK6A06Hsvgr8WqBBuOy/1s+PUEd/6Je+vjfm6stX0kmib5b/O2Ykw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/linux-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.1.tgz", + "integrity": "sha512-z3H/HYI9MM0HTv3hQZ81f+AKb+yEoCRlUby1F80vbQ5XdzEMyY/9iNlAmhqiBKw4MJXwfgsh7ERGEOhrM1niMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.1.tgz", + "integrity": "sha512-wzC24DxAvk8Em01YmVXyjl96Mr+ecTPyOuADAvjGg+fyBpGmxmcr2E5ttf7Im8D0sXZihpxzO1isus8MdjMCXQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.1.tgz", + "integrity": "sha512-1YQ8ybGi2yIXswu6eNzJsrYIGFpnlzEWRl6iR5gMgmsrR0FcNoV1m9k9sc3PuP5rUBLshOZylc9nqSgymI+TYg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.1.tgz", + "integrity": "sha512-5Z+DzLCrq5wmU7RDaMDe2DVXMRm2tTDvX2KU14JJVBN2CT/qov7XVix85QoJqHltpvAOZUAc3ndU56HSMWrv8g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.1.tgz", + "integrity": "sha512-Q73ENzIdPF5jap4wqLtsfh8YbYSZ8Q0wnxplOlZUOyZy7B4ZKW8DXGWgTCZmF8VWD7Tciwv5F4NsRf6vYlZtqg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.1.tgz", + "integrity": "sha512-ajbHrGM/XiK+sXM0JzEbJAen+0E+JMQZ2l4RR4VFwvV9JEERx+oxtgkpoKv1SevhjavK2z2ReHk32pjzktWbGg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/sunos-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.1.tgz", + "integrity": "sha512-IPUW+y4VIjuDVn+OMzHc5FV4GubIwPnsz6ubkvN8cuhEqH81NovB53IUlrlBkPMEPxvNnf79MGBoz8rZ2iW8HA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-arm64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.1.tgz", + "integrity": "sha512-RIVRWiljWA6CdVu8zkWcRmGP7iRRIIwvhDKem8UMBjPql2TXM5PkDVvvrzMtj1V+WFPB4K7zkIGM7VzRtFkjdg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-ia32": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.1.tgz", + "integrity": "sha512-2BR5M8CPbptC1AK5JbJT1fWrHLvejwZidKx3UMSF0ecHMa+smhi16drIrCEggkgviBwLYd5nwrFLSl5Kho96RQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.1.tgz", + "integrity": "sha512-d5X6RMYv6taIymSk8JBP+nxv8DQAMY6A51GPgusqLdK9wBz5wWIXy1KjTck6HnjE9hqJzJRdk+1p/t5soSbCtw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.1.tgz", + "integrity": "sha512-yY35KZckJJuVVPXpvjgxiCuVEJT67F6zDeVTv4rizyPrfGBUpZQsvmxnN+C371c2esD/hNMjj4tpBhuueLN7aA==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.1", + "@esbuild/android-arm": "0.27.1", + "@esbuild/android-arm64": "0.27.1", + "@esbuild/android-x64": "0.27.1", + "@esbuild/darwin-arm64": "0.27.1", + "@esbuild/darwin-x64": "0.27.1", + "@esbuild/freebsd-arm64": "0.27.1", + "@esbuild/freebsd-x64": "0.27.1", + "@esbuild/linux-arm": "0.27.1", + "@esbuild/linux-arm64": "0.27.1", + "@esbuild/linux-ia32": "0.27.1", + "@esbuild/linux-loong64": "0.27.1", + "@esbuild/linux-mips64el": "0.27.1", + "@esbuild/linux-ppc64": "0.27.1", + "@esbuild/linux-riscv64": "0.27.1", + "@esbuild/linux-s390x": "0.27.1", + "@esbuild/linux-x64": "0.27.1", + "@esbuild/netbsd-arm64": "0.27.1", + "@esbuild/netbsd-x64": "0.27.1", + "@esbuild/openbsd-arm64": "0.27.1", + "@esbuild/openbsd-x64": "0.27.1", + "@esbuild/openharmony-arm64": "0.27.1", + "@esbuild/sunos-x64": "0.27.1", + "@esbuild/win32-arm64": "0.27.1", + "@esbuild/win32-ia32": "0.27.1", + "@esbuild/win32-x64": "0.27.1" + } + }, + "node_modules/tsx/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/tunnel": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", diff --git a/package.json b/package.json index a5412daf69..69966a6870 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,6 @@ "@hookform/resolvers": "^3.9.1", "@monaco-editor/react": "^4.6.0", "@netlify/edge-functions": "^2.11.1", - "@sentry/react": "^8.47.0", "@types/pako": "^2.0.3", "@uiw/react-json-view": "^2.0.0-alpha.30", "axios": "^1.9.0", @@ -234,4 +233,4 @@ "rimraf": "^4.0.0", "micromatch": "^4.0.8" } -} +} \ No newline at end of file diff --git a/src/components/organisms/deployments/sessions/table/table.tsx b/src/components/organisms/deployments/sessions/table/table.tsx index 7ef1bd7e08..3b8b81cac9 100644 --- a/src/components/organisms/deployments/sessions/table/table.tsx +++ b/src/components/organisms/deployments/sessions/table/table.tsx @@ -76,7 +76,6 @@ export const SessionsTable = () => { const firstTimeLoadingRef = useRef(true); const refreshDataRef = useRef<(forceRefresh?: boolean) => Promise>(); const fetchSessionsRef = useRef<(nextPageToken?: string, forceRefresh?: boolean) => Promise>(); - const debouncedFetchSessionsRef = useRef>>(); const isCompactMode = leftSideWidth < 25; const hideSourceColumn = leftSideWidth < 35; const hideActionsColumn = leftSideWidth < 27; @@ -256,7 +255,6 @@ export const SessionsTable = () => { ); const debouncedFetchSessions = useMemo(() => debounce({ delay: 100 }, fetchSessions), [fetchSessions]); - debouncedFetchSessionsRef.current = debouncedFetchSessions; const refreshData = useCallback( async (forceRefresh = false) => { diff --git a/src/routes.tsx b/src/routes.tsx index b8c3c71b52..cf2ddf2725 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -40,20 +40,20 @@ const LazyEventViewer = lazy(() => const LazyEventsList = lazy(() => import("@components/organisms/shared/events").then((m) => ({ default: m.EventsList })) ); -const LazyGlobalConnectionsTable = lazy(() => - import("@components/organisms/connections/globalConnectionsTable").then((m) => ({ +const GlobalConnectionsTable = lazy(() => + import("@components/organisms/globalConnections/table").then((m) => ({ default: m.GlobalConnectionsTable, })) ); -const LazyProjectSettingsDrawer = lazy(() => +const LazyProjectConfigurationDrawer = lazy(() => import("@components/organisms/configuration/configrationDrawer").then((m) => ({ - default: m.ProjectSettingsDrawer, + default: m.ProjectConfigurationDrawer, })) ); -const LazyProjectSettingsMainView = lazy(() => +const LazyProjectConfigurationView = lazy(() => import("@components/organisms/configuration/configurationView").then((m) => ({ - default: m.ProjectSettingsMainView, + default: m.ConfigurationView, })) ); const LazyAddConnection = lazy(() => @@ -131,14 +131,17 @@ const LazyOrganizationBilling = lazy(() => const withSuspense = (Component: React.ReactNode) => }>{Component}; const settingsRouteConfig = [ - { index: true, element: withSuspense() }, - { path: "connections/new", element: withSuspense() }, - { path: "connections", element: withSuspense() }, - { path: "connections/:id/edit", element: withSuspense() }, - { path: "variables", element: withSuspense() }, + { index: true, element: withSuspense() }, + { path: "connections/new", element: withSuspense() }, + { path: "connections", element: withSuspense() }, + { + path: "connections/:id/edit", + element: withSuspense(), + }, + { path: "variables", element: withSuspense() }, { path: "variables/new", element: withSuspense() }, { path: "variables/:name/edit", element: withSuspense() }, - { path: "triggers", element: withSuspense() }, + { path: "triggers", element: withSuspense() }, { path: "triggers/new", element: withSuspense() }, { path: "triggers/:id/edit", element: withSuspense() }, ]; @@ -154,7 +157,7 @@ const globalConnectionsRoutes = featureFlags.displayGlobalConnections children: [ { path: "connections", - element: withSuspense(), + element: withSuspense(), children: [ { path: "new", @@ -215,7 +218,7 @@ export const mainRoutes = [ children: [ { path: "settings", - element: withSuspense(), + element: withSuspense(), children: settingsRouteConfig, }, ], @@ -237,7 +240,7 @@ export const mainRoutes = [ element: withSuspense( <> - + ), children: settingsRouteConfig, @@ -248,7 +251,7 @@ export const mainRoutes = [ element: withSuspense( <> - + ), children: settingsRouteConfig, @@ -269,7 +272,7 @@ export const mainRoutes = [ element: withSuspense( <> - + ), children: settingsRouteConfig, @@ -290,55 +293,23 @@ export const mainRoutes = [ { element: , children: [ + { index: true, element: withSuspense() }, + { path: "settings/*", element: withSuspense() }, { - index: true, - element: withSuspense(), - }, - { - path: "settings", - element: withSuspense( - <> - - - - ), - children: settingsRouteConfig, - }, - { - path: ":sessionId", element: withSuspense(), children: [ { - index: true, + path: ":sessionId", element: withSuspense(), children: [ { index: true, element: withSuspense() }, { path: "executionflow", element: withSuspense() }, + { path: "settings/*", element: withSuspense() }, + { path: "executionflow/settings/*", element: withSuspense() }, ], }, ], }, - { - path: ":sessionId/executionflow", - element: withSuspense(), - children: [ - { - index: true, - element: withSuspense(), - children: [{ index: true, element: withSuspense() }], - }, - ], - }, - { - path: ":sessionId/settings", - element: withSuspense( - <> - - - - ), - children: settingsRouteConfig, - }, { path: "*", element: }, ], },