Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
101 lines
2.9 KiB
Bash
Executable File
101 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# check-prod-bundle.sh
|
|
# Fails if a built web bundle has test/dev server URLs baked in as defaults.
|
|
#
|
|
# Native packaging (gradlew bundleRelease, Xcode archive) ships whatever web
|
|
# bundle was last synced into the native project, whether it came from a
|
|
# --test, --dev, or --prod build. Run this on the bundle before uploading.
|
|
#
|
|
# Usage:
|
|
# ./scripts/check-prod-bundle.sh [PATH...]
|
|
#
|
|
# Each PATH is a directory (e.g. android/app/src/main/assets/public,
|
|
# ios/App/App/public, an .xcarchive) or an .aab, .apk, or .ipa file.
|
|
# With no PATH, checks the synced Android and iOS web assets plus the
|
|
# release AAB if it exists.
|
|
#
|
|
# Detection: the canary URLs below appear in src/ only as AppString.TEST_*
|
|
# enum values, which minify to `x.TEST_..._SERVER="<url>"`. Any other quoted
|
|
# occurrence is a VITE_* default compiled in from .env.test or
|
|
# .env.development (.env.development also uses the test image server).
|
|
#
|
|
# Exit codes: 0 = clean, 1 = test defaults found, 2 = bad input
|
|
|
|
source "$(dirname "$0")/common.sh"
|
|
|
|
CANARY_REGEX='"https://test(-image-api|-notify-api)?\.timesafari\.app"'
|
|
ENUM_REGEX='TEST[0-9]*_[A-Z_]+="https'
|
|
|
|
# Prints offending snippets from the JS files under a directory; returns 1 if any.
|
|
check_js_dir() {
|
|
local dir="$1"
|
|
local js_count
|
|
js_count=$(find "$dir" -name "*.js" -path "*assets*" | wc -l | tr -d ' ')
|
|
if [ "$js_count" = "0" ]; then
|
|
log_error "No JS assets found under $dir"
|
|
return 2
|
|
fi
|
|
|
|
local hits
|
|
hits=$(find "$dir" -name "*.js" -path "*assets*" -print0 \
|
|
| xargs -0 grep -ohE ".{0,40}${CANARY_REGEX}" \
|
|
| grep -vE "$ENUM_REGEX")
|
|
if [ -n "$hits" ]; then
|
|
log_error "Test/dev server defaults found in bundle:"
|
|
echo "$hits" | sed 's/^/ /' >&2
|
|
return 1
|
|
fi
|
|
return 0
|
|
}
|
|
|
|
check_path() {
|
|
local path="$1"
|
|
local result
|
|
|
|
if [ -d "$path" ]; then
|
|
check_js_dir "$path"
|
|
result=$?
|
|
elif [ -f "$path" ]; then
|
|
case "$path" in
|
|
*.aab|*.apk|*.ipa) ;;
|
|
*)
|
|
log_error "Unsupported file type: $path"
|
|
return 2
|
|
;;
|
|
esac
|
|
local tmp
|
|
tmp=$(mktemp -d)
|
|
unzip -q "$path" '*public/assets/*.js' -d "$tmp" 2>/dev/null
|
|
check_js_dir "$tmp"
|
|
result=$?
|
|
rm -rf "$tmp"
|
|
else
|
|
log_error "Not found: $path"
|
|
return 2
|
|
fi
|
|
|
|
if [ "$result" = "0" ]; then
|
|
log_success "Production defaults OK: $path"
|
|
else
|
|
log_error "Not a production bundle: $path"
|
|
fi
|
|
return $result
|
|
}
|
|
|
|
paths=("$@")
|
|
if [ ${#paths[@]} -eq 0 ]; then
|
|
for p in android/app/src/main/assets/public \
|
|
ios/App/App/public \
|
|
android/app/build/outputs/bundle/release/app-release.aab; do
|
|
[ -e "$p" ] && paths+=("$p")
|
|
done
|
|
fi
|
|
|
|
status=0
|
|
for p in "${paths[@]}"; do
|
|
check_path "$p"
|
|
rc=$?
|
|
[ $rc -gt $status ] && status=$rc
|
|
done
|
|
exit $status
|