diff --git a/docker/frontend.Dockerfile b/docker/frontend.Dockerfile index 36765be..68f7a64 100644 --- a/docker/frontend.Dockerfile +++ b/docker/frontend.Dockerfile @@ -17,9 +17,6 @@ CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0", "--port", "3000"] # Builder stage for production FROM node:lts-alpine AS builder -# Install build dependencies for canvas -RUN apk add --no-cache python3 make g++ pkgconfig cairo-dev jpeg-dev pango-dev giflib-dev - WORKDIR /app/frontend COPY frontend/package*.json ./ @@ -27,8 +24,8 @@ COPY frontend/package*.json ./ RUN echo "=== Starting npm install ===" &&\ npm cache clean --force &&\ rm -rf node_modules ~/.npm /root/.npm &&\ - echo "=== npm install with verbose logging ===" &&\ - npm install --legacy-peer-deps --no-audit --prefer-online --fetch-retries=3 --fetch-retry-mintimeout=20000 --fetch-retry-maxtimeout=120000 --loglevel=verbose &&\ + echo "=== npm install ===" &&\ + npm install --ignore-scripts --legacy-peer-deps --no-audit --prefer-online --fetch-retries=3 --fetch-retry-mintimeout=20000 --fetch-retry-maxtimeout=120000 &&\ echo "=== npm install completed ===" &&\ npm cache clean --force @@ -36,24 +33,9 @@ COPY frontend/ ./ RUN npm run build -# Production stage - use temporary stage to install packages as root, then copy to unprivileged -FROM nginx:alpine AS runtime-builder - -# Install runtime dependencies for canvas -RUN apk add --no-cache cairo pango jpeg libpng giflib - -# Final production stage - unprivileged +# Production stage FROM nginxinc/nginx-unprivileged:alpine -# Copy runtime libraries from runtime-builder -COPY --from=runtime-builder /usr/lib/libcairo.so.2 /usr/lib/ -COPY --from=runtime-builder /usr/lib/libpango-1.0.so.0 /usr/lib/ -COPY --from=runtime-builder /usr/lib/libpangocairo-1.0.so.0 /usr/lib/ -COPY --from=runtime-builder /usr/lib/libpangoft2-1.0.so.0 /usr/lib/ -COPY --from=runtime-builder /usr/lib/libpng16.so.16 /usr/lib/ -COPY --from=runtime-builder /usr/lib/libgif.so.7 /usr/lib/ -COPY --from=runtime-builder /usr/lib/libjpeg.so.8 /usr/lib/ - ENV BACKEND_HOST=backend \ BACKEND_PORT=3001 diff --git a/frontend/package.json b/frontend/package.json index fc4443e..1feada8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -27,8 +27,7 @@ "react-chartjs-2": "^5.2.0", "react-dom": "^18.3.1", "react-icons": "^5.5.0", - "react-router-dom": "^6.30.1", - "trianglify": "^4.1.1" + "react-router-dom": "^6.30.1" }, "devDependencies": { "@types/react": "^18.3.14", diff --git a/frontend/src/components/Layout.jsx b/frontend/src/components/Layout.jsx index 1e800e8..50b9d0e 100644 --- a/frontend/src/components/Layout.jsx +++ b/frontend/src/components/Layout.jsx @@ -28,7 +28,6 @@ import { import { useCallback, useEffect, useRef, useState } from "react"; import { FaReddit, FaYoutube } from "react-icons/fa"; import { Link, useLocation, useNavigate } from "react-router-dom"; -import trianglify from "trianglify"; import { useAuth } from "../contexts/AuthContext"; import { useColorTheme } from "../contexts/ColorThemeContext"; import { useUpdateNotification } from "../contexts/UpdateNotificationContext"; @@ -237,51 +236,73 @@ const Layout = ({ children }) => { navigate("/hosts?action=add"); }; - // Generate Trianglify background for dark mode + // Generate geometric background pattern for dark mode useEffect(() => { const generateBackground = () => { - try { - if ( - bgCanvasRef.current && - themeConfig?.login && - document.documentElement.classList.contains("dark") - ) { - // Get current date as seed for daily variation - const today = new Date(); - const dateSeed = `${today.getFullYear()}-${today.getMonth()}-${today.getDate()}`; + if ( + !bgCanvasRef.current || + !themeConfig?.login || + !document.documentElement.classList.contains("dark") + ) { + return; + } - // Generate pattern with selected theme configuration - const pattern = trianglify({ - width: window.innerWidth, - height: window.innerHeight, - cellSize: themeConfig.login.cellSize, - variance: themeConfig.login.variance, - seed: dateSeed, - xColors: themeConfig.login.xColors, - yColors: themeConfig.login.yColors, - }); + const canvas = bgCanvasRef.current; + canvas.width = window.innerWidth; + canvas.height = window.innerHeight; + const ctx = canvas.getContext("2d"); - // Render to canvas using SVG (browser-compatible) - const svg = pattern.toSVG(); - const ctx = bgCanvasRef.current.getContext("2d"); - const img = new Image(); - const blob = new Blob([svg], { type: "image/svg+xml" }); - const url = URL.createObjectURL(blob); - img.onload = () => { - ctx.drawImage( - img, - 0, - 0, - bgCanvasRef.current.width, - bgCanvasRef.current.height, - ); - URL.revokeObjectURL(url); - }; - img.src = url; + // Get theme colors + const xColors = themeConfig.login.xColors || [ + "#667eea", + "#764ba2", + "#f093fb", + "#4facfe", + ]; + const yColors = themeConfig.login.yColors || [ + "#667eea", + "#764ba2", + "#f093fb", + "#4facfe", + ]; + + // Use date for daily variation + const today = new Date(); + const seed = + today.getFullYear() * 10000 + today.getMonth() * 100 + today.getDate(); + + // Simple seeded random + const random = (s) => { + const x = Math.sin(s) * 10000; + return x - Math.floor(x); + }; + + // Draw gradient mesh + const cellSize = themeConfig.login.cellSize || 75; + const cols = Math.ceil(canvas.width / cellSize) + 1; + const rows = Math.ceil(canvas.height / cellSize) + 1; + + for (let y = 0; y < rows; y++) { + for (let x = 0; x < cols; x++) { + const idx = y * cols + x; + const color1 = + xColors[Math.floor(random(seed + idx) * xColors.length)]; + const color2 = + yColors[Math.floor(random(seed + idx + 1000) * yColors.length)]; + + // Create gradient + const gradient = ctx.createLinearGradient( + x * cellSize, + y * cellSize, + (x + 1) * cellSize, + (y + 1) * cellSize, + ); + gradient.addColorStop(0, color1); + gradient.addColorStop(1, color2); + + ctx.fillStyle = gradient; + ctx.fillRect(x * cellSize, y * cellSize, cellSize, cellSize); } - } catch (error) { - // Canvas/trianglify not available, skip background generation - console.warn("Could not generate Trianglify background:", error); } }; diff --git a/frontend/src/pages/Login.jsx b/frontend/src/pages/Login.jsx index 00705a1..83b52b5 100644 --- a/frontend/src/pages/Login.jsx +++ b/frontend/src/pages/Login.jsx @@ -17,7 +17,6 @@ import { useEffect, useId, useRef, useState } from "react"; import { FaReddit, FaYoutube } from "react-icons/fa"; import { useNavigate } from "react-router-dom"; -import trianglify from "trianglify"; import DiscordIcon from "../components/DiscordIcon"; import { useAuth } from "../contexts/AuthContext"; import { useColorTheme } from "../contexts/ColorThemeContext"; @@ -57,47 +56,67 @@ const Login = () => { const navigate = useNavigate(); - // Generate Trianglify background based on selected theme + // Generate geometric background pattern based on selected theme useEffect(() => { const generateBackground = () => { - try { - if (canvasRef.current && themeConfig?.login) { - // Get current date as seed for daily variation - const today = new Date(); - const dateSeed = `${today.getFullYear()}-${today.getMonth()}-${today.getDate()}`; + if (!canvasRef.current || !themeConfig?.login) return; - // Generate pattern with selected theme configuration - const pattern = trianglify({ - width: canvasRef.current.offsetWidth, - height: canvasRef.current.offsetHeight, - cellSize: themeConfig.login.cellSize, - variance: themeConfig.login.variance, - seed: dateSeed, - xColors: themeConfig.login.xColors, - yColors: themeConfig.login.yColors, - }); + const canvas = canvasRef.current; + canvas.width = canvas.offsetWidth; + canvas.height = canvas.offsetHeight; + const ctx = canvas.getContext("2d"); - // Render to canvas using SVG (browser-compatible) - const svg = pattern.toSVG(); - const ctx = canvasRef.current.getContext("2d"); - const img = new Image(); - const blob = new Blob([svg], { type: "image/svg+xml" }); - const url = URL.createObjectURL(blob); - img.onload = () => { - ctx.drawImage( - img, - 0, - 0, - canvasRef.current.width, - canvasRef.current.height, - ); - URL.revokeObjectURL(url); - }; - img.src = url; + // Get theme colors + const xColors = themeConfig.login.xColors || [ + "#667eea", + "#764ba2", + "#f093fb", + "#4facfe", + ]; + const yColors = themeConfig.login.yColors || [ + "#667eea", + "#764ba2", + "#f093fb", + "#4facfe", + ]; + + // Use date for daily variation + const today = new Date(); + const seed = + today.getFullYear() * 10000 + today.getMonth() * 100 + today.getDate(); + + // Simple seeded random + const random = (s) => { + const x = Math.sin(s) * 10000; + return x - Math.floor(x); + }; + + // Draw gradient mesh + const cellSize = themeConfig.login.cellSize || 75; + const cols = Math.ceil(canvas.width / cellSize) + 1; + const rows = Math.ceil(canvas.height / cellSize) + 1; + + for (let y = 0; y < rows; y++) { + for (let x = 0; x < cols; x++) { + const idx = y * cols + x; + const color1 = + xColors[Math.floor(random(seed + idx) * xColors.length)]; + const color2 = + yColors[Math.floor(random(seed + idx + 1000) * yColors.length)]; + + // Create gradient + const gradient = ctx.createLinearGradient( + x * cellSize, + y * cellSize, + (x + 1) * cellSize, + (y + 1) * cellSize, + ); + gradient.addColorStop(0, color1); + gradient.addColorStop(1, color2); + + ctx.fillStyle = gradient; + ctx.fillRect(x * cellSize, y * cellSize, cellSize, cellSize); } - } catch (error) { - // Canvas/trianglify not available, skip background generation - console.warn("Could not generate Trianglify background:", error); } }; @@ -110,7 +129,7 @@ const Login = () => { window.addEventListener("resize", handleResize); return () => window.removeEventListener("resize", handleResize); - }, [themeConfig]); // Regenerate when theme changes + }, [themeConfig]); // Check if signup is enabled useEffect(() => { diff --git a/package-lock.json b/package-lock.json index 8067f65..fb91b82 100644 --- a/package-lock.json +++ b/package-lock.json @@ -78,8 +78,7 @@ "react-chartjs-2": "^5.2.0", "react-dom": "^18.3.1", "react-icons": "^5.5.0", - "react-router-dom": "^6.30.1", - "trianglify": "^4.1.1" + "react-router-dom": "^6.30.1" }, "devDependencies": { "@types/react": "^18.3.14", @@ -642,34 +641,6 @@ "version": "0.3.4", "license": "MIT" }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.7.3", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { "version": "3.0.3", "cpu": [ @@ -962,10 +933,6 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "license": "ISC" - }, "node_modules/accepts": { "version": "1.3.8", "license": "MIT", @@ -977,16 +944,6 @@ "node": ">= 0.6" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "license": "MIT", @@ -1024,21 +981,6 @@ "node": ">= 8" } }, - "node_modules/aproba": { - "version": "2.1.0", - "license": "ISC" - }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/arg": { "version": "5.0.2", "dev": true, @@ -1167,6 +1109,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.12", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -1361,19 +1304,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/canvas": { - "version": "2.11.2", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.17.0", - "simple-get": "^3.0.3" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -1433,17 +1363,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "2.0.0", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/chroma-js": { - "version": "2.6.0", - "license": "(BSD-3-Clause AND Apache-2.0)" - }, "node_modules/citty": { "version": "0.1.6", "devOptional": true, @@ -1509,13 +1428,6 @@ "simple-swizzle": "^0.2.2" } }, - "node_modules/color-support": { - "version": "1.1.3", - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/color/node_modules/color-convert": { "version": "1.9.3", "license": "MIT", @@ -1555,6 +1467,7 @@ }, "node_modules/concat-map": { "version": "0.0.1", + "dev": true, "license": "MIT" }, "node_modules/concurrently": { @@ -1596,10 +1509,6 @@ "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "license": "ISC" - }, "node_modules/content-disposition": { "version": "0.5.4", "license": "MIT", @@ -1738,16 +1647,6 @@ "node": ">=0.10.0" } }, - "node_modules/decompress-response": { - "version": "4.2.1", - "license": "MIT", - "dependencies": { - "mimic-response": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/deepmerge-ts": { "version": "7.1.5", "devOptional": true, @@ -1761,10 +1660,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/delaunator": { - "version": "4.0.1", - "license": "ISC" - }, "node_modules/delayed-stream": { "version": "1.0.0", "license": "MIT", @@ -1772,10 +1667,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "license": "MIT" - }, "node_modules/denque": { "version": "2.1.0", "license": "Apache-2.0", @@ -1806,6 +1697,7 @@ "node_modules/detect-libc": { "version": "2.1.2", "license": "Apache-2.0", + "optional": true, "engines": { "node": ">=8" } @@ -2293,34 +2185,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, "node_modules/function-bind": { "version": "1.1.2", "license": "MIT", @@ -2328,28 +2192,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "dev": true, @@ -2507,10 +2349,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "license": "ISC" - }, "node_modules/hasown": { "version": "2.0.2", "license": "MIT", @@ -2569,17 +2407,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "license": "MIT", @@ -2595,14 +2422,6 @@ "dev": true, "license": "ISC" }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "license": "ISC" @@ -2978,19 +2797,6 @@ "node": ">=12" } }, - "node_modules/make-dir": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "license": "MIT", @@ -3065,18 +2871,9 @@ "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimatch": { "version": "3.1.2", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -3093,41 +2890,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/moment": { "version": "2.30.1", "license": "MIT", @@ -3176,10 +2938,6 @@ "thenify-all": "^1.0.0" } }, - "node_modules/nan": { - "version": "2.23.0", - "license": "MIT" - }, "node_modules/nanoid": { "version": "3.3.11", "dev": true, @@ -3208,24 +2966,6 @@ "version": "3.1.1", "license": "MIT" }, - "node_modules/node-fetch": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, "node_modules/node-fetch-native": { "version": "1.6.7", "devOptional": true, @@ -3306,19 +3046,6 @@ "node": ">=4" } }, - "node_modules/nopt": { - "version": "5.0.0", - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "dev": true, @@ -3335,16 +3062,6 @@ "node": ">=0.10.0" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/nypm": { "version": "0.6.2", "devOptional": true, @@ -3403,13 +3120,6 @@ "node": ">= 0.8" } }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, "node_modules/one-time": { "version": "1.0.0", "license": "MIT", @@ -3474,13 +3184,6 @@ "node": ">=8" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "dev": true, @@ -4078,37 +3781,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.52.3", "dev": true, @@ -4217,6 +3889,7 @@ }, "node_modules/semver": { "version": "6.3.1", + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -4388,33 +4061,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/simple-concat": { - "version": "1.0.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/simple-get": { - "version": "3.1.1", - "license": "MIT", - "dependencies": { - "decompress-response": "^4.2.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, "node_modules/simple-swizzle": { "version": "0.2.4", "license": "MIT", @@ -4640,32 +4286,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/tar": { - "version": "6.2.1", - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, "node_modules/text-hex": { "version": "1.0.0", "license": "MIT" @@ -4761,10 +4381,6 @@ "nodetouch": "bin/nodetouch.js" } }, - "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, "node_modules/tree-kill": { "version": "1.2.2", "dev": true, @@ -4773,15 +4389,6 @@ "tree-kill": "cli.js" } }, - "node_modules/trianglify": { - "version": "4.1.1", - "license": "GPL-3.0", - "dependencies": { - "canvas": "^2.6.1", - "chroma-js": "^2.1.0", - "delaunator": "^4.0.1" - } - }, "node_modules/triple-beam": { "version": "1.4.1", "license": "MIT", @@ -4990,18 +4597,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "dev": true, @@ -5020,13 +4615,6 @@ "version": "2.0.1", "license": "ISC" }, - "node_modules/wide-align": { - "version": "1.1.5", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, "node_modules/winston": { "version": "3.17.0", "license": "MIT", @@ -5092,10 +4680,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, "node_modules/ws": { "version": "8.18.3", "license": "MIT",