wwwfiberdirekt/fix-ts-errors.sh

244 lines
10 KiB
Bash
Executable File

#!/bin/bash
# Run from the root of your fdweb2 project
set -e
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
echo "=== FD TypeScript Error Fix Script ==="
echo ""
# ─────────────────────────────────────────────────────────────
# GROUP 1: Remove dead template block imports from RenderBlocks
# ─────────────────────────────────────────────────────────────
RENDER_BLOCKS="src/app/(frontend)/(pages)/[slug]/RenderBlocks.tsx"
# Try alternate path if first doesn't exist
if [ ! -f "$RENDER_BLOCKS" ]; then
RENDER_BLOCKS=$(find src -name "RenderBlocks.tsx" | head -1)
fi
echo "→ Fixing RenderBlocks.tsx at: $RENDER_BLOCKS"
# Remove dead template block imports (leave all FD* blocks intact)
sed -i '' \
'/^import { ArchiveBlock } from/d' \
"$RENDER_BLOCKS"
sed -i '' \
'/^import { CallToActionBlock } from/d' \
"$RENDER_BLOCKS"
sed -i '' \
'/^import { ContentBlock } from/d' \
"$RENDER_BLOCKS"
sed -i '' \
'/^import { FormBlock } from/d' \
"$RENDER_BLOCKS"
sed -i '' \
'/^import { MediaBlock } from/d' \
"$RENDER_BLOCKS"
# Remove corresponding entries from blockComponents object
sed -i '' \
'/^ archive: ArchiveBlock,/d' \
"$RENDER_BLOCKS"
sed -i '' \
'/^ cta: CallToActionBlock,/d' \
"$RENDER_BLOCKS"
sed -i '' \
'/^ content: ContentBlock,/d' \
"$RENDER_BLOCKS"
sed -i '' \
'/^ formBlock: FormBlock,/d' \
"$RENDER_BLOCKS"
sed -i '' \
'/^ mediaBlock: MediaBlock,/d' \
"$RENDER_BLOCKS"
echo " ✓ Removed 5 dead template block imports and blockComponent entries"
# ─────────────────────────────────────────────────────────────
# GROUP 2: Fix CallToActionBlock import in RichText
# ─────────────────────────────────────────────────────────────
RICH_TEXT="src/components/RichText/index.tsx"
if [ -f "$RICH_TEXT" ]; then
# Remove CallToActionBlock from the payload-types import
sed -i '' \
's/import type { CallToActionBlock } from '\''@\/payload-types'\''/\/\/ CallToActionBlock removed - not in schema/' \
"$RICH_TEXT"
# More general: remove just the named import if it's part of a multi-import
sed -i '' \
's/, CallToActionBlock//' \
"$RICH_TEXT"
sed -i '' \
's/CallToActionBlock, //' \
"$RICH_TEXT"
echo " ✓ Removed CallToActionBlock from RichText"
fi
# ─────────────────────────────────────────────────────────────
# GROUP 3: Fix null safety in FD block components
# ─────────────────────────────────────────────────────────────
echo ""
echo "→ Fixing null safety issues in FD blocks..."
# FDLocationsGridBlock - cards is possibly null
LOCATIONS="src/blocks/FDLocationsGridBlock/Component.tsx"
if [ -f "$LOCATIONS" ]; then
# Change: cards.map( → (cards ?? []).map(
sed -i '' \
's/cards\.map(/\(cards ?? []\)\.map(/g' \
"$LOCATIONS"
echo " ✓ FDLocationsGridBlock: cards null check"
fi
# FDNewsletterBlock - bulletPoints is possibly null
NEWSLETTER="src/blocks/FDNewsletterBlock/Component.tsx"
if [ -f "$NEWSLETTER" ]; then
sed -i '' \
's/bulletPoints\.map(/\(bulletPoints ?? []\)\.map(/g' \
"$NEWSLETTER"
sed -i '' \
's/bulletPoints\.length/\(bulletPoints ?? []\)\.length/g' \
"$NEWSLETTER"
# Fix conditional renders: bulletPoints && → bulletPoints?.length &&
sed -i '' \
's/bulletPoints &&/bulletPoints?.length \&\&/g' \
"$NEWSLETTER"
echo " ✓ FDNewsletterBlock: bulletPoints null check"
fi
# FDServiceChooserBlock - categories is possibly null
SERVICE_CHOOSER="src/blocks/FDServiceChooserBlock/Component.tsx"
if [ -f "$SERVICE_CHOOSER" ]; then
sed -i '' \
's/categories\.map(/\(categories ?? []\)\.map(/g' \
"$SERVICE_CHOOSER"
sed -i '' \
's/categories\.filter(/\(categories ?? []\)\.filter(/g' \
"$SERVICE_CHOOSER"
sed -i '' \
's/categories\.find(/\(categories ?? []\)\.find(/g' \
"$SERVICE_CHOOSER"
sed -i '' \
's/categories\.length/\(categories ?? []\)\.length/g' \
"$SERVICE_CHOOSER"
echo " ✓ FDServiceChooserBlock: categories null check"
fi
# FDStatisticsBlock - stats is possibly null
STATISTICS="src/blocks/FDStatisticsBlock/Component.tsx"
if [ -f "$STATISTICS" ]; then
sed -i '' \
's/stats\.map(/\(stats ?? []\)\.map(/g' \
"$STATISTICS"
sed -i '' \
's/stats\.length/\(stats ?? []\)\.length/g' \
"$STATISTICS"
echo " ✓ FDStatisticsBlock: stats null check"
fi
# ─────────────────────────────────────────────────────────────
# GROUP 4: Fix revalidatePath — Next.js now requires 2nd arg
# ─────────────────────────────────────────────────────────────
echo ""
echo "→ Fixing revalidatePath calls (adding 'page' as second argument)..."
REVALIDATE_FILES=(
"src/collections/Pages/hooks/revalidatePage.ts"
"src/collections/Posts/hooks/revalidatePost.ts"
"src/Footer/hooks/revalidateFooter.ts"
"src/Header/hooks/revalidateHeader.ts"
"src/globals/PopupAnnouncement/hooks/revalidatePopup.ts"
"src/hooks/revalidateRedirects.ts"
)
for FILE in "${REVALIDATE_FILES[@]}"; do
if [ -f "$FILE" ]; then
# revalidatePath('/some/path') → revalidatePath('/some/path', 'page')
# Match revalidatePath with a single string arg (no comma inside the parens)
sed -i '' \
"s/revalidatePath('\([^']*\)')/revalidatePath('\1', 'page')/g" \
"$FILE"
sed -i '' \
's/revalidatePath("\([^"]*\)")/revalidatePath("\1", "page")/g' \
"$FILE"
# Handle template literals: revalidatePath(\`...\`) → revalidatePath(\`...\`, 'page')
# This one is trickier with backticks, handle separately
perl -i '' -pe 's/revalidatePath\(`([^`]*)`\)/revalidatePath(`$1`, '\''page'\'')/g' "$FILE" 2>/dev/null || true
echo "$FILE"
fi
done
# ─────────────────────────────────────────────────────────────
# GROUP 5: Delete BACKUP file (it's causing compilation errors)
# ─────────────────────────────────────────────────────────────
echo ""
echo "→ Removing backup files from compilation..."
BACKUP="src/Header/Nav/index BACKUP.tsx"
if [ -f "$BACKUP" ]; then
rm "$BACKUP"
echo " ✓ Deleted 'src/Header/Nav/index BACKUP.tsx'"
else
echo " - BACKUP file not found (already removed?)"
fi
# ─────────────────────────────────────────────────────────────
# GROUP 6: Fix Footer/Header getCachedGlobal type cast
# ─────────────────────────────────────────────────────────────
echo ""
echo "→ Fixing Footer and Header getCachedGlobal type cast..."
FOOTER_COMPONENT="src/Footer/Component.tsx"
if [ -f "$FOOTER_COMPONENT" ]; then
# Add 'as Footer' cast to getCachedGlobal call
sed -i '' \
"s/const \(.*\) = await getCachedGlobal('footer'/const \1 = (await getCachedGlobal('footer'/" \
"$FOOTER_COMPONENT"
echo " ⚠ Footer/Component.tsx needs manual fix — see note below"
fi
HEADER_COMPONENT="src/Header/Component.tsx"
if [ -f "$HEADER_COMPONENT" ]; then
echo " ⚠ Header/Component.tsx needs manual fix — see note below"
fi
# ─────────────────────────────────────────────────────────────
# DONE
# ─────────────────────────────────────────────────────────────
echo ""
echo "=== Script complete ==="
echo ""
echo "MANUAL FIXES STILL NEEDED:"
echo ""
echo "1. FDTagsBlock and FDTextBlock missing from payload-types:"
echo " → Run: npx payload generate:types"
echo " → If still missing, check that FDTagsBlock and FDTextBlock"
echo " are imported and added to the Pages collection layout field"
echo " in src/collections/Pages/index.ts"
echo ""
echo "2. Footer/Component.tsx and Header/Component.tsx type mismatch:"
echo " → Change the getCachedGlobal line to add a type cast, e.g.:"
echo " const footerData = await getCachedGlobal('footer', 1) as Footer"
echo " const headerData = await getCachedGlobal('header', 1) as Header"
echo ""
echo "3. Footer/RowLabel.tsx and Header/RowLabel.tsx — 'link' property:"
echo " → Change: data.link?.label"
echo " To: data.label (the nav item schema changed, link is now flat)"
echo ""
echo "4. Media.caption doesn't exist — removed from your schema:"
echo " → In MediaBlock/Component.tsx line 33: remove the .caption reference"
echo " → In heros/MediumImpact/index.tsx lines 36/38: remove .caption"
echo " → In src/endpoints/seed/image-*.ts: remove caption field"
echo ""
echo "5. Seed files (contact-page.ts, home.ts, index.ts):"
echo " → These are dev seeds, not used in production."
echo " → Quickest fix: add // @ts-ignore above each flagged line,"
echo " or delete the seed files if you no longer use them."
echo ""
echo "After manual fixes, run: npx tsc --noEmit to verify"