#!/usr/bin/env bash qa_diagnostic_cleanup() { local command_status=$? local cleanup_status=0 local owned_server="$QA_SERVER_OWNED" trap - EXIT qa_cleanup_server || cleanup_status=1 if [[ "$owned_server" == "1" ]]; then qa_wait_port_free 15 || cleanup_status=1 fi if [[ "$QA_DB_CREATED" == "1" ]]; then qa_dropdb || cleanup_status=1 local remaining remaining="$(qa_psql -Atc "SELECT count(*) FROM pg_database WHERE datname = '$QA_DB_NAME'")" || cleanup_status=1 [[ "$remaining" == "0" ]] || cleanup_status=1 fi node -e 'require("node:fs").writeFileSync(process.argv[1], JSON.stringify({phase:process.argv[2],commandExit:Number(process.argv[3]),cleanupExit:Number(process.argv[4]),database:process.argv[5]}))' \ "$QA_DIAGNOSTIC_STAGE_DIR/outcome.json" "$QA_DIAGNOSTIC_PHASE" "$command_status" "$cleanup_status" "$QA_DB_NAME" if [[ "$command_status" != "0" ]]; then exit "$command_status"; fi exit "$cleanup_status" } qa_run_diagnostic_stage() { local stage="$1" [[ -d "${QA_DIAGNOSTIC_STAGE_DIR:-}" && "$QA_DB_NAME" =~ ^hyb_oa_diag_[a-z0-9_]+$ ]] || exit 2 [[ "$QA_DB_HOST" == "127.0.0.1" && "$QA_DB_CLIENT" == "host" && "$QA_KEEP_DB" == "0" ]] || exit 2 [[ -n "${QA_DIAGNOSTIC_REASON:-}" && -n "${QA_DIAGNOSTIC_OPERATOR:-}" && -n "${QA_DIAGNOSTIC_APPROVAL_REF:-}" ]] || exit 2 QA_DIAGNOSTIC_PHASE=prepare trap qa_diagnostic_cleanup EXIT trap 'exit 130' INT trap 'exit 143' TERM qa_require_cmd node qa_require_cmd npm qa_select_port qa_export_app_env case "$stage" in inputs) qa_prepare_full_inputs node -e 'require("node:fs").writeFileSync(process.argv[1], JSON.stringify({root:process.argv[2],buildA:process.argv[3],buildB:process.argv[4],shaA:process.argv[5],shaB:process.argv[6]}))' \ "$QA_DIAGNOSTIC_STAGE_DIR/pwa-fixture.json" "$PWA_FIXTURE_ROOT" "$PWA_BUILD_A_DIR" "$PWA_BUILD_B_DIR" "$PWA_BUILD_A_SHA" "$PWA_BUILD_B_SHA" ;; tools) cd "$SERVER_DIR" npm run prisma:generate npm run prisma:check-generated npm run prisma:validate ;; server-unit) cd "$SERVER_DIR" QA_DIAGNOSTIC_PHASE=test npm test ;; typecheck) cd "$CLIENT_DIR" QA_DIAGNOSTIC_PHASE=test npx tsc --noEmit --pretty false --extendedDiagnostics ;; client-build) qa_build_client ;; workflow-actions|server-regressions|browser) qa_require_cmd curl qa_require_db_client qa_prepare_db if [[ "$stage" == "browser" ]]; then export JOBS_ENABLED="${JOBS_ENABLED_FOR_E2E:-true}"; else export JOBS_ENABLED=false; fi qa_start_server QA_DIAGNOSTIC_PHASE=test cd "$SERVER_DIR" case "$stage" in workflow-actions) ./scripts/regression-workflow-actions.sh ;; server-regressions) ./scripts/regression-all.sh ;; browser) PWA_FIXTURE_ROOT="$QA_DIAGNOSTIC_PWA_ROOT" qa_run_full_browser --trace=on ;; esac ;; *) exit 2 ;; esac }