Users in HUB_DATA/users.json with scrypt hashes and roles (viewer, operator, apps-admin, admin), managed by hub/users-cli.ts; HUB_USER/HUB_PASSWORD remain a bootstrap admin while the file does not exist. Five failed logins in 15 minutes lock the address or the name for 15 minutes. Logins, logouts and every refused request go to a JSON Lines audit log that admins read through hub/audit/list. Endpoints are listed in routes.ts with their kind and capability; writes stay refused for now. Optional <ID>_ADMIN_TOKEN is read for the coming write stages. The management plan is in docs/hub-management-plan.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
68 lines
2.1 KiB
JSON
68 lines
2.1 KiB
JSON
{
|
|
"name": "technitium-console",
|
|
"private": true,
|
|
"version": "1.3.4",
|
|
"technitiumServerMinimum": "15.5",
|
|
"description": "An alternative administration console for Technitium DNS Server",
|
|
"license": "GPL-3.0-or-later",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"mock": "node dev/mock-api.mjs",
|
|
"hub": "node --experimental-strip-types hub/server.ts",
|
|
"hub:user": "node --experimental-strip-types hub/users-cli.ts",
|
|
"build": "tsc -b && vite build",
|
|
"lint": "oxlint",
|
|
"lint:language": "node dev/check-language.mjs",
|
|
"lint:colours": "node dev/check-colour-tokens.mjs",
|
|
"lint:dashes": "node dev/check-dashes.mjs",
|
|
"lint:breaks": "node dev/check-word-breaks.mjs",
|
|
"typecheck": "tsc -b --force",
|
|
"preview": "vite preview",
|
|
"build:check": "vite build --mode check",
|
|
"test": "vitest run",
|
|
"test:watch": "vitest"
|
|
},
|
|
"dependencies": {
|
|
"@base-ui/react": "^1.9.0",
|
|
"@dnd-kit/core": "^6.3.1",
|
|
"@dnd-kit/modifiers": "^9.0.0",
|
|
"@dnd-kit/sortable": "^10.0.0",
|
|
"@dnd-kit/utilities": "^3.2.2",
|
|
"@fontsource-variable/geist": "^5.3.0",
|
|
"@fontsource-variable/geist-mono": "^5.3.0",
|
|
"@tailwindcss/vite": "^4.3.3",
|
|
"@tanstack/react-table": "^9.3.1",
|
|
"@tanstack/react-virtual": "^3.14.22",
|
|
"chart.js": "^4.5.1",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"cmdk": "^1.1.1",
|
|
"cn": "^0.5.0",
|
|
"date-fns": "^4.4.0",
|
|
"lucide-react": "^1.61.0",
|
|
"next-themes": "^0.4.6",
|
|
"react": "^19.2.8",
|
|
"react-dom": "^19.2.8",
|
|
"sonner": "^2.0.8",
|
|
"tailwind-merge": "^3.7.0",
|
|
"tailwindcss": "^4.3.3",
|
|
"tw-animate-css": "^1.4.0"
|
|
},
|
|
"devDependencies": {
|
|
"@testing-library/jest-dom": "^7.0.1",
|
|
"@testing-library/react": "^16.3.2",
|
|
"@testing-library/user-event": "^14.6.6",
|
|
"@types/node": "^24.13.3",
|
|
"@types/react": "^19.2.18",
|
|
"@types/react-dom": "^19.2.4",
|
|
"@vitejs/plugin-react": "^6.1.0",
|
|
"@vitest/coverage-v8": "^4.1.11",
|
|
"jsdom": "^30.0.1",
|
|
"oxlint": "^1.79.0",
|
|
"typescript": "~6.0.2",
|
|
"vite": "^8.2.2",
|
|
"vitest": "^4.1.11"
|
|
}
|
|
}
|