De stub moest tot nu toe mee met elke @version-bump, en dat is net het plakwerk waar het @require-spoor vanaf moest. Het nummer zei daar ook niets: de code komt bij elke pagina-load van schijf, dus wat er draait is wat er nú in de repo staat, niet wat er in het meta-blok bleef staan. De kolom hoeft enkel -dev te tonen, dus staat er voortaan 0.0.0-dev. Opnieuw genereren is nog nodig als de metadata zelf wijzigt, bij een andere @match, @grant, @run-at of @require. Heeft een map een src/, dan wijst @require daar rechtstreeks naar. Bij select-search was het gebouwde bestand niets anders dan de header plus die bron, dus stond build.sh alleen maar tussen opslaan en herladen in. Die draai je nu pas bij het publiceren, voor de raw-URL en de bookmarklet. De metadata blijft wel uit het gebouwde script komen, want de bron heeft geen ==UserScript==-blok. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
148 lines
4.6 KiB
Bash
Executable File
148 lines
4.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Genereert een Tampermonkey dev-loader voor een script uit deze repo.
|
|
# De stub bevat alleen metadata; de code komt via @require uit de repo-file,
|
|
# die daarmee de enige bron van waarheid blijft.
|
|
#
|
|
# Gebruik: bin/dev-stub <scriptmap> [--no-copy]
|
|
# bin/dev-stub bipp-budgetcode
|
|
# bin/dev-stub scripts/select-search --no-copy
|
|
set -euo pipefail
|
|
|
|
usage() {
|
|
cat <<'USAGE'
|
|
Gebruik: bin/dev-stub <scriptmap> [opties]
|
|
|
|
<scriptmap> naam onder scripts/, of een pad naar de map
|
|
|
|
Opties:
|
|
--no-copy, -n niet naar het klembord, alleen naar stdout
|
|
--list, -l toon de beschikbare scriptmappen
|
|
--help, -h deze uitleg
|
|
USAGE
|
|
}
|
|
|
|
here="$(cd "$(dirname "$0")/.." && pwd)"
|
|
copy=1
|
|
target=""
|
|
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
--no-copy|-n) copy=0 ;;
|
|
--list|-l)
|
|
for d in "$here"/scripts/*/; do
|
|
[ -d "$d" ] && basename "$d"
|
|
done
|
|
exit 0
|
|
;;
|
|
--help|-h) usage; exit 0 ;;
|
|
-*) echo "dev-stub: onbekende optie: $1" >&2; usage >&2; exit 2 ;;
|
|
*)
|
|
if [ -n "$target" ]; then
|
|
echo "dev-stub: geef één scriptmap op" >&2
|
|
exit 2
|
|
fi
|
|
target="$1"
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ -z "$target" ]; then
|
|
echo "dev-stub: geen scriptmap opgegeven" >&2
|
|
usage >&2
|
|
exit 2
|
|
fi
|
|
|
|
dir="$target"
|
|
[ -d "$dir" ] || dir="$here/scripts/$(basename "$target")"
|
|
if [ ! -d "$dir" ]; then
|
|
echo "dev-stub: map niet gevonden: $target (zie --list)" >&2
|
|
exit 1
|
|
fi
|
|
dir="$(cd "$dir" && pwd)"
|
|
|
|
src=""
|
|
for f in "$dir"/*.user.js; do
|
|
[ -f "$f" ] && src="$f" && break
|
|
done
|
|
if [ -z "$src" ]; then
|
|
echo "dev-stub: geen *.user.js in $dir" >&2
|
|
echo "dev-stub: bij een script met een build: draai eerst ./build.sh" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# Heeft de map een build, dan wijst @require naar de bron in plaats van naar het
|
|
# gebouwde bestand: zo volstaat opslaan en de pagina herladen, zonder build.sh
|
|
# ertussen. De metadata blijft wel uit het gebouwde script komen, want de bron
|
|
# heeft geen ==UserScript==-blok.
|
|
code="$src"
|
|
if [ -f "$dir/src/$(basename "$dir").js" ]; then
|
|
code="$dir/src/$(basename "$dir").js"
|
|
fi
|
|
|
|
# Eén metadataveld uit de kop van het echte script halen.
|
|
meta() {
|
|
sed -n 's|^// @'"$1"' *\(.*[^ ]\) *$|\1|p' "$src"
|
|
}
|
|
|
|
name="$(meta name | head -1)"
|
|
namespace="$(meta namespace | head -1)"
|
|
author="$(meta author | head -1)"
|
|
downloadurl="$(meta downloadURL | head -1)"
|
|
|
|
if [ -z "$name" ]; then
|
|
echo "dev-stub: @name ontbreekt in $src" >&2
|
|
exit 1
|
|
fi
|
|
|
|
# @updateURL staat op none, want weglaten volstaat niet: Tampermonkey onthoudt de
|
|
# download-URL van de oorspronkelijke installatie los van het meta-blok, en zou de
|
|
# stub daarmee bij de eerste update-check overschrijven met de volledige raw-versie.
|
|
# In determineMetaURL gaat updateURL vóór die onthouden downloadURL en breekt de
|
|
# waarde none de check af. @downloadURL mag daardoor blijven staan: die wordt nooit
|
|
# meer bereikt en levert wel de GitHub-herkomst op in de overzichtslijst.
|
|
{
|
|
echo "// ==UserScript=="
|
|
printf '// @name %s\n' "$name"
|
|
[ -n "$namespace" ] && printf '// @namespace %s\n' "$namespace"
|
|
# Vaste versie, losgekoppeld van het echte script. De code komt bij elke pagina-load
|
|
# van schijf, dus een nummer hier zou hooguit suggereren dat er iets vastligt. De kolom
|
|
# hoeft alleen -dev te tonen, en zo hoeft de stub niet mee met elke @version-bump.
|
|
printf '// @version 0.0.0-dev\n'
|
|
printf '// @description Dev-loader. De code staat in de repo, dit bestand wijst er alleen naar.\n'
|
|
[ -n "$author" ] && printf '// @author %s\n' "$author"
|
|
[ -n "$downloadurl" ] && printf '// @%-12s %s\n' downloadURL "$downloadurl"
|
|
printf '// @%-12s %s\n' updateURL none
|
|
for key in match include exclude; do
|
|
meta "$key" | while IFS= read -r value; do
|
|
[ -n "$value" ] && printf '// @%-12s %s\n' "$key" "$value"
|
|
done
|
|
done
|
|
# Bestaande externe @require en @resource eerst, want de code eronder rekent erop.
|
|
meta require | while IFS= read -r value; do
|
|
case "$value" in
|
|
file://*) ;;
|
|
"") ;;
|
|
*) printf '// @%-12s %s\n' require "$value" ;;
|
|
esac
|
|
done
|
|
meta resource | while IFS= read -r value; do
|
|
[ -n "$value" ] && printf '// @%-12s %s\n' resource "$value"
|
|
done
|
|
printf '// @%-12s file://%s\n' require "$code"
|
|
for key in grant connect run-at noframes; do
|
|
meta "$key" | while IFS= read -r value; do
|
|
[ -n "$value" ] && printf '// @%-12s %s\n' "$key" "$value"
|
|
done
|
|
done
|
|
echo "// ==/UserScript=="
|
|
} > "$dir/.dev-stub.tmp"
|
|
|
|
cat "$dir/.dev-stub.tmp"
|
|
if [ "$copy" -eq 1 ] && command -v pbcopy >/dev/null 2>&1; then
|
|
pbcopy < "$dir/.dev-stub.tmp"
|
|
echo >&2
|
|
echo "dev-stub: staat op het klembord" >&2
|
|
fi
|
|
rm -f "$dir/.dev-stub.tmp"
|