#!/usr/bin/env bash # # surfaces/build.sh — Package each surface subdirectory into a .surface archive. # # Usage: # ./surfaces/build.sh # build all # ./surfaces/build.sh icd-test-runner # build one # # Output: dist/.surface (zip archives, ready for POST /admin/surfaces/install) # set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" DIST_DIR="$(cd "$SCRIPT_DIR/.." && pwd)/dist" mkdir -p "$DIST_DIR" build_surface() { local dir="$1" local name name="$(basename "$dir")" if [ ! -f "$dir/manifest.json" ]; then echo " SKIP $name (no manifest.json)" return fi local version version=$(grep -o '"version"[[:space:]]*:[[:space:]]*"[^"]*"' "$dir/manifest.json" | head -1 | sed 's/.*"\([^"]*\)"/\1/') local out="$DIST_DIR/${name}.surface" rm -f "$out" # Zip whichever standard dirs exist alongside manifest.json local dirs="" [ -d "$dir/js" ] && dirs="$dirs js/" [ -d "$dir/css" ] && dirs="$dirs css/" [ -d "$dir/assets" ] && dirs="$dirs assets/" (cd "$dir" && zip -qr "$out" manifest.json $dirs) local size size=$(du -h "$out" | cut -f1) echo " BUILD $name v${version:-?} → dist/${name}.surface ($size)" } echo "=== Building surfaces ===" if [ $# -gt 0 ]; then # Build specific surface(s) for name in "$@"; do dir="$SCRIPT_DIR/$name" if [ -d "$dir" ]; then build_surface "$dir" else echo " ERROR $name: directory not found at $dir" exit 1 fi done else # Build all for dir in "$SCRIPT_DIR"/*/; do [ -d "$dir" ] || continue build_surface "$dir" done fi echo "=== Done ===" ls -lh "$DIST_DIR"/*.surface 2>/dev/null || echo " (no surfaces built)"