#!/usr/bin/env bash # Convert all `export * from` violations in one package's feature barrels, # then run biome --write to canonicalise import order. # # Usage: bash scripts/convert-package-barrels.sh # e.g. bash scripts/convert-package-barrels.sh packages/crypto/crypto-hash # # Skips: # - src/index.ts (package root, out of scope per change spec) # - *.select/index.ts (generated forwarders, allowed by §6a) set -euo pipefail PKG_DIR="${1:?usage: $0 }" ROOT="$(cd "$(dirname "$0")/.." && pwd)" ABS_PKG="${ROOT}/${PKG_DIR}" if [ ! -d "${ABS_PKG}/src" ]; then echo "no src/ in ${ABS_PKG}" >&2 exit 1 fi # Pass 1: convert all leaf barrels. mapfile -t FILES < <( grep -rln "^export \* from" "${ABS_PKG}/src" --include="*.ts" 2>/dev/null \ | grep -v "/src/index\.ts$" \ | grep -v "\.select/" \ | sort -u ) if [ "${#FILES[@]}" -eq 0 ]; then echo "no violations in ${PKG_DIR} — running biome anyway" cd "${ABS_PKG}" for i in 1 2 3; do bunx biome check --write --max-diagnostics 1000 src/ 2>&1 | tail -1 done exit 0 fi echo "Pass 1: ${#FILES[@]} barrels in ${PKG_DIR}" bun "${ROOT}/scripts/convert-barrels.ts" "${FILES[@]}" || true # Pass 2: handle intermediate barrels whose targets have just become explicit. mapfile -t REMAINING < <( grep -rln "^export \* from" "${ABS_PKG}/src" --include="*.ts" 2>/dev/null \ | grep -v "/src/index\.ts$" \ | grep -v "\.select/" \ | sort -u ) if [ "${#REMAINING[@]}" -gt 0 ]; then echo "Pass 2: ${#REMAINING[@]} intermediate barrels" bun "${ROOT}/scripts/convert-barrels.ts" "${REMAINING[@]}" || true fi # Pass 3: third pass for deeply-nested barrel chains. mapfile -t LEFT < <( grep -rln "^export \* from" "${ABS_PKG}/src" --include="*.ts" 2>/dev/null \ | grep -v "/src/index\.ts$" \ | grep -v "\.select/" \ | sort -u ) if [ "${#LEFT[@]}" -gt 0 ]; then echo "Pass 3: ${#LEFT[@]} barrels remain" bun "${ROOT}/scripts/convert-barrels.ts" "${LEFT[@]}" || true fi # Final check. FINAL=$(grep -rln "^export \* from" "${ABS_PKG}/src" --include="*.ts" 2>/dev/null \ | grep -v "/src/index\.ts$" \ | grep -v "\.select/" \ | wc -l) if [ "${FINAL}" -gt 0 ]; then echo "WARNING: ${FINAL} barrels still have violations after 3 passes:" grep -rln "^export \* from" "${ABS_PKG}/src" --include="*.ts" 2>/dev/null \ | grep -v "/src/index\.ts$" \ | grep -v "\.select/" fi # Biome auto-fix — run unconditionally for 3 passes to handle layered # auto-fixes (e.g. organize-imports surfacing format issues that surface # further organize-imports). cd "${ABS_PKG}" for i in 1 2 3; do bunx biome check --write --max-diagnostics 1000 src/ 2>&1 | tail -1 done