diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index fde62fc7..7347568d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,7 +1,7 @@ # ExtensionShield CI/CD Pipeline # Deploys to Railway on push to main -name: Deploy to Railway +name: Deploy to Render on: push: @@ -96,7 +96,7 @@ jobs: # Job 3: Deploy to Railway # ============================================================================= deploy: - name: Deploy to Railway + name: Deploy to Render runs-on: ubuntu-latest needs: build if: github.event_name == 'push' && github.ref == 'refs/heads/main' @@ -105,18 +105,14 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Install Railway CLI - run: npm install -g @railway/cli - - - name: Deploy to Railway - run: railway up --detach - env: - RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }} + - name: Trigger Render Deploy Hook + run: | + curl -f -X GET "${{ secrets.RENDER_DEPLOY_HOOK }}" - name: Deployment Summary run: | - echo "## 🚀 Deployment Complete!" >> $GITHUB_STEP_SUMMARY + echo "## 🚀 Deployment Triggered!" >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "Your app has been deployed to Railway." >> $GITHUB_STEP_SUMMARY + echo "A deployment request has been sent to Render." >> $GITHUB_STEP_SUMMARY echo "" >> $GITHUB_STEP_SUMMARY - echo "Check your Railway dashboard for the live URL." >> $GITHUB_STEP_SUMMARY + echo "Check your Render dashboard to monitor the progress of the build and deployment." >> $GITHUB_STEP_SUMMARY diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 67ebd763..6780d808 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -15,7 +15,7 @@ "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-tooltip": "^1.2.8", "@supabase/supabase-js": "^2.94.1", - "axios": "^1.12.2", + "axios": "^1.15.2", "framer-motion": "^12.34.0", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -42,14 +42,14 @@ "jsdom": "^23.0.1", "lucide-react": "^0.562.0", "playwright": "^1.49.0", - "postcss": "^8.5.6", + "postcss": "^8.5.10", "prettier": "^3.4.2", "sass": "^1.97.2", "sharp": "^0.34.5", "tailwind-merge": "^3.4.0", "tailwindcss": "^4.1.18", "tailwindcss-animate": "^1.0.7", - "vite": "^7.1.7", + "vite": "^7.3.2", "vitest": "^3.2.4" }, "engines": { @@ -528,14 +528,13 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", + "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "aix" @@ -545,14 +544,13 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", + "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -562,14 +560,13 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", + "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -579,14 +576,13 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", + "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -596,14 +592,13 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", + "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -613,14 +608,13 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", + "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -630,14 +624,13 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", + "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -647,14 +640,13 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", + "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -664,14 +656,13 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", + "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", "cpu": [ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -681,14 +672,13 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", + "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -698,14 +688,13 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", + "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -715,14 +704,13 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", + "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", "cpu": [ "loong64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -732,14 +720,13 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", + "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", "cpu": [ "mips64el" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -749,14 +736,13 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", + "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", "cpu": [ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -766,14 +752,13 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", + "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", "cpu": [ "riscv64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -783,14 +768,13 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", + "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", "cpu": [ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -800,14 +784,13 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", + "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -817,14 +800,13 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", + "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -834,14 +816,13 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", + "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "netbsd" @@ -851,14 +832,13 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", + "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -868,14 +848,13 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", + "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openbsd" @@ -885,14 +864,13 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", + "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openharmony" @@ -902,14 +880,13 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", + "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "sunos" @@ -919,14 +896,13 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", + "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", "cpu": [ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -936,14 +912,13 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", + "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", "cpu": [ "ia32" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -953,14 +928,13 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", + "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -4227,14 +4201,13 @@ } }, "node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", - "license": "MIT", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.2.tgz", + "integrity": "sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==", "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" + "proxy-from-env": "^2.1.0" } }, "node_modules/balanced-match": { @@ -5038,12 +5011,11 @@ ] }, "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "version": "0.27.7", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", + "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -5051,32 +5023,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" + "@esbuild/aix-ppc64": "0.27.7", + "@esbuild/android-arm": "0.27.7", + "@esbuild/android-arm64": "0.27.7", + "@esbuild/android-x64": "0.27.7", + "@esbuild/darwin-arm64": "0.27.7", + "@esbuild/darwin-x64": "0.27.7", + "@esbuild/freebsd-arm64": "0.27.7", + "@esbuild/freebsd-x64": "0.27.7", + "@esbuild/linux-arm": "0.27.7", + "@esbuild/linux-arm64": "0.27.7", + "@esbuild/linux-ia32": "0.27.7", + "@esbuild/linux-loong64": "0.27.7", + "@esbuild/linux-mips64el": "0.27.7", + "@esbuild/linux-ppc64": "0.27.7", + "@esbuild/linux-riscv64": "0.27.7", + "@esbuild/linux-s390x": "0.27.7", + "@esbuild/linux-x64": "0.27.7", + "@esbuild/netbsd-arm64": "0.27.7", + "@esbuild/netbsd-x64": "0.27.7", + "@esbuild/openbsd-arm64": "0.27.7", + "@esbuild/openbsd-x64": "0.27.7", + "@esbuild/openharmony-arm64": "0.27.7", + "@esbuild/sunos-x64": "0.27.7", + "@esbuild/win32-arm64": "0.27.7", + "@esbuild/win32-ia32": "0.27.7", + "@esbuild/win32-x64": "0.27.7" } }, "node_modules/escalade": { @@ -5392,16 +5364,15 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -7035,9 +7006,9 @@ } }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", + "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", "dev": true, "funding": [ { @@ -7053,7 +7024,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -7132,10 +7102,12 @@ "license": "MIT" }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "engines": { + "node": ">=10" + } }, "node_modules/psl": { "version": "1.15.0", @@ -8285,13 +8257,12 @@ } }, "node_modules/vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", diff --git a/frontend/package.json b/frontend/package.json index e39fe904..e4bfda2c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -38,7 +38,7 @@ "@radix-ui/react-tabs": "^1.1.13", "@radix-ui/react-tooltip": "^1.2.8", "@supabase/supabase-js": "^2.94.1", - "axios": "^1.12.2", + "axios": "^1.15.2", "framer-motion": "^12.34.0", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -65,14 +65,14 @@ "jsdom": "^23.0.1", "lucide-react": "^0.562.0", "playwright": "^1.49.0", - "postcss": "^8.5.6", + "postcss": "^8.5.10", "prettier": "^3.4.2", "sass": "^1.97.2", "sharp": "^0.34.5", "tailwind-merge": "^3.4.0", "tailwindcss": "^4.1.18", "tailwindcss-animate": "^1.0.7", - "vite": "^7.1.7", + "vite": "^7.3.2", "vitest": "^3.2.4" }, "overrides": { diff --git a/frontend/public/sitemap.xml b/frontend/public/sitemap.xml index 06925a77..e1552557 100644 --- a/frontend/public/sitemap.xml +++ b/frontend/public/sitemap.xml @@ -2,211 +2,211 @@ https://extensionshield.com/ - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z weekly 1.0 https://extensionshield.com/about - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/blog - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z weekly 0.8 https://extensionshield.com/blog/enterprise-browser-extension-risk-management - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.6 https://extensionshield.com/blog/how-to-audit-chrome-extension-before-installing - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.6 https://extensionshield.com/blog/how-to-detect-malicious-chrome-extensions - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.6 https://extensionshield.com/browser-extension-risk-assessment - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.8 https://extensionshield.com/careers - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.8 https://extensionshield.com/careers/apply - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.6 https://extensionshield.com/chrome-extension-permissions - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.8 https://extensionshield.com/chrome-extension-security-scanner - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.8 https://extensionshield.com/community - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/compare - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.8 https://extensionshield.com/compare/crxcavator - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/compare/crxplorer - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/compare/extension-auditor - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/contribute - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.6 https://extensionshield.com/crxcavator-alternative - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.8 https://extensionshield.com/enterprise - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.8 https://extensionshield.com/glossary - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/gsoc/ideas - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/is-this-chrome-extension-safe - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.9 https://extensionshield.com/open-source - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/open-source/programs - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/privacy-policy - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.5 https://extensionshield.com/research - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z weekly 0.8 https://extensionshield.com/research/benchmarks - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/research/case-studies - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z weekly 0.8 https://extensionshield.com/research/case-studies/fake-ad-blockers - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/research/case-studies/honey - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/research/case-studies/pdf-converters - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/research/methodology - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z monthly 0.7 https://extensionshield.com/scan - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z weekly 0.9 https://extensionshield.com/scan/history - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z weekly 0.7 https://extensionshield.com/scan/upload - 2026-03-15T22:20:40.206Z + 2026-04-24T19:36:11.774Z weekly 0.8 diff --git a/frontend/src/components/report/LayerModal.jsx b/frontend/src/components/report/LayerModal.jsx index dea91be8..58ebba68 100644 --- a/frontend/src/components/report/LayerModal.jsx +++ b/frontend/src/components/report/LayerModal.jsx @@ -9,28 +9,52 @@ import { CheckCircle, AlertCircle, Info } from 'lucide-react'; import './LayerModal.scss'; const FACTOR_HUMAN = { - SAST: { label: 'Code Safety', category: 'code', desc: 'Scans source code for known vulnerability patterns' }, - VirusTotal: { label: 'Malware Scan', category: 'threat', desc: 'Checks against 70+ antivirus engines for malicious code' }, - Obfuscation: { label: 'Hidden Code', category: 'code', desc: 'Detects deliberately obscured or unreadable code' }, - Manifest: { label: 'Extension Config', category: 'code', desc: 'Validates security settings in the extension manifest' }, - ChromeStats: { label: 'Threat Intel', category: 'threat', desc: 'Cross-references known threat databases' }, - Webstore: { label: 'Store Reputation', category: 'trust', desc: 'Chrome Web Store ratings and user reviews' }, - Maintenance: { label: 'Update Freshness', category: 'trust', desc: 'How recently the extension was updated by its developer' }, - PermissionsBaseline: { label: 'Permission Risk', category: 'access', desc: 'Evaluates the sensitivity of requested browser permissions' }, - PermissionCombos: { label: 'Dangerous Combos', category: 'access', desc: 'Flags risky combinations of permissions that enable data theft' }, - NetworkExfil: { label: 'Data Sharing', category: 'data', desc: 'Detects if data is sent to external servers' }, - CaptureSignals: { label: 'Screen Capture', category: 'data', desc: 'Checks for screen or tab recording capabilities' }, - ToSViolations: { label: 'Policy Violations', category: 'policy', desc: 'Checks compliance with Chrome Web Store policies' }, - Consistency: { label: 'Behavior Match', category: 'policy', desc: 'Compares stated purpose vs actual behavior' }, - DisclosureAlignment: { label: 'Disclosure Accuracy', category: 'policy', desc: 'Validates privacy policy against actual data collection' }, + SAST: { label: 'Code Safety', category: 'code', desc: 'Scans source code for known vulnerability patterns' }, + VirusTotal: { label: 'Malware Scan', category: 'threat', desc: 'Checks against 70+ antivirus engines for malicious code' }, + Obfuscation: { label: 'Hidden Code', category: 'code', desc: 'Detects deliberately obscured or unreadable code' }, + Manifest: { label: 'Extension Config', category: 'code', desc: 'Validates security settings in the extension manifest' }, + ChromeStats: { label: 'Threat Intel', category: 'threat', desc: 'Cross-references known threat databases' }, + Webstore: { label: 'Store Reputation', category: 'trust', desc: 'Chrome Web Store ratings and user reviews' }, + Maintenance: { label: 'Update Freshness', category: 'trust', desc: 'How recently the extension was updated by its developer' }, + PermissionsBaseline: { label: 'Permission Risk', category: 'access', desc: 'Evaluates the sensitivity of requested browser permissions' }, + PermissionCombos: { label: 'Dangerous Combos', category: 'access', desc: 'Flags risky combinations of permissions that enable data theft' }, + NetworkExfil: { label: 'Data Sharing', category: 'data', desc: 'Detects if data is sent to external servers' }, + CaptureSignals: { label: 'Screen Capture', category: 'data', desc: 'Checks for screen or tab recording capabilities' }, + ToSViolations: { label: 'Policy Violations', category: 'policy', desc: 'Checks compliance with Chrome Web Store policies' }, + Consistency: { label: 'Behavior Match', category: 'policy', desc: 'Compares stated purpose vs actual behavior' }, + DisclosureAlignment: { label: 'Disclosure Accuracy', category: 'policy', desc: 'Validates privacy policy against actual data collection' }, +}; + +const PERMISSION_RISKS = { + tabs: 'Can read browsing activity', + webRequest: 'Can intercept and modify traffic (high risk)', + webRequestBlocking: 'Can block and modify network requests (high risk)', + cookies: 'Can read and modify site cookies', + history: 'Can read full browsing history', + clipboardRead: 'Can read copied text from clipboard', + clipboardWrite: 'Can modify clipboard contents', + desktopCapture: 'Can record your screen', + tabCapture: 'Can record browser tabs', + nativeMessaging: 'Can communicate with desktop apps', + proxy: 'Can route all traffic through external servers', + debugger: 'Can bypass security and monitor page internals', + management: 'Can disable or uninstall other extensions', + geolocation: 'Can access physical location', + bookmarks: 'Can read and modify bookmarks', + '': 'Can access data on all websites you visit', + '*://*/*': 'Can access data on all websites you visit', + 'http://*/*': 'Can access data on all HTTP websites', + 'https://*/*': 'Can access data on all HTTPS websites', + activeTab: 'Can access the current active tab', + storage: 'Can store data locally', }; const CATEGORY_LABELS = { - code: 'Code Checks', + code: 'Code Checks', threat: 'Threat Detection', - trust: 'Trust Signals', + trust: 'Trust Signals', access: 'Permissions', - data: 'Data Handling', + data: 'Data Handling', policy: 'Policies', }; @@ -83,8 +107,8 @@ function bandLabel(band) { switch (band) { case 'GOOD': return 'Safe'; case 'WARN': return 'Needs Review'; - case 'BAD': return 'Not Safe'; - default: return ''; + case 'BAD': return 'Not Safe'; + default: return ''; } } @@ -152,9 +176,44 @@ const LayerModal = ({ style={{ animationDelay: `${(catIdx * 40 + (idx + 1) * 25)}ms` }} role="listitem" > -
- {item.label} - {item.desc && } +
+
+ {item.label} + {item.desc && } +
+ + {/* Permission Risk Explanation Engine */} + {item.raw?.name === 'PermissionsBaseline' && item.raw?.details?.high_risk_permissions?.length > 0 && ( +
+ {item.raw.details.high_risk_permissions.map(perm => ( +
+ {perm} + + {PERMISSION_RISKS[perm] || `Has access to ${perm}`} +
+ ))} +
+ )} + + {/* Dangerous Combos Explanation Engine */} + {item.raw?.name === 'PermissionCombos' && item.raw?.details?.triggered_combos?.length > 0 && ( +
+ {item.raw.details.triggered_combos.map(combo => { + const isBroad = combo === 'broad_host_access'; + const comboName = isBroad ? 'Broad Host Access' : combo.split('+').join(' + '); + const comboDesc = isBroad + ? 'Can access and modify data on all websites' + : 'High risk when these are used together'; + return ( +
+ {comboName} + + {comboDesc} +
+ ) + })} +
+ )}
{item.statusType === 'clear' ? ( diff --git a/railway.toml b/railway.toml deleted file mode 100644 index 4e57ab17..00000000 --- a/railway.toml +++ /dev/null @@ -1,62 +0,0 @@ -# Railway Configuration for ExtensionShield -# https://docs.railway.app/reference/config-as-code - -[build] -# Use the existing Dockerfile for building -builder = "dockerfile" -dockerfilePath = "Dockerfile" - -# Railway automatically passes environment variables as build arguments -# if they match ARG names in the Dockerfile. Make sure these are set in -# Railway dashboard as SERVICE variables (not shared variables): -# VITE_SUPABASE_URL - Frontend build-time: Supabase project URL -# VITE_SUPABASE_ANON_KEY - Frontend build-time: Supabase anon key -# VITE_API_BASE_URL - Optional: Custom API base URL -# -# IMPORTANT: These MUST be set in Railway dashboard BEFORE building. -# Railway will pass them as Docker build arguments automatically. -# If these are missing, the frontend will be built without Supabase config -# and you'll see "Supabase is not configured" error in production. - -[deploy] -# Number of replicas (Railway handles scaling) -numReplicas = 1 - -# Health check configuration -healthcheckPath = "/health" -healthcheckTimeout = 120 -healthcheckInterval = 10 - -# Start command timeout - give more time for Python/UV to initialize -startCommand = "" - -# Restart policy -restartPolicyType = "on_failure" -restartPolicyMaxRetries = 1 - -# Resource limits (optional - adjust based on your plan) -# memory = "1GB" -# cpu = 1 - -[env] -# Default environment variables -# Secrets should be set in Railway dashboard, not here -# Note: Do NOT set PORT here - Railway will inject it automatically -PYTHONDONTWRITEBYTECODE = "1" -PYTHONUNBUFFERED = "1" -LLM_PROVIDER = "openai" -EXTENSION_STORAGE_PATH = "/app/extensions_storage" -EXTSHIELD_MODE = "cloud" - -[static] -# Not used since we serve static files via FastAPI -disabled = true - -# ============================================================================= -# CLI Deployment Shortcuts -# ============================================================================= -# Quick deploy: railway up OR make deploy OR ./scripts/deploy.sh -# Deploy detach: railway up --detach -# Setup: railway login && railway link -# Logs: railway status && railway logs -f -# ============================================================================= diff --git a/render.yaml b/render.yaml new file mode 100644 index 00000000..b5237494 --- /dev/null +++ b/render.yaml @@ -0,0 +1,30 @@ +services: + - type: web + name: extension-shield + runtime: docker + plan: starter # Recommend starter ($7/mo) for stability, or 'free' for testing + region: oregon + envVars: + - key: PORT + value: 10000 # Render default, or matches your EXPOSE + - key: EXTSHIELD_MODE + value: cloud + - key: LLM_PROVIDER + value: openai + - key: OPENAI_API_KEY + sync: false + - key: SUPABASE_URL + sync: false + - key: SUPABASE_ANON_KEY + sync: false + - key: SUPABASE_SERVICE_ROLE_KEY + sync: false + - key: CORS_ORIGINS + value: "*" # Set specifically after you know your Render URL + - key: VITE_SUPABASE_URL + sync: false + - key: VITE_SUPABASE_ANON_KEY + sync: false + dockerContext: . + dockerfilePath: Dockerfile + healthCheckPath: /health