@@ -36,27 +36,39 @@ aws s3 cp "$DIST_DIR/" "s3://$BUCKET/$VERSION/" \
3636 --content-type " application/javascript"
3737
3838echo " ==> Updating versions.json in s3://$BUCKET /"
39- TMPDIR =" $( mktemp -d) "
40- trap ' rm -rf "$TMPDIR "' EXIT
39+ TMPWORKDIR =" $( mktemp -d) "
40+ trap ' rm -rf "$TMPWORKDIR "' EXIT
4141
4242# Distinguish "file doesn't exist" from real errors (auth, network).
4343# A blind fallback to '[]' on any error would silently drop all previous versions.
44- if aws s3 cp " s3://$BUCKET /versions.json" " $TMPDIR /versions.json" ; then
44+ if aws s3 cp " s3://$BUCKET /versions.json" " $TMPWORKDIR /versions.json" ; then
4545 echo " Downloaded existing versions.json"
4646elif aws s3api head-object --bucket " $BUCKET " --key " versions.json" 2> /dev/null; then
4747 echo " ERROR: versions.json exists but could not be downloaded" >&2
4848 exit 1
4949else
5050 echo " No existing versions.json found, starting fresh"
51- echo ' []' > " $TMPDIR /versions.json"
51+ echo ' []' > " $TMPWORKDIR /versions.json"
5252fi
5353
54- if jq -e --arg v " $VERSION " ' .[] | select(.version == $v)' " $TMPDIR /versions.json" > /dev/null 2>&1 ; then
54+ if jq -e --arg v " $VERSION " ' .[] | select(.version == $v)' " $TMPWORKDIR /versions.json" > /dev/null 2>&1 ; then
5555 echo " Version $VERSION already in versions.json, skipping"
5656else
5757 jq --arg v " $VERSION " --arg ts " $( date -u +%Y-%m-%dT%H:%M:%SZ) " \
58- ' . + [{"version": $v, "timestamp": $ts}]' " $TMPDIR /versions.json" > " $TMPDIR /versions_updated.json"
59- aws s3 cp " $TMPDIR /versions_updated.json" " s3://$BUCKET /versions.json" \
58+ ' . + [{"version": $v, "timestamp": $ts}]' " $TMPWORKDIR /versions.json" > " $TMPWORKDIR /versions_updated.json"
59+
60+ # Validate the updated manifest before uploading: must be a non-empty JSON array
61+ # where every entry has .version and .timestamp strings.
62+ if ! jq -e ' if type != "array" then error
63+ elif length == 0 then error
64+ elif any(.[]; (.version | type) != "string" or (.timestamp | type) != "string") then error
65+ else true end' " $TMPWORKDIR /versions_updated.json" > /dev/null 2>&1 ; then
66+ echo " ERROR: versions_updated.json failed validation — aborting upload" >&2
67+ cat " $TMPWORKDIR /versions_updated.json" >&2
68+ exit 1
69+ fi
70+
71+ aws s3 cp " $TMPWORKDIR /versions_updated.json" " s3://$BUCKET /versions.json" \
6072 --content-type " application/json"
6173 echo " Added v$VERSION to versions.json"
6274fi
0 commit comments