{ "name": "homix-marketing", "version": "2.0.0", "description": "Homix Realty listing marketing and resilient Resend delivery service", "type": "module", "engines": { "node": ">=22 <23" }, "scripts": { "postinstall": "prisma generate", "dev": "concurrently -k -n web,client \"npm:dev:web\" \"npm:dev:client\"", "dev:web": "cross-env APP_ROLE=web tsx watch src/bootstrap.ts", "dev:worker": "cross-env APP_ROLE=worker tsx watch src/bootstrap.ts", "dev:client": "vite --config client/vite.config.ts", "build": "npm run prisma:generate && npm run build:client && npm run build:server", "build:client": "vite build --config client/vite.config.ts", "build:server": "tsc -p tsconfig.server.json", "start": "node dist/server/src/bootstrap.js", "start:web": "cross-env APP_ROLE=web node dist/server/src/bootstrap.js", "start:worker": "cross-env APP_ROLE=worker node dist/server/src/bootstrap.js", "start:migrate": "cross-env APP_ROLE=migrate node dist/server/src/bootstrap.js", "format": "prettier --write .", "format:check": "prettier --check .", "lint": "eslint . --max-warnings=0", "typecheck": "npm run prisma:generate && tsc -p tsconfig.server.json --noEmit && tsc -p client/tsconfig.json --noEmit", "test": "npm run test:unit && npm run test:api", "test:unit": "vitest run tests/unit", "test:api": "vitest run tests/api", "test:integration": "bash scripts/run-integration-tests.sh", "test:e2e": "bash scripts/run-e2e-tests.sh", "test:coverage": "npm run test:coverage:unit && npm run test:coverage:services", "test:coverage:unit": "vitest run tests/unit --coverage", "test:coverage:services": "bash scripts/run-integration-tests.sh --coverage --config vitest.integration.config.ts", "prisma:generate": "prisma generate", "prisma:migrate:dev": "prisma migrate dev", "prisma:migrate:deploy": "prisma migrate deploy", "db:seed": "tsx prisma/seed.ts", "db:up": "docker compose up -d postgres", "db:down": "docker compose down", "migrate:v1": "tsx scripts/migrate-sqlite-v1.ts", "docker:build": "docker build -t homix-marketing:local .", "infra:lint": "az bicep build --file infra/bootstrap.bicep --stdout > /dev/null && az bicep build --file infra/main.bicep --stdout > /dev/null", "openapi:lint": "redocly lint openapi.yaml --config .redocly.yaml", "licenses:check": "node scripts/check-licenses.mjs", "source:archive:check": "bash scripts/build-source-archive.sh --check", "source:archive": "bash scripts/build-source-archive.sh", "check": "npm run format:check && npm run lint && npm run typecheck && npm test && npm run build" }, "dependencies": { "@azure/identity": "^4.10.2", "@azure/monitor-opentelemetry": "^1.14.0", "@azure/storage-blob": "^12.28.0", "@hookform/resolvers": "^5.2.1", "@prisma/client": "^6.12.0", "@react-email/components": "^0.5.7", "@react-email/render": "^1.4.0", "@tanstack/react-query": "^5.87.1", "csv-parse": "^7.0.2", "dotenv": "^17.2.2", "express": "^5.2.1", "express-rate-limit": "^8.1.0", "helmet": "^8.1.0", "lucide-react": "^0.544.0", "multer": "^2.2.0", "pg": "^8.16.3", "pino": "^9.9.4", "pino-http": "^10.5.0", "prisma": "^6.12.0", "react": "^19.1.1", "react-dom": "^19.1.1", "react-hook-form": "^7.62.0", "react-router-dom": "^7.9.1", "recharts": "^3.2.1", "resend": "^6.21.0", "sanitize-html": "^2.17.0", "sharp": "^0.35.3", "zod": "^4.1.8" }, "devDependencies": { "@eslint/js": "^9.35.0", "@playwright/test": "^1.55.0", "@redocly/cli": "^2.1.0", "@testing-library/react": "^16.3.0", "@types/better-sqlite3": "^7.6.13", "@types/express": "^5.0.3", "@types/multer": "^2.0.0", "@types/node": "^22.18.3", "@types/pg": "^8.15.5", "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", "@types/sanitize-html": "^2.16.0", "@types/supertest": "^6.0.3", "@vitejs/plugin-react": "^5.0.2", "@vitest/coverage-v8": "^3.2.4", "better-sqlite3": "^12.4.1", "concurrently": "^9.2.1", "cross-env": "^10.0.0", "esbuild": "^0.28.2", "eslint": "^9.35.0", "eslint-config-prettier": "^10.1.8", "prettier": "^3.6.2", "supertest": "^7.1.4", "tsx": "^4.20.5", "typescript": "^5.9.2", "typescript-eslint": "^8.43.0", "vite": "^7.1.5", "vitest": "^3.2.4" } }