{ "name": "showbook", "private": true, "license": "MIT", "packageManager": "pnpm@10.33.4", "engines": { "node": ">=22", "pnpm": ">=9" }, "scripts": { "dev": "nx dev web", "build": "nx build web", "lint": "nx run-many -t lint", "typecheck": "nx run-many -t typecheck", "dev:db:generate": "export DATABASE_URL=\"${DEV_DATABASE_URL:-postgresql://showbook:showbook_dev@localhost:5433/showbook}\" && node scripts/guard-not-prod-db.mjs && pnpm --filter @showbook/db drizzle-kit generate", "dev:db:migrate": "export DATABASE_URL=\"${DEV_DATABASE_URL:-postgresql://showbook:showbook_dev@localhost:5433/showbook}\" && node scripts/guard-not-prod-db.mjs && pnpm --filter @showbook/db drizzle-kit migrate", "dev:db:create:e2e": "docker compose -f infra/docker-compose.yml exec -T db sh -c \"psql -U showbook -d showbook -tAc \\\"SELECT 1 FROM pg_database WHERE datname = 'showbook_e2e'\\\" | grep -q 1 || createdb -U showbook showbook_e2e\"", "dev:db:reset:e2e": "docker compose -f infra/docker-compose.yml exec -T db sh -c \"psql -U showbook -d showbook -c 'DROP DATABASE IF EXISTS showbook_e2e WITH (FORCE);' && psql -U showbook -d showbook -c 'CREATE DATABASE showbook_e2e;'\"", "dev:db:migrate:e2e": "export DATABASE_URL=\"${E2E_DATABASE_URL:-postgresql://showbook:showbook_dev@localhost:5433/showbook_e2e}\" && node scripts/guard-not-prod-db.mjs && pnpm --filter @showbook/db drizzle-kit migrate", "dev:db:prepare:e2e": "pnpm dev:db:reset:e2e && pnpm dev:db:migrate:e2e && export DATABASE_URL=\"${E2E_DATABASE_URL:-postgresql://showbook:showbook_dev@localhost:5433/showbook_e2e}\" && node scripts/guard-not-prod-db.mjs && pnpm --filter @showbook/jobs bootstrap-pgboss", "dev:db:studio": "export DATABASE_URL=\"${DEV_DATABASE_URL:-postgresql://showbook:showbook_dev@localhost:5433/showbook}\" && node scripts/guard-not-prod-db.mjs && pnpm --filter @showbook/db drizzle-kit studio", "test:e2e": "pnpm dev:db:prepare:e2e && nx run web:test:e2e", "test:integration": "pnpm dev:db:prepare:e2e && export DATABASE_URL=\"${E2E_DATABASE_URL:-postgresql://showbook:showbook_dev@localhost:5433/showbook_e2e}\" && node scripts/guard-not-prod-db.mjs && nx run-many -t test:integration --parallel=1", "test:integration:coverage": "pnpm dev:db:prepare:e2e && export DATABASE_URL=\"${E2E_DATABASE_URL:-postgresql://showbook:showbook_dev@localhost:5433/showbook_e2e}\" && node scripts/guard-not-prod-db.mjs && nx run-many -t test:integration:coverage --parallel=1", "test:unit": "nx run-many -t test", "test:coverage": "nx run-many -t test:coverage", "verify": "bash scripts/verify.sh", "verify:e2e": "bash scripts/verify.sh --e2e", "verify:coverage": "bash scripts/verify-coverage.sh", "email:smoke": "pnpm --filter @showbook/jobs run email:smoke", "email:preview": "pnpm --filter @showbook/emails dev", "dev:up": "node scripts/migrate-local-certs.mjs && docker compose -f infra/docker-compose.yml up -d", "dev:down": "docker compose -f infra/docker-compose.yml down", "dev:build": "node scripts/migrate-local-certs.mjs && docker compose -f infra/docker-compose.yml up -d --build", "dev:logs": "docker compose -f infra/docker-compose.yml logs -f web", "prod:up": "docker compose --env-file .env.prod -f infra/docker-compose.prod.yml pull web && docker compose --env-file .env.prod -f infra/docker-compose.prod.yml up -d", "prod:up:build": "docker compose --env-file .env.prod -f infra/docker-compose.prod.yml up -d --build", "prod:down": "docker compose --env-file .env.prod -f infra/docker-compose.prod.yml down", "prod:logs": "docker compose --env-file .env.prod -f infra/docker-compose.prod.yml logs -f web", "prod:db:migrate": "docker compose --env-file .env.prod -f infra/docker-compose.prod.yml exec web pnpm --filter @showbook/db drizzle-kit migrate", "prod:db:backup": "mkdir -p backups && docker compose --env-file .env.prod -f infra/docker-compose.prod.yml exec -T db pg_dump --format=custom --no-owner --no-acl -U showbook_prod showbook_prod > \"backups/pre-migrate-${DEPLOY_SHA:-$(date -u +%Y%m%dT%H%M%SZ)}.dump\"", "prod:health:ready": "curl -fsS --retry 12 --retry-delay 5 --retry-all-errors http://127.0.0.1:3002/api/health/ready", "e2e:up": "docker compose --env-file .env.e2e -f infra/docker-compose.e2e.yml up -d", "e2e:up:build": "docker compose --env-file .env.e2e -f infra/docker-compose.e2e.yml up -d --build", "e2e:down": "docker compose --env-file .env.e2e -f infra/docker-compose.e2e.yml down", "e2e:logs": "docker compose --env-file .env.e2e -f infra/docker-compose.e2e.yml logs -f web", "e2e:db:migrate": "docker compose --env-file .env.e2e -f infra/docker-compose.e2e.yml exec web pnpm --filter @showbook/db drizzle-kit migrate", "prod:query": "node scripts/prod-query.mjs", "db:check-duplicates": "node scripts/check-external-id-duplicates.mjs", "mint:e2e-token": "node scripts/mint-e2e-token.mjs", "mobile:start": "pnpm --filter mobile start", "mobile:start:dev-client": "pnpm --filter mobile start:dev-client", "mobile:start:go": "pnpm --filter mobile start:go", "mobile:trust-localhost-cert": "node scripts/trust-ios-localhost-cert.mjs", "mobile:ios": "pnpm --filter mobile ios", "mobile:ios:dev": "pnpm --filter mobile ios:dev", "mobile:ios:go": "pnpm --filter mobile ios:go", "mobile:android": "pnpm --filter mobile android", "mobile:android:dev": "pnpm --filter mobile android:dev", "mobile:android:go": "pnpm --filter mobile android:go", "mobile:typecheck": "pnpm --filter mobile typecheck", "mobile:lint": "pnpm --filter mobile lint", "mobile:test": "pnpm --filter mobile test", "mobile:e2e:ios": "pnpm --filter mobile e2e:ios", "mobile:e2e:dry": "pnpm --filter mobile e2e:dry", "mobile:web:build": "pnpm --filter mobile web:build", "mobile:web:test": "pnpm --filter mobile web:test", "mobile:web:verify": "pnpm --filter mobile web:verify", "setup:runner": "bash scripts/setup-runner.sh" }, "devDependencies": { "@types/node": "^26.6.6", "nx": "^24.0.3", "tsx": "^4.23.15", "typescript": "~6.0.3" }, "pnpm": { "auditConfig": { "ignoreGhsas": [ "GHSA-w3rx-r6r6-pgpr", "GHSA-5p2g-fcmc-qvqq" ] }, "overrides": { "fast-xml-parser@<5.7.0": "^5.7.0", "postcss@<8.5.23": "^8.5.23", "svix@<1.92.2": "^1.92.2", "nx>minimatch@<9.0.7": "^9.0.7", "esbuild@<0.28.1": "^0.28.1", "follow-redirects@<1.16.0": "^1.16.0", "axios@<1.18.0": "^1.18.0", "uuid@<14.0.0": "^14.0.0", "tmp@<0.2.7": "^0.2.7", "ws@>=8.0.0 <8.21.0": "^8.21.0", "shell-quote@<1.9.0": "^1.9.0", "form-data@<4.0.6": "^4.0.6", "js-yaml@>=4.0.0 <4.3.1": "^4.3.1", "undici@>=7.0.0 <7.29.0": "^7.29.0", "@auth/core@<0.41.3": "^0.41.3", "sharp@<0.35.0": "^0.35.0", "fast-uri@>=3.0.0 <3.1.5": "^3.1.5", "brace-expansion@<1.1.18": "^1.1.18", "brace-expansion@>=3.0.0 <5.0.9": "^5.0.9", "@babel/core": "7.29.7", "react": "19.2.3", "react-dom": "19.2.3", "react-test-renderer": "19.2.3", "react-native": "0.86.0", "react-native-reanimated": "4.5.0", "react-native-worklets": "0.10.0", "react-native-screens": "4.25.2", "react-native-gesture-handler": "~2.32.0", "react-native-safe-area-context": "~5.7.0", "@expo/dom-webview": "57.0.0" }, "onlyBuiltDependencies": [ "esbuild", "nx", "sharp", "unrs-resolver" ] } }