#!/bin/bash set -e echo "==========================================" echo "๐Ÿ”„ Novalon Website ๆŠ€ๆœฏๆ ˆ้™็บง่„šๆœฌ" echo "ไปŽ: Next.js 16 + React 19 + Tailwind CSS 4" echo "ๅˆฐ: Next.js 14.2 + React 18.3 + Tailwind CSS 3.4" echo "==========================================" echo "" BACKUP_DIR="./backup-$(date +%Y%m%d_%H%M%S)" mkdir -p "$BACKUP_DIR" echo "๐Ÿ“ฆ Step 1: ๅค‡ไปฝๅ…ณ้”ฎ้…็ฝฎๆ–‡ไปถ..." cp package.json "$BACKUP_DIR/" cp postcss.config.mjs "$BACKUP_DIR/" 2>/dev/null || true cp src/app/globals.css "$BACKUP_DIR/" 2>/dev/null || true echo "โœ… ้…็ฝฎๆ–‡ไปถๅทฒๅค‡ไปฝๅˆฐ $BACKUP_DIR" echo "" echo "๐Ÿ—‘๏ธ Step 2: ๆธ…็†ๆ—งไพ่ต–ๅ’Œ็ผ“ๅญ˜..." rm -rf node_modules rm -f package-lock.json pnpm-lock.yaml yarn.lock rm -rf .next dist rm -rf .cache echo "โœ… ็ผ“ๅญ˜ๅทฒๆธ…็†" echo "" echo "๐Ÿ“ฅ Step 3: ๅฎ‰่ฃ…ๆ–ฐ็‰ˆๆœฌไพ่ต–..." npm install --registry=https://registry.npmmirror.com || { echo "โŒ npm install ๅคฑ่ดฅ๏ผๅฐ่ฏ•ไฝฟ็”จๆท˜ๅฎ้•œๅƒ..." npm install --registry=https://registry.npmmirror.com } echo "โœ… ไพ่ต–ๅฎ‰่ฃ…ๅฎŒๆˆ" echo "" echo "๐Ÿ” Step 4: ้ชŒ่ฏๆ ธๅฟƒไพ่ต–็‰ˆๆœฌ..." echo "" echo "โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”" echo "โ”‚ ไพ่ต–ๅŒ… โ”‚ ๆœŸๆœ›็‰ˆๆœฌ โ”‚ ๅฎž้™…ๅฎ‰่ฃ…็‰ˆๆœฌ โ”‚" echo "โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค" check_version() { local pkg=$1 local expected=$2 local actual=$(node -e "console.log(require('./node_modules/$pkg/package.json').version)" 2>/dev/null || echo "ๆœชๅฎ‰่ฃ…") if [[ "$actual" == *"$expected"* ]]; then status="โœ…" else status="โš ๏ธ" fi printf "โ”‚ %-15s โ”‚ %-16s โ”‚ %-18s โ”‚\n" "$pkg" "$expected" "$actual" } check_version "next" "^14.2" check_version "react" "^18.3" check_version "react-dom" "^18.3" check_version "tailwindcss" "^3.4" check_version "@types/react" "^18" check_version "@types/react-dom" "^18" check_version "eslint-config-next" "^14" echo "โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜" echo "" echo "๐Ÿงช Step 5: ่ฟ่กŒๅฟซ้€Ÿ้ชŒ่ฏ..." if npm run lint --silent > /dev/null 2>&1; then echo "โœ… ESLint ๆฃ€ๆŸฅ้€š่ฟ‡" else echo "โš ๏ธ ESLint ๆฃ€ๆŸฅๆœ‰่ญฆๅ‘Š๏ผˆๅฏๅฟฝ็•ฅ๏ผ‰" fi if npx tsc --noEmit --pretty > /dev/null 2>&1; then echo "โœ… TypeScript ็ฑปๅž‹ๆฃ€ๆŸฅ้€š่ฟ‡" else echo "โš ๏ธ TypeScript ็ฑปๅž‹ๆฃ€ๆŸฅๆœ‰้”™่ฏฏ๏ผˆ้œ€่ฆไฟฎๅค๏ผ‰" echo " ่ฏท่ฟ่กŒ 'npx tsc --noEmit' ๆŸฅ็œ‹่ฏฆ็ป†้”™่ฏฏ" fi echo "" echo "๐Ÿ—๏ธ Step 6: ๆต‹่ฏ•ๆž„ๅปบ๏ผˆๅฏ้€‰๏ผŒ่€—ๆ—ถ่พƒ้•ฟ๏ผ‰..." read -p "ๆ˜ฏๅฆ็Žฐๅœจ่ฟ่กŒ็”Ÿไบงๆž„ๅปบๆต‹่ฏ•๏ผŸ(y/n): " build_choice if [ "$build_choice" = "y" ] || [ "$build_choice" = "Y" ]; then echo " ๆญฃๅœจๆž„ๅปบ...๏ผˆ้ข„่ฎก 2-5 ๅˆ†้’Ÿ๏ผ‰" if npm run build:clean > /tmp/build-output.log 2>&1; then echo "โœ… ็”Ÿไบงๆž„ๅปบๆˆๅŠŸ๏ผ" if [ -d "dist" ]; then file_count=$(find dist -type f | wc -l) dist_size=$(du -sh dist | cut -f1) echo " ๐Ÿ“ ็”Ÿๆˆไบ† $file_count ไธชๆ–‡ไปถ๏ผŒๆ€ปๅคงๅฐ: $dist_size" fi else echo "โŒ ๆž„ๅปบๅคฑ่ดฅ๏ผๆŸฅ็œ‹ๆ—ฅๅฟ—:" echo " cat /tmp/build-output.log" exit 1 fi else echo "โญ๏ธ ่ทณ่ฟ‡ๆž„ๅปบๆต‹่ฏ•๏ผˆ็จๅŽๅฏๆ‰‹ๅŠจ่ฟ่กŒ 'npm run build:clean'๏ผ‰" fi echo "" echo "==========================================" echo "๐ŸŽ‰ ๆŠ€ๆœฏๆ ˆ้™็บงๅฎŒๆˆ๏ผ" echo "==========================================" echo "" echo "๐Ÿ“‹ ๅŽ็ปญๆ“ไฝœ๏ผš" echo " 1. ่ฟ่กŒ 'npm run dev' ๅฏๅŠจๅผ€ๅ‘ๆœๅŠกๅ™จ้ชŒ่ฏ" echo " 2. ่ฟ่กŒ 'npm run test:unit' ๆ‰ง่กŒๅ•ๅ…ƒๆต‹่ฏ•" echo " 3. ่ฟ่กŒ 'npm run test:e2e' ๆ‰ง่กŒ E2E ๆต‹่ฏ•" echo " 4. ๅฆ‚ๆžœไธ€ๅˆ‡ๆญฃๅธธ๏ผŒๆไบคไปฃ็ ๅˆฐ Git" echo "" echo "๐Ÿ“‹ ๅ›žๆปšๆ–นๆณ•๏ผˆๅฆ‚ๆžœ้‡ๅˆฐ้—ฎ้ข˜๏ผ‰๏ผš" echo " cp $BACKUP_DIR/package.json ./package.json" echo " # ... ๆขๅคๅ…ถไป–้…็ฝฎๆ–‡ไปถ" echo " rm -rf node_modules && npm install" echo "" echo "๐Ÿ’ก ๅค‡ไปฝไฝ็ฝฎ: $BACKUP_DIR/" echo ""