diff --git a/.claude/rules/react.md b/.claude/rules/react.md index ad6db67..05672d4 100644 --- a/.claude/rules/react.md +++ b/.claude/rules/react.md @@ -5,7 +5,7 @@ ArgoCD extensions run inside ArgoCD's React runtime. React is provided globally by ArgoCD. Do not bundle React. Configure webpack/vite externals: ```javascript -externals: { react: "React", "react-dom": "ReactDOM" } +externals: { react: "React", "react-dom": "ReactDOM", "react/jsx-runtime": "ReactJSXRuntime" } ``` ## Extension Registration diff --git a/CLAUDE.md b/CLAUDE.md index 904a335..db8ed3f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -27,7 +27,7 @@ Every ArgoPlane extension follows the same pattern: ### Key Components -- **ArgoCD v3.3.3**: GitOps engine, UI host, RBAC, proxy extension routing +- **ArgoCD v3.5.2**: GitOps engine, UI host, RBAC, proxy extension routing - **Prometheus**: Metrics and alerts (metrics + alerts extensions) - **Loki**: Log aggregation (logs extension) - **Cilium/Hubble**: Network visibility (networking extension) diff --git a/Makefile b/Makefile index 5cc6459..f07d1b0 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # --- Configuration --- CLUSTER_NAME ?= argoplane-dev -ARGOCD_VERSION ?= v3.3.3 +ARGOCD_VERSION ?= v3.5.2 ARGOCD_NS := argocd KIND_CONFIG := hack/kind-config.yaml EXTENSIONS := metrics networking logs vulnerabilities events diff --git a/extensions/argoplane/ui/package-lock.json b/extensions/argoplane/ui/package-lock.json index ff714db..b6dc243 100644 --- a/extensions/argoplane/ui/package-lock.json +++ b/extensions/argoplane/ui/package-lock.json @@ -11,7 +11,7 @@ "@argoplane/shared": "file:../../shared" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "ts-loader": "^9.6.2", "typescript": "^5.4.0", "webpack": "^5.108.4", @@ -22,11 +22,11 @@ "name": "@argoplane/shared", "version": "0.1.0", "devDependencies": { - "@types/react": "^18.3.31", + "@types/react": "^19.2.18", "typescript": "^5.4.0" }, "peerDependencies": { - "react": "^18.0.0" + "react": "^19.0.0" } }, "node_modules/@argoplane/shared": { @@ -117,21 +117,13 @@ "undici-types": "~8.3.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "dev": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.2.2" } }, diff --git a/extensions/argoplane/ui/package.json b/extensions/argoplane/ui/package.json index 8af15ae..62fec27 100644 --- a/extensions/argoplane/ui/package.json +++ b/extensions/argoplane/ui/package.json @@ -11,7 +11,7 @@ "@argoplane/shared": "file:../../shared" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "ts-loader": "^9.6.2", "typescript": "^5.4.0", "webpack": "^5.108.4", diff --git a/extensions/argoplane/ui/webpack.config.js b/extensions/argoplane/ui/webpack.config.js index a8f2a0e..5dbe995 100644 --- a/extensions/argoplane/ui/webpack.config.js +++ b/extensions/argoplane/ui/webpack.config.js @@ -14,6 +14,7 @@ module.exports = { externals: { react: 'React', 'react-dom': 'ReactDOM', + 'react/jsx-runtime': 'ReactJSXRuntime', }, module: { rules: [ diff --git a/extensions/events/ui/package-lock.json b/extensions/events/ui/package-lock.json index 2667218..04fda07 100644 --- a/extensions/events/ui/package-lock.json +++ b/extensions/events/ui/package-lock.json @@ -11,7 +11,7 @@ "@argoplane/shared": "file:../../shared" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "css-loader": "^7.0.0", "style-loader": "^4.0.0", "ts-loader": "^9.6.2", @@ -24,11 +24,11 @@ "name": "@argoplane/shared", "version": "0.1.0", "devDependencies": { - "@types/react": "^18.3.31", + "@types/react": "^19.2.18", "typescript": "^5.4.0" }, "peerDependencies": { - "react": "^18.0.0" + "react": "^19.0.0" } }, "node_modules/@argoplane/shared": { @@ -119,21 +119,13 @@ "undici-types": "~8.3.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "dev": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.2.2" } }, diff --git a/extensions/events/ui/package.json b/extensions/events/ui/package.json index abc8759..0aa6add 100644 --- a/extensions/events/ui/package.json +++ b/extensions/events/ui/package.json @@ -11,7 +11,7 @@ "@argoplane/shared": "file:../../shared" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "css-loader": "^7.0.0", "style-loader": "^4.0.0", "ts-loader": "^9.6.2", diff --git a/extensions/events/ui/webpack.config.js b/extensions/events/ui/webpack.config.js index 3721257..8a331db 100644 --- a/extensions/events/ui/webpack.config.js +++ b/extensions/events/ui/webpack.config.js @@ -14,6 +14,7 @@ module.exports = { externals: { react: 'React', 'react-dom': 'ReactDOM', + 'react/jsx-runtime': 'ReactJSXRuntime', }, module: { rules: [ diff --git a/extensions/logs/ui/package-lock.json b/extensions/logs/ui/package-lock.json index 173d23f..fa3ca90 100644 --- a/extensions/logs/ui/package-lock.json +++ b/extensions/logs/ui/package-lock.json @@ -11,7 +11,7 @@ "@argoplane/shared": "file:../../shared" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "css-loader": "^7.0.0", "style-loader": "^4.0.0", "ts-loader": "^9.6.2", @@ -24,11 +24,11 @@ "name": "@argoplane/shared", "version": "0.1.0", "devDependencies": { - "@types/react": "^18.3.31", + "@types/react": "^19.2.18", "typescript": "^5.4.0" }, "peerDependencies": { - "react": "^18.0.0" + "react": "^19.0.0" } }, "node_modules/@argoplane/shared": { @@ -119,21 +119,13 @@ "undici-types": "~8.3.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "dev": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.2.2" } }, diff --git a/extensions/logs/ui/package.json b/extensions/logs/ui/package.json index aedd140..0d6b649 100644 --- a/extensions/logs/ui/package.json +++ b/extensions/logs/ui/package.json @@ -11,7 +11,7 @@ "@argoplane/shared": "file:../../shared" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "css-loader": "^7.0.0", "style-loader": "^4.0.0", "ts-loader": "^9.6.2", diff --git a/extensions/logs/ui/webpack.config.js b/extensions/logs/ui/webpack.config.js index 54647a3..82b6683 100644 --- a/extensions/logs/ui/webpack.config.js +++ b/extensions/logs/ui/webpack.config.js @@ -14,6 +14,7 @@ module.exports = { externals: { react: 'React', 'react-dom': 'ReactDOM', + 'react/jsx-runtime': 'ReactJSXRuntime', }, module: { rules: [ diff --git a/extensions/metrics/ui/package-lock.json b/extensions/metrics/ui/package-lock.json index c806ac8..92ee0b9 100644 --- a/extensions/metrics/ui/package-lock.json +++ b/extensions/metrics/ui/package-lock.json @@ -9,10 +9,11 @@ "version": "0.1.0", "dependencies": { "@argoplane/shared": "file:../../shared", + "react-is": "^19.2.8", "recharts": "^3.9.2" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "css-loader": "^7.0.0", "style-loader": "^4.0.0", "ts-loader": "^9.6.2", @@ -25,11 +26,11 @@ "name": "@argoplane/shared", "version": "0.1.0", "devDependencies": { - "@types/react": "^18.3.31", + "@types/react": "^19.2.18", "typescript": "^5.4.0" }, "peerDependencies": { - "react": "^18.0.0" + "react": "^19.0.0" } }, "node_modules/@argoplane/shared": { @@ -221,21 +222,13 @@ "undici-types": "~8.3.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "devOptional": true, - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "devOptional": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.2.2" } }, @@ -1603,11 +1596,10 @@ } }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT", - "peer": true + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.8.tgz", + "integrity": "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ==", + "license": "MIT" }, "node_modules/react-redux": { "version": "9.2.0", diff --git a/extensions/metrics/ui/package.json b/extensions/metrics/ui/package.json index d7c3c16..a4b76db 100644 --- a/extensions/metrics/ui/package.json +++ b/extensions/metrics/ui/package.json @@ -9,10 +9,11 @@ }, "dependencies": { "@argoplane/shared": "file:../../shared", + "react-is": "^19.2.8", "recharts": "^3.9.2" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "css-loader": "^7.0.0", "style-loader": "^4.0.0", "ts-loader": "^9.6.2", diff --git a/extensions/metrics/ui/webpack.config.js b/extensions/metrics/ui/webpack.config.js index 81a1845..bc3f912 100644 --- a/extensions/metrics/ui/webpack.config.js +++ b/extensions/metrics/ui/webpack.config.js @@ -14,6 +14,7 @@ module.exports = { externals: { react: 'React', 'react-dom': 'ReactDOM', + 'react/jsx-runtime': 'ReactJSXRuntime', }, module: { rules: [ diff --git a/extensions/networking/ui/package-lock.json b/extensions/networking/ui/package-lock.json index 8506553..902bcd7 100644 --- a/extensions/networking/ui/package-lock.json +++ b/extensions/networking/ui/package-lock.json @@ -11,7 +11,7 @@ "@argoplane/shared": "file:../../shared" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "css-loader": "^7.0.0", "style-loader": "^4.0.0", "ts-loader": "^9.6.2", @@ -24,11 +24,11 @@ "name": "@argoplane/shared", "version": "0.1.0", "devDependencies": { - "@types/react": "^18.3.31", + "@types/react": "^19.2.18", "typescript": "^5.4.0" }, "peerDependencies": { - "react": "^18.0.0" + "react": "^19.0.0" } }, "node_modules/@argoplane/shared": { @@ -119,21 +119,13 @@ "undici-types": "~8.3.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "dev": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.2.2" } }, diff --git a/extensions/networking/ui/package.json b/extensions/networking/ui/package.json index 8c2e2e7..d09eaaf 100644 --- a/extensions/networking/ui/package.json +++ b/extensions/networking/ui/package.json @@ -11,7 +11,7 @@ "@argoplane/shared": "file:../../shared" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "css-loader": "^7.0.0", "style-loader": "^4.0.0", "ts-loader": "^9.6.2", diff --git a/extensions/networking/ui/webpack.config.js b/extensions/networking/ui/webpack.config.js index 54ab171..21504dd 100644 --- a/extensions/networking/ui/webpack.config.js +++ b/extensions/networking/ui/webpack.config.js @@ -14,6 +14,7 @@ module.exports = { externals: { react: 'React', 'react-dom': 'ReactDOM', + 'react/jsx-runtime': 'ReactJSXRuntime', }, module: { rules: [ diff --git a/extensions/shared/package-lock.json b/extensions/shared/package-lock.json index aa6878d..0f7b5e1 100644 --- a/extensions/shared/package-lock.json +++ b/extensions/shared/package-lock.json @@ -8,28 +8,20 @@ "name": "@argoplane/shared", "version": "0.1.0", "devDependencies": { - "@types/react": "^18.3.31", + "@types/react": "^19.2.18", "typescript": "^5.4.0" }, "peerDependencies": { - "react": "^18.0.0" + "react": "^19.0.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.31", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", - "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "dev": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.2.2" } }, @@ -40,35 +32,12 @@ "dev": true, "license": "MIT" }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT", - "peer": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "license": "MIT", - "peer": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", "license": "MIT", "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } diff --git a/extensions/shared/package.json b/extensions/shared/package.json index d02a114..4b61928 100644 --- a/extensions/shared/package.json +++ b/extensions/shared/package.json @@ -5,10 +5,10 @@ "main": "src/index.ts", "types": "src/index.ts", "peerDependencies": { - "react": "^18.0.0" + "react": "^19.0.0" }, "devDependencies": { - "@types/react": "^18.3.31", + "@types/react": "^19.2.18", "typescript": "^5.4.0" } } diff --git a/extensions/vulnerabilities/ui/package-lock.json b/extensions/vulnerabilities/ui/package-lock.json index 4eb4f14..a478319 100644 --- a/extensions/vulnerabilities/ui/package-lock.json +++ b/extensions/vulnerabilities/ui/package-lock.json @@ -11,7 +11,7 @@ "@argoplane/shared": "file:../../shared" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "css-loader": "^7.0.0", "style-loader": "^4.0.0", "ts-loader": "^9.6.2", @@ -24,11 +24,11 @@ "name": "@argoplane/shared", "version": "0.1.0", "devDependencies": { - "@types/react": "^18.3.31", + "@types/react": "^19.2.18", "typescript": "^5.4.0" }, "peerDependencies": { - "react": "^18.0.0" + "react": "^19.0.0" } }, "node_modules/@argoplane/shared": { @@ -119,21 +119,13 @@ "undici-types": "~8.3.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/react": { - "version": "18.3.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", - "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "version": "19.2.18", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", + "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", "dev": true, "license": "MIT", "dependencies": { - "@types/prop-types": "*", "csstype": "^3.2.2" } }, diff --git a/extensions/vulnerabilities/ui/package.json b/extensions/vulnerabilities/ui/package.json index 34ba3d3..e073189 100644 --- a/extensions/vulnerabilities/ui/package.json +++ b/extensions/vulnerabilities/ui/package.json @@ -11,7 +11,7 @@ "@argoplane/shared": "file:../../shared" }, "devDependencies": { - "@types/react": "^18.2.0", + "@types/react": "^19.2.18", "css-loader": "^7.0.0", "style-loader": "^4.0.0", "ts-loader": "^9.6.2", diff --git a/extensions/vulnerabilities/ui/webpack.config.js b/extensions/vulnerabilities/ui/webpack.config.js index 5f6fc26..ce21273 100644 --- a/extensions/vulnerabilities/ui/webpack.config.js +++ b/extensions/vulnerabilities/ui/webpack.config.js @@ -14,6 +14,7 @@ module.exports = { externals: { react: 'React', 'react-dom': 'ReactDOM', + 'react/jsx-runtime': 'ReactJSXRuntime', }, module: { rules: [ diff --git a/services/docs/src/routes/adoption/+page.svx b/services/docs/src/routes/adoption/+page.svx index ca9bd63..5e24a95 100644 --- a/services/docs/src/routes/adoption/+page.svx +++ b/services/docs/src/routes/adoption/+page.svx @@ -65,7 +65,7 @@ Add the **logs**, **vulnerabilities**, and **events** extensions. Developers can - ArgoPlane targets ArgoCD v3.x. Some extensions may work with v2.x proxy extensions, but v3 is required for full functionality (system-level extensions, status panels, app view extensions). + ArgoPlane targets ArgoCD v3.5+ (tested against v3.5.2, which runs the React 19 UI). Earlier v3.x releases generally work since the bundles avoid version-specific React APIs, but they are not tested. v2.x is not supported: system-level extensions, status panels, and app view extensions require v3. diff --git a/services/docs/src/routes/deployment/+page.svx b/services/docs/src/routes/deployment/+page.svx index 2e741ec..84bfb71 100644 --- a/services/docs/src/routes/deployment/+page.svx +++ b/services/docs/src/routes/deployment/+page.svx @@ -15,7 +15,7 @@ ArgoPlane ships as a Helm chart that deploys extension backends alongside ArgoCD ## Prerequisites -- ArgoCD v3.x installed and running +- ArgoCD v3.5+ installed and running - `kubectl` access to the cluster - Helm 3.x - Backend dependencies installed per extension: diff --git a/services/docs/src/routes/deployment/argocd-configuration/+page.svx b/services/docs/src/routes/deployment/argocd-configuration/+page.svx index 5556989..6ae0296 100644 --- a/services/docs/src/routes/deployment/argocd-configuration/+page.svx +++ b/services/docs/src/routes/deployment/argocd-configuration/+page.svx @@ -498,6 +498,7 @@ Key changes in ArgoCD v3 that affect extension configuration: | Extensions require RBAC | Every extension needs `p, role:, extensions, invoke, , allow`. | | Annotation-based tracking | Resource tracking uses annotations by default, not labels. | | Health in Redis | Resource health is stored in Redis, not in Application status. | +| React 19 UI (v3.5+) | UI extensions must externalize `react/jsx-runtime` (exposed as `window.ReactJSXRuntime`). ArgoPlane bundles already do. Custom extensions built against older ArgoCD may fail to load until rebuilt. | ## Troubleshooting diff --git a/services/docs/src/routes/developing/ui-extensions/+page.svx b/services/docs/src/routes/developing/ui-extensions/+page.svx index 117daa8..0723477 100644 --- a/services/docs/src/routes/developing/ui-extensions/+page.svx +++ b/services/docs/src/routes/developing/ui-extensions/+page.svx @@ -12,7 +12,7 @@ ArgoCD extensions run inside ArgoCD's React runtime. React is provided globally Configure webpack externals to use ArgoCD's React: ```javascript -externals: { react: "React", "react-dom": "ReactDOM" } +externals: { react: "React", "react-dom": "ReactDOM", "react/jsx-runtime": "ReactJSXRuntime" } ``` The build output must be a single JS file matching `extension(.*)\.js`, built as IIFE or UMD (not ES modules). diff --git a/services/docs/src/routes/getting-started/+page.svx b/services/docs/src/routes/getting-started/+page.svx index 1215e5f..7ee0c93 100644 --- a/services/docs/src/routes/getting-started/+page.svx +++ b/services/docs/src/routes/getting-started/+page.svx @@ -13,7 +13,7 @@ This guide walks you through installing ArgoPlane extensions in your ArgoCD clus ## Prerequisites -- ArgoCD v3.x installed and running +- ArgoCD v3.5+ installed and running - `kubectl` access to the cluster - Helm (for operator installations like Prometheus, Loki, Trivy Operator)