#!/bin/zsh echo "🔎 Running Next.js Dynamic Route Health Check..." echo "" DYNAMIC_PAGES=$(find src/app -type f -path "*/\[*\]/page.js") RED=$(tput setaf 1) YELLOW=$(tput setaf 3) GREEN=$(tput setaf 2) RESET=$(tput sgr0) check_pass() { echo "${GREEN}✔ PASS${RESET} $1" } check_warn() { echo "${YELLOW}⚠ WARN${RESET} $1" } check_fail() { echo "${RED}✖ FAIL${RESET} $1" } for FILE in $DYNAMIC_PAGES; do echo "==========================================" echo "📄 Checking: $FILE" FOLDER=$(basename $(dirname "$FILE")) PARAM_NAME=${FOLDER//[\[\]]/} CONTENT=$(cat "$FILE") echo "➡ Route param is: ${PARAM_NAME}" # 1. Check for export default async if echo "$CONTENT" | grep -q "export default async function"; then check_pass "Has async default export" else check_fail "Missing 'export default async function'" fi # 2. Check for await params if echo "$CONTENT" | grep -q "await params"; then check_pass "'await params' found" else check_fail "Missing 'await params' — required in Next.js 15+" fi # 3. Check if extracted param name is correct if echo "$CONTENT" | grep -q "const { $PARAM_NAME } = await params"; then check_pass "Correct param extraction: { $PARAM_NAME }" else check_warn "Param '$PARAM_NAME' may not be extracted with 'await params'" fi # 4. Check for leftover bad usage: params.paramName if echo "$CONTENT" | grep -q "params\.$PARAM_NAME"; then check_fail "Found old syntax 'params.$PARAM_NAME' — must be removed!" else check_pass "No old 'params.$PARAM_NAME' references" fi # 5. Check that param is used somewhere if echo "$CONTENT" | grep -q "$PARAM_NAME"; then check_pass "Param is referenced in file" else check_warn "Param '$PARAM_NAME' isn't used — this may be incorrect" fi # 6. Validate imports IMPORT_ERRORS=0 while IFS= read -r line; do if [[ "$line" == import* ]]; then PATH=$(echo "$line" | sed -n 's/.*from "\(.*\)".*/\1/p') if [[ "$PATH" == @/* ]]; then # Attempt resolution RESOLVED="src${PATH#@}" RESOLVED="${RESOLVED%.js}.js" if [ ! -f "$RESOLVED" ] && [ ! -f "${RESOLVED%.js}.jsx" ] && [ ! -f "${RESOLVED%.js}.ts" ] && [ ! -f "${RESOLVED%.js}.tsx" ]; then check_warn "Import may be broken: $line" IMPORT_ERRORS=1 fi fi fi done <<< "$(grep "^import" "$FILE")" if [[ $IMPORT_ERRORS -eq 0 ]]; then check_pass "All imports appear valid" fi # 7. Check param folder structure DIR=$(dirname "$FILE") if [ ! -d "$DIR" ]; then check_fail "Missing directory: $DIR (route broken)" else check_pass "Route directory exists" fi echo "" done echo "==========================================" echo "🏁 Dynamic Route Health Check Complete!"