86 lines
3.4 KiB
Bash
Executable File
86 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# download-leaflet.sh — Vendor Leaflet + leaflet.markercluster into static/leaflet/.
|
|
#
|
|
# The /photography/map/ page (build/Photography.hs photographyMapRules)
|
|
# loads Leaflet from /leaflet/ to render a map of geo-tagged photos.
|
|
# This vendoring keeps the page CDN-independent: the assets ship with
|
|
# the site, no third-party request at view time.
|
|
#
|
|
# Run once before deploying. The vendored copy is gitignored
|
|
# (~150 KB total); re-running is safe — the script skips when the
|
|
# files already exist.
|
|
#
|
|
# To bump the pinned versions, set LEAFLET_VERSION / MARKERCLUSTER_VERSION,
|
|
# re-run, then update tools/leaflet-checksums.sha256 with the new hashes.
|
|
|
|
set -euo pipefail
|
|
|
|
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
|
|
LEAFLET_DIR="$REPO_ROOT/static/leaflet"
|
|
CHECKSUMS="$REPO_ROOT/tools/leaflet-checksums.sha256"
|
|
|
|
LEAFLET_VERSION="${LEAFLET_VERSION:-1.9.4}"
|
|
MARKERCLUSTER_VERSION="${MARKERCLUSTER_VERSION:-1.5.3}"
|
|
|
|
UNPKG_LEAFLET="https://unpkg.com/leaflet@${LEAFLET_VERSION}/dist"
|
|
UNPKG_MC="https://unpkg.com/leaflet.markercluster@${MARKERCLUSTER_VERSION}/dist"
|
|
|
|
# Files to vendor: (URL_BASE LOCAL_PATH SOURCE_FILENAME PIN_KEY)
|
|
# PIN_KEY is the version-prefixed name in the checksum file so future
|
|
# version bumps don't accidentally accept files matching an older hash.
|
|
files_to_fetch=(
|
|
"$UNPKG_LEAFLET|leaflet.js|leaflet-${LEAFLET_VERSION}-leaflet.js"
|
|
"$UNPKG_LEAFLET|leaflet.css|leaflet-${LEAFLET_VERSION}-leaflet.css"
|
|
"$UNPKG_LEAFLET/images|images/marker-icon.png|leaflet-${LEAFLET_VERSION}-marker-icon.png"
|
|
"$UNPKG_LEAFLET/images|images/marker-icon-2x.png|leaflet-${LEAFLET_VERSION}-marker-icon-2x.png"
|
|
"$UNPKG_LEAFLET/images|images/marker-shadow.png|leaflet-${LEAFLET_VERSION}-marker-shadow.png"
|
|
"$UNPKG_MC|leaflet.markercluster.js|leaflet.markercluster-${MARKERCLUSTER_VERSION}-leaflet.markercluster.js"
|
|
"$UNPKG_MC|MarkerCluster.css|leaflet.markercluster-${MARKERCLUSTER_VERSION}-MarkerCluster.css"
|
|
"$UNPKG_MC|MarkerCluster.Default.css|leaflet.markercluster-${MARKERCLUSTER_VERSION}-MarkerCluster.Default.css"
|
|
)
|
|
|
|
# Skip the whole step if the canonical entry-point already exists.
|
|
# Force a re-fetch by removing the directory.
|
|
if [ -f "$LEAFLET_DIR/leaflet.js" ] && [ -f "$LEAFLET_DIR/leaflet.markercluster.js" ]; then
|
|
echo "leaflet: already vendored at $LEAFLET_DIR (skipping)"
|
|
exit 0
|
|
fi
|
|
|
|
mkdir -p "$LEAFLET_DIR/images"
|
|
|
|
verify_or_warn() {
|
|
local file="$1"
|
|
local pin_key="$2"
|
|
if [ ! -f "$CHECKSUMS" ]; then
|
|
echo "leaflet: $CHECKSUMS not found — skipping sha256 verification" >&2
|
|
return 0
|
|
fi
|
|
local want
|
|
want="$(awk -v p="$pin_key" '$2 == p { print $1; exit }' "$CHECKSUMS")"
|
|
if [ -z "$want" ]; then
|
|
echo "leaflet: no pinned checksum for $pin_key — skipping verification" >&2
|
|
return 0
|
|
fi
|
|
local got
|
|
got="$(sha256sum "$file" | awk '{ print $1 }')"
|
|
if [ "$got" != "$want" ]; then
|
|
echo "leaflet: sha256 mismatch for $pin_key" >&2
|
|
echo " expected $want" >&2
|
|
echo " got $got" >&2
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
for entry in "${files_to_fetch[@]}"; do
|
|
IFS='|' read -r url_base local_path pin_key <<<"$entry"
|
|
src_name="${local_path##*/}"
|
|
target="$LEAFLET_DIR/$local_path"
|
|
mkdir -p "$(dirname "$target")"
|
|
|
|
echo "leaflet: fetching $local_path ($pin_key)"
|
|
curl -fsSL --progress-bar "$url_base/$src_name" -o "$target"
|
|
verify_or_warn "$target" "$pin_key"
|
|
done
|
|
|
|
echo "leaflet: vendored to $LEAFLET_DIR"
|