89 lines
2.7 KiB
Bash
89 lines
2.7 KiB
Bash
#!/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 <pkg-rel-path>
|
|
# 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 <pkg-rel-path>}"
|
|
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
|