#!/usr/bin/env bash set -o pipefail # PHP binary to use (defaults to PHP 8.2) PHP_BINARY="${PHP_BINARY:-/opt/homebrew/opt/php@8.2/bin/php}" # Colors and styles readonly RESET='\033[0m' readonly BOLD='\033[1m' readonly DIM='\033[2m' readonly UNDERLINE='\033[4m' readonly BLUE='\033[34m' readonly GREEN='\033[32m' readonly RED='\033[31m' readonly YELLOW='\033[33m' readonly CYAN='\033[36m' readonly MAGENTA='\033[35m' # Essential emojis readonly ROCKET="๐Ÿš€" readonly CHECK="โœ“" readonly ERROR="โŒ" readonly WARNING="โš ๏ธ" readonly SEARCH="๐Ÿ”" readonly PALETTE="๐ŸŽจ" readonly MICROSCOPE="๐Ÿ”ฌ" readonly MEMO="๐Ÿ“" readonly MAGNIFIER="๐Ÿ”Ž" readonly TEST_TUBE="๐Ÿงช" readonly SPARKLES="โœจ" print_header() { echo -e "\n${BOLD}${BLUE}${ROCKET} PHP-Flasher Code Quality Check ${ROCKET}${RESET}\n" echo -e "${BOLD}Date : ${RESET}${CYAN}$(date -u '+%Y-%m-%d %H:%M:%S') UTC${RESET}" echo -e "${BOLD}User : ${RESET}${MAGENTA}yoeunes${RESET}" echo -e "${BOLD}Branch : ${RESET}${GREEN}$(git rev-parse --abbrev-ref HEAD)${RESET}" echo -e "${BOLD}Directory : ${RESET}${BLUE}$(pwd)${RESET}\n" } run_rector() { echo -e "${BOLD}${SEARCH} Running Rector${RESET}" if $PHP_BINARY vendor/bin/rector; then echo -e "${CHECK} ${GREEN}Rector completed successfully${RESET}\n" return 0 else echo -e "${WARNING} ${YELLOW}Rector found issues${RESET}\n" return 1 fi } run_php_cs_fixer() { echo -e "${BOLD}${PALETTE} Running PHP-CS-Fixer${RESET}" if $PHP_BINARY vendor/bin/php-cs-fixer fix -v; then echo -e "${CHECK} ${GREEN}PHP-CS-Fixer completed successfully${RESET}\n" return 0 else echo -e "${WARNING} ${YELLOW}CS-Fixer found issues${RESET}\n" return 1 fi } run_phpstan() { echo -e "${BOLD}${MICROSCOPE} Running PHPStan${RESET}" if $PHP_BINARY vendor/bin/phpstan analyse --memory-limit=-1; then echo -e "${CHECK} ${GREEN}PHPStan analysis completed successfully${RESET}\n" return 0 else echo -e "${WARNING} ${YELLOW}PHPStan found issues${RESET}\n" return 1 fi } validate_composer_files() { echo -e "${BOLD}${MEMO} Validating Composer Files${RESET}" local validation_success=true if ! composer validate --strict; then echo -e "${WARNING} ${YELLOW}Main composer.json validation failed${RESET}" validation_success=false fi # Find and validate all composer.json files in src/ find src/ -name "composer.json" | while read file; do echo -e "${DIM}Validating ${file}${RESET}" if ! composer validate --strict "$file"; then echo -e "${WARNING} ${YELLOW}Package validation failed for ${file}${RESET}" validation_success=false fi done if [ "$validation_success" = true ]; then echo -e "${CHECK} ${GREEN}All composer.json files are valid${RESET}\n" return 0 else echo -e "${WARNING} ${YELLOW}Some composer.json files have issues${RESET}\n" return 1 fi } run_phplint() { echo -e "${BOLD}${MAGNIFIER} Running PHPLint${RESET}" if $PHP_BINARY vendor/bin/phplint; then echo -e "${CHECK} ${GREEN}PHPLint completed successfully${RESET}\n" return 0 else echo -e "${WARNING} ${YELLOW}PHPLint found issues${RESET}\n" return 1 fi } run_phpunit() { echo -e "${BOLD}${TEST_TUBE} Running PHPUnit Tests${RESET}" if $PHP_BINARY vendor/bin/phpunit; then echo -e "${CHECK} ${GREEN}All tests passed successfully${RESET}\n" return 0 else echo -e "${WARNING} ${YELLOW}Tests failed${RESET}\n" return 1 fi } run_vitest() { echo -e "${BOLD}${TEST_TUBE} Running Vitest Tests${RESET}" if npm run test -- --run; then echo -e "${CHECK} ${GREEN}Vitest tests passed successfully${RESET}\n" return 0 else echo -e "${WARNING} ${YELLOW}Vitest tests failed${RESET}\n" return 1 fi } main() { local start_time=$(date +%s) local issues_found=false print_header # Run all quality tools run_rector || issues_found=true run_php_cs_fixer || issues_found=true run_phpstan || issues_found=true validate_composer_files || issues_found=true run_phplint || issues_found=true run_phpunit || issues_found=true run_vitest || issues_found=true local end_time=$(date +%s) local duration=$((end_time - start_time)) # Summary echo -e "${BOLD}${CYAN}Quality Check Summary${RESET}" if [ "$issues_found" = true ]; then echo -e "${WARNING} ${YELLOW}Quality check completed with issues${RESET}" else echo -e "${SPARKLES} ${GREEN}All quality checks passed successfully${RESET}" fi echo -e "Duration : ${YELLOW}${duration}s${RESET}\n" echo -e "${SPARKLES} ${BOLD}Quality Check Complete${RESET}" echo -e "${CHECK} All checks finished\n" # We don't exit with error code because the original task continues despite failures exit 0 } main