#!/usr/bin/env bash set -euo pipefail on_error() { echo "A2UI bundling failed. Re-run with: pnpm canvas:a2ui:bundle" >&2 echo "If this persists, verify pnpm deps and try again." >&2 } trap on_error ERR ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" HASH_FILE="$ROOT_DIR/src/canvas-host/a2ui/.bundle.hash" OUTPUT_FILE="$ROOT_DIR/src/canvas-host/a2ui/a2ui.bundle.js" A2UI_RENDERER_DIR="$ROOT_DIR/vendor/a2ui/renderers/lit" A2UI_APP_DIR="$ROOT_DIR/apps/shared/MoltbotKit/Tools/CanvasA2UI" # Docker builds exclude vendor/apps via .dockerignore. # In that environment we must keep the prebuilt bundle. if [[ ! -d "$A2UI_RENDERER_DIR" || ! -d "$A2UI_APP_DIR" ]]; then echo "A2UI sources missing; keeping prebuilt bundle." exit 0 fi INPUT_PATHS=( "$ROOT_DIR/package.json" "$ROOT_DIR/pnpm-lock.yaml" "$A2UI_RENDERER_DIR" "$A2UI_APP_DIR" ) compute_hash() { ROOT_DIR="$ROOT_DIR" node --input-type=module - "${INPUT_PATHS[@]}" <<'NODE' import { createHash } from "node:crypto"; import { promises as fs } from "node:fs"; import path from "node:path"; const rootDir = process.env.ROOT_DIR ?? process.cwd(); const inputs = process.argv.slice(2); const files = []; async function walk(entryPath) { const st = await fs.stat(entryPath); if (st.isDirectory()) { const entries = await fs.readdir(entryPath); for (const entry of entries) { await walk(path.join(entryPath, entry)); } return; } files.push(entryPath); } compute_hash() { # Use sha256sum on Linux/Windows (Git Bash), shasum on macOS local sha_cmd if command -v sha256sum &>/dev/null; then sha_cmd="sha256sum" elif command -v shasum &>/dev/null; then sha_cmd="shasum -a 256" else echo "No sha256 tool found (sha256sum or shasum)" >&2 exit 1 fi collect_files \ | LC_ALL=C sort -z \ | xargs -0 $sha_cmd \ | $sha_cmd \ | awk '{print $1}' } current_hash="$(compute_hash)" if [[ -f "$HASH_FILE" ]]; then previous_hash="$(cat "$HASH_FILE")" if [[ "$previous_hash" == "$current_hash" && -f "$OUTPUT_FILE" ]]; then echo "A2UI bundle up to date; skipping." exit 0 fi fi pnpm -s exec tsc -p "$A2UI_RENDERER_DIR/tsconfig.json" rolldown -c "$A2UI_APP_DIR/rolldown.config.mjs" echo "$current_hash" > "$HASH_FILE"