{ "name": "meshcore-analytics-backend", "version": "1.0.0", "private": true, "type": "module", "scripts": { "build": "tsc", "dev": "tsx watch src/index.ts", "spam:recompute": "node dist/tools/recomputeSpamSuspects.js", "spam:messages": "node dist/tools/recomputeSpamMessages.js", "db:migrate": "node dist/tools/migrate.js", "stats:backfill-rollups": "node dist/tools/backfillStatsRollups.js", "stats:backfill-multibyte": "node dist/tools/backfillMultibytePathFacts.js", "stats:seed-chart-snapshot": "node dist/tools/seedStatsChartSnapshot.js", "db:lifecycle": "node dist/tools/dataLifecycle.js", "owner-auth:inventory": "node dist/tools/inventoryOwnerAuthorization.js", "analysis:cleanup-orphans": "node dist/tools/cleanupOrphanedAnalysisRuns.js", "bench:decode": "tsx src/tools/benchmarkPacketDecode.ts", "load:realtime": "tsx src/tools/loadRealtime.ts", "test": "node --import tsx --test $(find src -name '*.test.ts' ! -name '*.integration.test.ts' -print)", "test:analysis-integration": "node --import tsx --test src/analysis/runState.integration.test.ts", "test:ingest-integration": "node --import tsx --test src/db/packetBatch.integration.test.ts", "typecheck": "tsc --noEmit", "contract:generate": "tsx src/tools/generateOpenApi.ts", "contract:check": "tsx src/tools/generateOpenApi.ts --check", "start": "node dist/index.js" }, "dependencies": { "@michaelhart/meshcore-decoder": "^0.3.0", "compression": "^1.7.4", "cors": "^2.8.5", "express": "^5.2.1", "express-rate-limit": "^8.6.2", "ioredis": "^6.0.0", "mqtt": "^5.10.1", "pg": "^8.13.1", "prom-client": "^15.1.3", "ws": "^8.21.3" }, "devDependencies": { "@types/compression": "^1.7.5", "@types/cors": "^2.8.17", "@types/express": "^5.0.6", "@types/node": "^26.2.0", "@types/pg": "^8.21.0", "@types/ws": "^8.5.12", "tsx": "^4.23.11", "typescript": "^7.0.2" } }