#!/usr/bin/env fish # den.js build: minify, obfuscate, syntax-check, bump cache version. # needs: npm install -g terser javascript-obfuscator set -l src src/den.js set -l min build/den.min.js set -l obf build/den.obf.js set -l banner "/* den.js - an invisible kobold. (c) 2026 owo.ing. hands off the hoard. */" if not test -f $src echo "no $src here. run this from the repo root." exit 1 end mkdir -p build echo ":: minifying" terser $src --compress passes=2 --mangle --format ascii_only=true -o $min or begin echo "terser failed" exit 1 end echo ":: obfuscating" javascript-obfuscator $src --output $obf \ --compact true \ --self-defending true \ --string-array true --string-array-encoding base64 --string-array-threshold 0.9 \ --string-array-rotate true --string-array-shuffle true \ --control-flow-flattening true --control-flow-flattening-threshold 0.4 \ --dead-code-injection true --dead-code-injection-threshold 0.2 \ --unicode-escape-sequence false or begin echo "obfuscator failed" exit 1 end echo ":: syntax check" node --check $min; and node --check $obf or begin echo "SYNTAX CHECK FAILED - not touching your pages" exit 1 end # banner goes on after the tools run, or they'd strip it for f in $min $obf set -l tmp (mktemp) echo $banner > $tmp cat $f >> $tmp mv $tmp $f end # bump ?v=N wherever a build is referenced, so browsers actually refetch set -l bumped 0 for f in *.php example/*.html example/*.php test -f $f; or continue set -l cur (grep -oP 'den\.(min|obf)\.js\?v=\K\d+' $f | head -1) if test -n "$cur" set -l new (math $cur + 1) sed -i "s/\(den\.\(min\|obf\)\.js?v=\)$cur/\1$new/g" $f echo " $f: v$cur -> v$new" set bumped (math $bumped + 1) end end if test $bumped -eq 0 echo " (no pages with ?v= found - remember to bust cache yourself)" end echo ":: done" ls -la $src $min $obf | awk '{printf " %8s %s\n", $5, $9}'