#!/usr/bin/env bash set -euo pipefail PASS=0; FAIL=0 ok() { echo " ✓ $*"; PASS=$((PASS+1)); } fail(){ echo " ✗ $*"; FAIL=$((FAIL+1)); } APP_URL="${APP_URL:-https://nimuli.com}" PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)" echo "" echo "═══════════════════════════════════════════" echo " Nimuli — Modal & Layout Verify" echo " $(date '+%Y-%m-%d %H:%M:%S')" echo "═══════════════════════════════════════════" # ── 1. PHP / Composer ───────────────────────── echo "" echo "[ 1 ] Dependencies" cd "$PROJECT_DIR" docker compose exec -T app php artisan --version &>/dev/null && ok "Laravel reachable" || fail "Laravel not reachable" # ── 2. wire-elements-modal present once ─────── echo "" echo "[ 2 ] Modal container in layout" LAYOUT="resources/views/layouts/nimuli-app.blade.php" MODAL_COUNT=$(grep -c "wire-elements-modal\|livewire-ui-modal" "$LAYOUT" || true) if [ "$MODAL_COUNT" -eq 1 ]; then ok "Exactly 1 modal container in layout" elif [ "$MODAL_COUNT" -eq 0 ]; then fail "No modal container found in layout" else fail "Duplicate modal containers ($MODAL_COUNT) — remove one" fi # ── 3. Echo in bootstrap.js ─────────────────── echo "" echo "[ 3 ] Laravel Echo" if grep -q "new Echo" "resources/js/bootstrap.js"; then ok "Echo instantiated in bootstrap.js" else fail "Echo missing from bootstrap.js" fi # ── 4. Cookie theme ─────────────────────────── echo "" echo "[ 4 ] Theme cookie" if grep -q "nimuli_theme" "bootstrap/app.php"; then ok "nimuli_theme excluded from cookie encryption" else fail "nimuli_theme not excluded from EncryptCookies" fi if grep -q "document.cookie.*nimuli_theme" "resources/js/app.js"; then ok "Theme cookie written in Alpine store" else fail "Alpine theme store does not write cookie" fi if grep -q "request()->cookie('nimuli_theme')" "resources/views/layouts/nimuli-app.blade.php"; then ok "Layout reads theme cookie server-side" else fail "Layout does not read theme cookie server-side" fi # ── 5. PNG icons ────────────────────────────── echo "" echo "[ 5 ] Manifest icons" for f in favicon-16x16.png favicon-32x32.png apple-touch-icon.png android-chrome-192x192.png android-chrome-512x512.png; do if [ -f "public/$f" ]; then ok "$f present" else fail "$f missing from public/" fi done # ── 6. Modal component files ────────────────── echo "" echo "[ 6 ] Modal Livewire components" MODALS=( "app/Livewire/Modals/CreateLink.php" "app/Livewire/Modals/EditLink.php" "app/Livewire/Modals/DeleteLink.php" "app/Livewire/Modals/CreateWorkspace.php" "app/Livewire/Modals/DeleteWorkspace.php" "app/Livewire/Modals/InviteMember.php" "app/Livewire/Modals/EditMemberRole.php" "app/Livewire/Modals/RemoveMember.php" "app/Livewire/Modals/CreateWebhook.php" "app/Livewire/Modals/DeleteWebhook.php" "app/Livewire/Modals/CreateApiToken.php" "app/Livewire/Modals/RevokeApiToken.php" "app/Livewire/Modals/ConfirmAction.php" ) for modal in "${MODALS[@]}"; do if [ -f "$modal" ]; then ok "$(basename "$modal" .php)" else fail "MISSING: $modal" fi done # ── 7. Tests ────────────────────────────────── echo "" echo "[ 7 ] Test suite" if docker compose exec -T app php artisan test --filter "LinksModals|WorkspaceModals|DevUserSeeder" 2>&1 | grep -q "passed"; then ok "Pest tests pass" else echo " Running full suite (this may take a moment)..." docker compose exec -T app php artisan test 2>&1 | tail -5 fail "Check output above" fi # ── 8. Build compiles ───────────────────────── echo "" echo "[ 8 ] Vite build" if npm run build 2>&1 | grep -q "built in"; then ok "Vite build clean" else fail "Vite build errors — check output" fi # ── 9. Seeders ──────────────────────────────── echo "" echo "[ 9 ] Dev user seeder" DB_USER=$(sed -n 's/^DB_USERNAME=//p' "$PROJECT_DIR/.env") DB_PASS=$(sed -n 's/^DB_PASSWORD=//p' "$PROJECT_DIR/.env") DB_NAME=$(sed -n 's/^DB_DATABASE=//p' "$PROJECT_DIR/.env") USER_CNT=$(docker compose exec -T mysql mysql -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" \ -se "SELECT COUNT(*) FROM users WHERE email='nexxo@nimuli.com';" 2>/dev/null || echo "0") if [ "${USER_CNT:-0}" -gt 0 ]; then ok "nexxo@nimuli.com exists in DB" else fail "nexxo@nimuli.com not found — run: php artisan db:seed" fi # ── Summary ─────────────────────────────────── echo "" echo "═══════════════════════════════════════════" TOTAL=$((PASS + FAIL)) echo " Passed: $PASS / $TOTAL" if [ "$FAIL" -gt 0 ]; then echo " Failed: $FAIL" echo "═══════════════════════════════════════════" echo "" exit 1 else echo " All checks passed ✓" echo "═══════════════════════════════════════════" echo "" fi