diff --git a/bin/bump b/bin/bump new file mode 100755 index 00000000..5a24ff27 --- /dev/null +++ b/bin/bump @@ -0,0 +1,189 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +# Colors and styles +readonly RESET='\033[0m' +readonly BOLD='\033[1m' +readonly BLUE='\033[34m' +readonly GREEN='\033[32m' +readonly RED='\033[31m' +readonly YELLOW='\033[33m' + +# Emojis +readonly ROCKET="๐Ÿš€" +readonly UPDATE="๐Ÿ”„" +readonly PACKAGE="๐Ÿ“ฆ" +readonly SUCCESS="โœจ" +readonly ERROR="โŒ" +readonly WARNING="โš ๏ธ" +readonly CHECK="โœ“" + +# Header +print_header() { + echo -e "\n${BOLD}${BLUE}โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ${RESET}" + echo -e "${BOLD}${BLUE}โ”‚ ${ROCKET} PHP-Flasher Version ${ROCKET} โ”‚${RESET}" + echo -e "${BOLD}${BLUE}โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ${RESET}\n" + echo -e " Date : $(date -u '+%Y-%m-%d %H:%M:%S') UTC" + echo -e " User : $(whoami)" + echo -e " Directory: $(pwd)\n" +} + +# Version validation +validate_version() { + local version=$1 + if [[ ! $version =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo -e "\n${RED}${ERROR} Invalid version format: $version${RESET}" + echo -e " Version must be in format X.Y.Z (e.g., 2.1.6)\n" + exit 1 + fi +} + +# Get current version from Flasher class +get_current_version() { + local file="src/Prime/Flasher.php" + if [ -f "$file" ]; then + local version=$(grep -o "const VERSION = '[0-9]\+\.[0-9]\+\.[0-9]\+'" "$file" | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+") + echo "$version" + else + echo -e "${RED}${ERROR} Flasher.php not found in src/Prime/Flasher.php${RESET}" + exit 1 + fi +} + +# Update composer.json file +update_composer_file() { + local file=$1 + local current_version=$2 + local new_version=$3 + + # Create a temporary file + local tmp_file="${file}.tmp" + + # Use jq with 4-space indentation + if command -v jq >/dev/null 2>&1; then + jq --indent 4 --arg cv "^${current_version}" --arg nv "^${new_version}" ' + walk( + if type == "object" and has("require") then + .require |= with_entries( + if .key | startswith("php-flasher/") then + .value = $nv + else + . + end + ) + else + . + end + ) + ' "$file" > "$tmp_file" + else + # Fallback to sed for simple replacement + sed -E "s/\"php-flasher\/[^\"]+\": \"\\^${current_version}\"/\"\\0\": \"^${new_version}\"/" "$file" > "$tmp_file" + fi + + # Check if the temporary file exists and has content + if [ -s "$tmp_file" ]; then + mv "$tmp_file" "$file" + echo " ${CHECK} Updated $file" + else + echo " ${WARNING} Failed to update $file" + rm -f "$tmp_file" + fi +} + +# Update package.json file +update_package_file() { + local file=$1 + local current_version=$2 + local new_version=$3 + + # Create a temporary file + local tmp_file="${file}.tmp" + + # Use jq with 4-space indentation + if command -v jq >/dev/null 2>&1; then + jq --indent 4 --arg cv "^${current_version}" --arg nv "^${new_version}" --arg v "${new_version}" ' + .version = $v | + if has("peerDependencies") then + .peerDependencies |= with_entries( + if .key | startswith("@flasher/") then + .value = $nv + else + . + end + ) + else + . + end | + if has("dependencies") then + .dependencies |= with_entries( + if .key | startswith("@flasher/") then + .value = $nv + else + . + end + ) + else + . + end + ' "$file" > "$tmp_file" + else + # Fallback to sed for simple replacement + sed -E -e "s/\"version\": \"${current_version}\"/\"version\": \"${new_version}\"/" \ + -e "s/\"@flasher\/[^\"]+\": \"\\^${current_version}\"/\"\\0\": \"^${new_version}\"/" \ + "$file" > "$tmp_file" + fi + + # Check if the temporary file exists and has content + if [ -s "$tmp_file" ]; then + mv "$tmp_file" "$file" + echo " ${CHECK} Updated $file" + else + echo " ${WARNING} Failed to update $file" + rm -f "$tmp_file" + fi +} + +# Update version in files +update_version() { + local current_version=$1 + local new_version=$2 + + echo -e " ${UPDATE} Updating version numbers ($current_version โ†’ $new_version)\n" + + # Update PHP class version + echo -e " ${PACKAGE} Updating Flasher class version..." + if [ -f "src/Prime/Flasher.php" ]; then + sed -i '' "s/const VERSION = '$current_version'/const VERSION = '$new_version'/" src/Prime/Flasher.php + echo -e " ${CHECK} Updated src/Prime/Flasher.php" + fi + + # Update composer.json files in src directory + echo -e "\n ${PACKAGE} Updating composer.json files..." + find src -name "composer.json" -type f | while read -r file; do + update_composer_file "$file" "$current_version" "$new_version" + done + + # Update package.json files in src directory + echo -e "\n ${PACKAGE} Updating package.json files..." + find src -name "package.json" -type f | while read -r file; do + update_package_file "$file" "$current_version" "$new_version" + done + + echo -e "\n ${SUCCESS} Version bump complete!\n" +} + +# Main execution +if [ -z "$1" ]; then + echo -e "${RED}${ERROR} Version number is required${RESET}" + echo -e "Usage: $0 \n" + exit 1 +fi + +print_header +new_version=$1 +current_version=$(get_current_version) +validate_version "$new_version" +update_version "$current_version" "$new_version" diff --git a/taskfile.dist.yml b/taskfile.dist.yml index 8ded7a47..b59a104d 100644 --- a/taskfile.dist.yml +++ b/taskfile.dist.yml @@ -5,117 +5,63 @@ vars: CURRENT_VERSION: '2.1.5' NEW_VERSION: '{{.CLI_ARGS | default ""}}' - HEADER: | - โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ - โ”‚ ๐Ÿš€ PHP-Flasher Tasks Runner ๐Ÿš€ โ”‚ - โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ - tasks: default: desc: Show available tasks cmds: - - echo "{{.HEADER}}" - task -l silent: true - version:bump: + bump: desc: Bump version in all necessary files - summary: | - Update version numbers across the project - Usage: task version:bump 2.1.6 - cmds: - - echo "{{.HEADER}}" - - | - if [ -z "{{.NEW_VERSION}}" ]; then - echo "Error: Version number is required" - echo "Usage: task version:bump 2.1.6" - exit 1 - fi - - echo " Date : {{.DATE}} UTC" - echo " Task : Version Bump ({{.CURRENT_VERSION}} -> {{.NEW_VERSION}})" - echo - - # Update PHP class version - echo " ๐Ÿ”„ Updating Flasher class version..." - sed -i '' "s/const VERSION = '{{.CURRENT_VERSION}}'/const VERSION = '{{.NEW_VERSION}}'/" src/Prime/Flasher.php - - # Update composer.json files - echo " ๐Ÿ“ฆ Updating composer.json files..." - find . -name "composer.json" -not -path "./vendor/*" -exec sed -i '' "s/\"php-flasher\/.*\": \"^{{.CURRENT_VERSION}}\"/\"php-flasher\/.*\": \"^{{.NEW_VERSION}}\"/" {} \; - - # Update package.json files - echo " ๐Ÿ“ฆ Updating package.json files..." - find . -name "package.json" -not -path "./node_modules/*" -exec sed -i '' "s/\"version\": \"{{.CURRENT_VERSION}}\"/\"version\": \"{{.NEW_VERSION}}\"/" {} \; - find . -name "package.json" -not -path "./node_modules/*" -exec sed -i '' "s/\"@flasher\/.*\": \"^{{.CURRENT_VERSION}}\"/\"@flasher\/.*\": \"^{{.NEW_VERSION}}\"/" {} \; - - echo " โœจ Version bump complete!" - silent: true - - version:validate: - desc: Validate version number format - vars: - VERSION_REGEX: '^[0-9]+\.[0-9]+\.[0-9]+$' cmds: - | - if [[ ! "{{.NEW_VERSION}}" =~ {{.VERSION_REGEX}} ]]; then - echo "Error: Invalid version format. Must be X.Y.Z (e.g., 2.1.6)" - exit 1 + if [ -f "bin/bump" ]; then + chmod +x bin/bump + ./bin/bump {{.NEW_VERSION}} + else + echo " โŒ Bump script not found in bin/bump" + exit 1 fi silent: true - release: - desc: Create and publish a new release - cmds: - - task: version:validate - - task: version:bump - - task: lint - - task: split - - task: npm:publish - - task: git:tag - silent: true - split: desc: Split repositories cmds: - | - echo "{{.HEADER}}" - echo " Date : {{.DATE}} UTC" - echo " Task : Repository Split" - echo - - echo " ๐Ÿ”„ Splitting repositories..." - php bin/split - echo " โœจ Split complete!" + if [ -f "bin/split" ]; then + chmod +x bin/split + ./bin/split + else + echo " โŒ Split script not found in bin/split" + exit 1 + fi silent: true npm:publish: desc: Publish NPM packages cmds: - | - echo "{{.HEADER}}" - echo " Date : {{.DATE}} UTC" - echo " Task : NPM Package Publishing" - echo - - echo " ๐Ÿ“ฆ Publishing NPM packages..." - php bin/npm {{.NEW_VERSION}} - echo " โœจ NPM publish complete!" + if [ -f "bin/npm" ]; then + chmod +x bin/npm + ./bin/npm {{.NEW_VERSION}} + else + echo " โŒ NPM script not found in bin/npm" + exit 1 + fi silent: true git:tag: desc: Create and push git tags cmds: - | - echo "{{.HEADER}}" - echo " Date : {{.DATE}} UTC" - echo " Task : Git Tagging" - echo - - echo " ๐Ÿท๏ธ Creating git tag v{{.NEW_VERSION}}..." - git tag -a "v{{.NEW_VERSION}}" -m "Release v{{.NEW_VERSION}}" - git push origin "v{{.NEW_VERSION}}" - echo " โœจ Git tagging complete!" + if [ -f "bin/git-tag" ]; then + chmod +x bin/git-tag + ./bin/git-tag {{.NEW_VERSION}} + else + echo " โŒ Git-tag script not found in bin/git-tag" + exit 1 + fi silent: true status: @@ -123,95 +69,60 @@ tasks: cmds: - | if [ -f "bin/status" ]; then - chmod +x bin/status - ./bin/status + chmod +x bin/status + ./bin/status else - echo " โŒ Status script not found in bin/status" - exit 1 + echo " โŒ Status script not found in bin/status" + exit 1 + fi + silent: true + + lint: + desc: Analyze code quality and standards + cmds: + - | + if [ -f "bin/lint" ]; then + chmod +x bin/lint + ./bin/lint + else + echo " โŒ Lint script not found in bin/lint" + exit 1 fi silent: true update: desc: Update project dependencies and rebuild assets cmds: - - echo "{{.HEADER}}" - | - echo " Date : {{.DATE}} UTC" - echo " Task : Update Dependencies" - echo - - echo " ๐Ÿ“ฆ Composer Dependencies" - composer update --prefer-lowest -W - echo " โœ“ Dependencies updated successfully" - echo - - echo " ๐Ÿ” NPM Updates Check" - npm run ncu || echo " โš ๏ธ NPM check failed, continuing..." - echo - - echo " ๐Ÿ“ฆ NPM Dependencies" - npm install --force || echo " โš ๏ธ NPM install failed, continuing..." - echo - - echo " ๐Ÿ—๏ธ Building Assets" - npm run build || echo " โš ๏ธ Build failed, continuing..." - echo - - echo " โœจ Update Complete" - echo " โœ“ Process finished successfully" - silent: true - - lint: - desc: Analyze code quality and standards - cmds: - - echo "{{.HEADER}}" - - | - echo " Date : {{.DATE}} UTC" - echo " Task : Code Quality Check" - echo - - echo " ๐Ÿ” Running Rector" - php vendor/bin/rector || echo " โš ๏ธ Rector found issues" - echo - - echo " ๐ŸŽจ Running PHP-CS-Fixer" - php vendor/bin/php-cs-fixer fix -v || echo " โš ๏ธ CS-Fixer found issues" - echo - - echo " ๐Ÿ”ฌ Running PHPStan" - php vendor/bin/phpstan analyse --memory-limit=-1 || echo " โš ๏ธ PHPStan found issues" - echo - - echo " ๐Ÿ“ Validating Composer Files" - composer validate --strict || echo " โš ๏ธ Validation failed" - find src/ -name "composer.json" -exec composer validate --strict {} \; || echo " โš ๏ธ Package validation failed" - echo - - echo " ๐Ÿ”Ž Running PHPLint" - php vendor/bin/phplint || echo " โš ๏ธ PHPLint found issues" - echo - - echo " ๐Ÿงช Running PHPUnit Tests" - php vendor/bin/phpunit || echo " โš ๏ธ Tests failed" - echo - - echo " โœจ Quality Check Complete" - echo " โœ“ All checks finished" + if [ -f "bin/update" ]; then + chmod +x bin/update + ./bin/update + else + echo " โŒ Update script not found in bin/update" + exit 1 + fi silent: true docs:build: desc: Build documentation - dir: docs/ cmds: - | - echo "{{.HEADER}}" - echo " Date : {{.DATE}} UTC" - echo " Task : Build Documentation" - echo - - echo " ๐Ÿ“š Installing dependencies" - npm install --force - - echo " ๐Ÿ—๏ธ Building documentation" - npm run build + if [ -f "bin/docs" ]; then + chmod +x bin/docs + ./bin/docs build + else + echo " โŒ Docs script not found in bin/docs" + exit 1 + fi + silent: true + + release: + desc: Create and publish a new release + cmds: + - task: validate + - task: bump + - task: lint + - task: split + - task: npm:publish + - task: git:tag silent: true