mirror of
https://github.com/netbirdio/dashboard.git
synced 2026-09-23 00:30:43 -07:00
* chore: upgrade to Next.js 16.3 Turbopack is now the default for both `next dev` and `next build`, so the separate `turbo` script is redundant and has been dropped. `next build` rewrites tsconfig `moduleResolution` to "bundler", which Next 16 expects. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * chore: migrate ESLint to flat config `next lint` was removed in Next 16, so `npm run lint` had been failing with "Invalid project directory provided, no such directory: ./lint" since that upgrade. eslint-config-next 16 also ships flat config only, which the old .eslintrc.json could not consume. Ignores .claude/ so stray worktree copies of the repo are not linted. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: replace ip-cidr with ip-address to clear CVE advisories ip-cidr pulled a vulnerable ip-address (GHSA-mwp4-54f8-5fhr, high: leading-zero octets decoded as decimal while resolvers read them as octal, enabling SSRF; GHSA-v2v4-37r5-5v8g, moderate: XSS in Address6 HTML methods). npm reported "no fix available" because even the latest ip-cidr pins ip-address ^9.0.5, still inside the vulnerable range. ip-address 10.x was already a direct dependency and covers every use: its isValid rejects leading-zero octets and validates mask ranges natively, and isInSubnet replaces the one `new cidr().contains()` call site. The new validators were differential-tested against the real ip-cidr over a 67-input corpus (134 checks) before removal, with no divergences; containment was checked across 14 v4/v6/boundary/cross-family cases. `npm audit` now reports 0 vulnerabilities. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * refactor: replace next-themes with an in-repo ThemeProvider next-themes renders an inline <script> to set the theme before paint. It was loaded through dynamic(ssr: false), so that script rendered on the client, where React 19 never executes script tags and warns: Encountered a script tag while rendering React component. Upgrading would not have helped; 0.4.6 still renders the script unconditionally. The script was also useless here: injected after hydration, it could not prevent a flash, and postbuild.js hoists inline scripts out of the export anyway. The replacement keeps the same `netbird-theme` storage key and three-mode support, and sets the theme class on <html> in the layout instead, so the static export ships the correct theme in its first byte with no script at all. Dropping the dynamic(ssr: false) wrapper removed an implicit prerender bailout for the whole provider tree, which exposed isNetBirdCloud() reading window.location during the build-time render; it is now guarded. The exported HTML is byte-identical either way, since the page already bails to client rendering. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: key the router children slot in the dashboard layout React logged "Each child in a list should have a unique key prop. Check the render method of DashboardPageContent." The App Router's segment element for `children` arrives with a null key, which React flags once it is reconciled alongside the Navigation sibling. Wrapping it in a keyed Fragment resolves it. Verified in the browser both ways: with the Fragment the console is clean, without it the warning returns. Also applies the pending simple-import-sort fix for this file. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: match IPv4-mapped IPv6 hosts against IPv4 CIDRs Regression from replacing ip-cidr. Its contains() normalised an IPv4-mapped IPv6 address to the embedded v4 before the subnet check, so contains("::ffff:10.0.0.5") on 10.0.0.0/24 returned true; isHostInCIDR returned false. Verified against ip-cidr@3.1.0 directly. This is reachable: isValidIP accepts "::ffff:10.0.0.5", so a mapped host entered in ReverseProxyAddressInput against an IPv4 resource CIDR was wrongly rejected. An IPv6 network still rejects a mapped host, so families do not leak. Checked across 20 cases (6 mapped-host, 14 pre-existing), with the mapped expectations taken from measured ip-cidr output. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * fix: derive skeleton colors from the resolved theme SkeletonTheme had the dark palette hardcoded, so a light theme would render dark skeletons. The light values are the ones already defined on the feature-light-theme branch rather than new invented colors. resolvedTheme is tracked in state and updated from the existing apply(), so the palette also follows the OS preference under "system". Latent today, since DarkModeToggle disables both Light and System. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
113 lines
3.6 KiB
JSON
113 lines
3.6 KiB
JSON
{
|
|
"name": "netbird-dashboard",
|
|
"version": "2.0.0",
|
|
"private": true,
|
|
"engines": {
|
|
"node": ">=20.9.0"
|
|
},
|
|
"scripts": {
|
|
"copy": "copyfiles -f ./node_modules/@axa-fr/react-oidc/dist/OidcServiceWorker.js ./public",
|
|
"copytrusted": "copyfiles -f ./public/local/OidcTrustedDomains.js ./public",
|
|
"dev": "next dev -p 3000",
|
|
"build": "next build",
|
|
"postbuild": "node postbuild.js",
|
|
"start": "next start",
|
|
"lint": "eslint .",
|
|
"test:setup": "cd ./e2e/environment && sh create-test-env.sh",
|
|
"test:clean": "cd ./e2e/environment && sh clean-test-env.sh",
|
|
"test:dev": "cross-env APP_ENV=test next dev -p 1337",
|
|
"test": "npx playwright test --config=e2e/playwright.config.ts",
|
|
"test:ui": "npx playwright test --config=e2e/playwright.config.ts --ui",
|
|
"test:ci": "cross-env APP_ENV=test next build && npx playwright test --config=e2e/playwright.config.ts"
|
|
},
|
|
"dependencies": {
|
|
"@axa-fr/react-oidc": "^7.26.3",
|
|
"@dagrejs/dagre": "^1.1.5",
|
|
"@radix-ui/react-accordion": "^1.2.12",
|
|
"@radix-ui/react-checkbox": "^1.3.3",
|
|
"@radix-ui/react-collapsible": "^1.1.12",
|
|
"@radix-ui/react-dialog": "^1.1.15",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
"@radix-ui/react-hover-card": "^1.1.15",
|
|
"@radix-ui/react-label": "^2.1.8",
|
|
"@radix-ui/react-popover": "^1.1.15",
|
|
"@radix-ui/react-radio-group": "^1.3.8",
|
|
"@radix-ui/react-scroll-area": "^1.2.10",
|
|
"@radix-ui/react-select": "^2.2.6",
|
|
"@radix-ui/react-slider": "^1.3.6",
|
|
"@radix-ui/react-slot": "^1.2.4",
|
|
"@radix-ui/react-switch": "^1.2.6",
|
|
"@radix-ui/react-tabs": "^1.1.13",
|
|
"@radix-ui/react-toast": "^1.2.15",
|
|
"@radix-ui/react-tooltip": "^1.2.8",
|
|
"@tabler/icons-react": "^3.36.1",
|
|
"@tanstack/match-sorter-utils": "^8.8.4",
|
|
"@tanstack/react-table": "^8.10.7",
|
|
"@types/crypto-js": "^4.2.2",
|
|
"@types/d3": "^7.4.3",
|
|
"@types/lodash": "4.17.24",
|
|
"@types/node": "20.10.6",
|
|
"@types/react": "^19",
|
|
"@types/react-dom": "^19",
|
|
"@types/react-window": "^1.8.8",
|
|
"@xterm/addon-fit": "^0.10.0",
|
|
"@xterm/xterm": "^5.5.0",
|
|
"@xyflow/react": "^12.8.4",
|
|
"autoprefixer": "^10",
|
|
"chart.js": "^4.4.8",
|
|
"chroma-js": "^3.1.2",
|
|
"class-variance-authority": "^0.7.0",
|
|
"classnames": "^2.5.1",
|
|
"clsx": "^2.0.0",
|
|
"cmdk": "^1.1.1",
|
|
"cross-env": "^7.0.3",
|
|
"crypto-js": "^4.2.0",
|
|
"d3": "^7.9.0",
|
|
"date-fns": "^2.30.0",
|
|
"dayjs": "^1.11.10",
|
|
"elkjs": "^0.10.0",
|
|
"eslint-config-prettier": "^9.0.0",
|
|
"eslint-plugin-simple-import-sort": "^10.0.0",
|
|
"framer-motion": "^12.29.2",
|
|
"ip-address": "^10.2.0",
|
|
"js-cookie": "^3.0.7",
|
|
"lodash": "4.18.1",
|
|
"lucide-react": "^0.566.0",
|
|
"next": "16.3.0",
|
|
"punycode": "^2.3.1",
|
|
"react": "^19.2.4",
|
|
"react-chartjs-2": "^5.3.0",
|
|
"react-confetti-explosion": "^3.0.3",
|
|
"react-day-picker": "^9.13.0",
|
|
"react-dom": "^19.2.4",
|
|
"react-ga4": "^2.1.0",
|
|
"react-hotjar": "^6.3.1",
|
|
"react-hotkeys-hook": "^4.4.1",
|
|
"react-icons": "^5.5.0",
|
|
"react-jwt": "^1.2.0",
|
|
"react-loading-skeleton": "^3.3.1",
|
|
"react-responsive": "^9.0.2",
|
|
"react-virtuoso": "^4.9.0",
|
|
"sonner": "^2.0.7",
|
|
"swr": "^2.2.4",
|
|
"tailwind-merge": "^1.14.0",
|
|
"tailwindcss-animate": "^1.0.7",
|
|
"timescape": "^0.7.1",
|
|
"typescript": "^5"
|
|
},
|
|
"overrides": {
|
|
"minimatch": ">=10.2.1"
|
|
},
|
|
"devDependencies": {
|
|
"@faker-js/faker": "^9.5.1",
|
|
"@playwright/test": "^1.52.0",
|
|
"@types/chroma-js": "^3.1.1",
|
|
"@types/js-cookie": "^3.0.6",
|
|
"eslint": "^9.39.1",
|
|
"eslint-config-next": "^16.3.0",
|
|
"postcss": "^8",
|
|
"prettier": "3.0.3",
|
|
"tailwindcss": "^3.4.17"
|
|
}
|
|
}
|