Files
qbz/scripts/check-no-t-shadow.sh
T
vicrodh 067264e7ec chore(scripts): add ghost-doctor and ultra-restore dev tooling
Add dev-ghost-doctor.sh (t-shadow check + runtime clean + restart) and
dev-ultra-restore.sh (deep clean with --full/--no-start/--check flags).
Improve check-no-t-shadow.sh patterns for broader t-variable detection.
Clean-dev-runtime now runs guardrail check automatically. Remove --force
from vite dev. Add npm script shortcuts for all new tools.
2026-02-26 02:44:06 -06:00

47 lines
1.5 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SRC_DIR="${ROOT_DIR}/src"
echo "Checking for forbidden i18n 't' shadowing patterns in .svelte files..."
had_issues=0
check_pattern() {
local label="$1"
local pattern="$2"
if rg -n --glob '*.svelte' "${pattern}" "${SRC_DIR}" >/tmp/qbz_t_shadow_check.out 2>/dev/null; then
echo
echo "Found ${label}:"
cat /tmp/qbz_t_shadow_check.out
had_issues=1
fi
}
# Template loop variable shadowing.
check_pattern "template each-loop shadowing (as t)" '\{#each[^\n]*\bas t\b'
# Plain variable/function-loop names using `t`.
check_pattern "variable declaration named t" '\b(const|let|var)\s+t\b'
check_pattern "for-loop variable named t" 'for\s*\(\s*(const|let|var)\s+t\b'
# Callback parameters named `t` (single or parenthesized).
check_pattern "arrow callback parameter named t" '\bt\s*=>|\(\s*t(?:\s*:[^)]*)?\s*\)\s*=>|\(\s*[^,)]*,\s*t(?:\s*:[^)]*)?\s*\)\s*=>'
# get(t) is fragile in Svelte files that import i18n store `t`.
check_pattern "get(t) usage in .svelte files" '\bget\s*\(\s*t\s*\)'
# Lightweight same-line checks for $derived expressions.
check_pattern "store translation access inside \$derived (same line)" '\$derived(?:\.by)?\([^)]*(\$t\(|get\(t\))'
check_pattern "usage of t inside \$derived (same line)" '\$derived(?:\.by)?\([^)]*\bt\b'
if [[ "${had_issues}" -ne 0 ]]; then
echo
echo "check-no-t-shadow: FAIL"
exit 1
fi
echo "check-no-t-shadow: OK"