{
  "name": "salfanet-radius",
  "version": "2.19.0",
  "private": false,
  "scripts": {
    "dev": "next dev",
    "build": "cross-env NODE_OPTIONS='--max-old-space-size=1536 --max-semi-space-size=64' NEXT_TELEMETRY_DISABLED=1 next build",
    "postbuild": "node -e \"const fs=require('fs'),path=require('path');const src='public',dst='.next/standalone/public';function copy(s,d){if(!fs.existsSync(d))fs.mkdirSync(d,{recursive:true});for(const f of fs.readdirSync(s)){const sp=path.join(s,f),dp=path.join(d,f);if(fs.statSync(sp).isDirectory()&&f!=='uploads'){copy(sp,dp)}else if(!fs.statSync(sp).isDirectory()){fs.copyFileSync(sp,dp)}}}copy(src,dst);console.log('[postbuild] public/ copied to .next/standalone/public/');if(fs.existsSync('.env')){fs.copyFileSync('.env','.next/standalone/.env');console.log('[postbuild] .env copied to .next/standalone/.env')}\"",
    "build:turbo": "next build --turbo",
    "build:vps": "cross-env NODE_OPTIONS='--max-old-space-size=1536 --max-semi-space-size=64' NEXT_TELEMETRY_DISABLED=1 next build",
    "build:low-mem": "cross-env NODE_OPTIONS='--max-old-space-size=1024 --max-semi-space-size=32' NEXT_TELEMETRY_DISABLED=1 next build",
    "start": "next start",
    "lint": "eslint",
    "db:seed": "tsx prisma/seeds/seed-all.ts",
    "db:seed:company": "tsx prisma/seeds/seed-company.ts",
    "db:seed:templates": "tsx prisma/seeds/seed-isolation-templates.ts",
    "db:seed:reset-templates": "tsx prisma/seeds/seed-all.ts --force-templates",
    "db:push": "prisma db push && npm run db:fix-radius",
    "db:migrate": "prisma migrate dev && npm run db:fix-radius",
    "db:fix-radius": "mysql -u root your_database < prisma/migrations/fix_radacct_groupname/migration.sql",
    "migrate:deploy": "prisma migrate deploy",
    "test": "vitest",
    "test:run": "vitest run",
    "test:api": "node scripts/test-all-apis.js",
    "test:scan": "node scripts/scan-api-endpoints.js",
    "test:integration": "vitest run tests/api-integration.test.ts",
    "test:watch": "vitest watch",
    "clean:local": "node -e \"const fs=require('fs');const rm=(p)=>{try{if(fs.existsSync(p))fs.rmSync(p,{recursive:true,force:true});}catch(e){console.error('[clean:local] failed:',p,e.message);process.exitCode=1;}};['.next','tsconfig.tsbuildinfo','coverage','test-results','.turbo','.cache'].forEach(rm);console.log('[clean:local] done');\"",
    "clean:all": "npm run clean:local && npm run cleanup",
    "cleanup": "node scripts/remove-console-logs.js",
    "cleanup:dry": "node scripts/remove-console-logs.js --dry-run",
    "deploy": "node scripts/run-deploy.js",
    "deploy:full": "node scripts/run-deploy.js --full",
    "deploy:quick": "node scripts/run-deploy.js --quick",
    "deploy:status": "node scripts/run-deploy.js --status",
    "deploy:rollback": "node scripts/run-deploy.js --rollback",
    "cron": "node cron-service.js",
    "push:vapid": "node scripts/generate-vapid.js"
  },
  "overrides": {
    "minimatch": "^10.2.1"
  },
  "dependencies": {
    "@ducanh2912/next-pwa": "^10.2.9",
    "@prisma/client": "^6.19.0",
    "@radix-ui/react-alert-dialog": "^1.1.15",
    "@radix-ui/react-avatar": "^1.1.10",
    "@radix-ui/react-checkbox": "^1.3.3",
    "@radix-ui/react-dialog": "^1.1.15",
    "@radix-ui/react-dropdown-menu": "^2.1.16",
    "@radix-ui/react-label": "^2.1.7",
    "@radix-ui/react-popover": "^1.1.15",
    "@radix-ui/react-select": "^2.2.6",
    "@radix-ui/react-slot": "^1.2.3",
    "@radix-ui/react-switch": "^1.2.6",
    "@radix-ui/react-tabs": "^1.1.13",
    "@radix-ui/react-toast": "^1.2.15",
    "@tailwindcss/postcss": "^4.2.0",
    "@types/leaflet": "^1.9.21",
    "@types/papaparse": "^5.5.2",
    "@types/qrcode": "^1.5.6",
    "@types/web-push": "^3.6.4",
    "@whiskeysockets/baileys": "^7.0.0-rc.9",
    "bcryptjs": "^3.0.2",
    "class-variance-authority": "^0.7.1",
    "clsx": "^2.1.1",
    "cross-env": "^10.1.0",
    "date-fns": "^4.1.0",
    "date-fns-tz": "^3.2.0",
    "exceljs": "^4.4.0",
    "express": "^5.2.1",
    "firebase-admin": "^13.6.1",
    "jose": "^6.2.2",
    "jsonwebtoken": "^9.0.3",
    "jspdf": "^4.2.0",
    "jspdf-autotable": "^5.0.7",
    "leaflet": "^1.9.4",
    "lucide-react": "^0.548.0",
    "midtrans-client": "^1.4.3",
    "mysql2": "^3.22.2",
    "next": "^16.0.8",
    "next-auth": "^4.24.12",
    "next-intl": "^4.4.0",
    "next-themes": "^0.4.6",
    "node-cron": "^4.2.1",
    "node-routeros": "^1.6.8",
    "nodemailer": "^7.0.11",
    "otpauth": "^9.5.0",
    "papaparse": "^5.5.3",
    "pino": "^10.3.1",
    "prisma": "^6.18.0",
    "qrcode": "^1.5.4",
    "react": "^19.2.1",
    "react-dom": "^19.2.1",
    "react-is": "^19.2.4",
    "react-leaflet": "^5.0.0",
    "react-leaflet-cluster": "^4.0.0",
    "recharts": "^3.3.0",
    "sweetalert2": "^11.26.3",
    "tailwind-merge": "^3.3.1",
    "tailwindcss": "^4.2.0",
    "tw-animate-css": "^1.4.0",
    "web-push": "^3.6.7",
    "xendit-node": "^7.0.0",
    "xlsx": "^0.18.5",
    "zod": "^4.3.6",
    "zustand": "^5.0.8"
  },
  "devDependencies": {
    "@types/bcryptjs": "^2.4.6",
    "@types/jsonwebtoken": "^9.0.10",
    "@types/node": "^20.19.33",
    "@types/nodemailer": "^7.0.4",
    "@types/react": "^19",
    "@types/react-dom": "^19",
    "babel-plugin-react-compiler": "1.0.0",
    "eslint": "^9.28.0",
    "eslint-config-next": "^15.3.4",
    "tsx": "^4.20.6",
    "typescript": "^5",
    "vitest": "^3.2.3"
  }
}
