You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.6 KiB
97 lines
2.6 KiB
#!/usr/bin/env bash |
|
# scripts/update-embedded-web.sh |
|
# Build the embedded web UI and then install the Go binary. |
|
# |
|
# This script will: |
|
# - Build the React app in app/web to app/web/dist using Bun (preferred), |
|
# or fall back to npm/yarn/pnpm if Bun isn't available. |
|
# - Run `go install` from the repository root so the binary picks up the new |
|
# embedded assets. |
|
# |
|
# Usage: |
|
# ./scripts/update-embedded-web.sh |
|
# |
|
# Requirements: |
|
# - Go 1.18+ installed (for `go install` and go:embed support) |
|
# - Bun (https://bun.sh) recommended; alternatively Node.js with npm/yarn/pnpm |
|
# |
|
set -euo pipefail |
|
|
|
# Resolve repo root to allow running from anywhere |
|
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" |
|
REPO_ROOT="$(cd -- "${SCRIPT_DIR}/.." && pwd)" |
|
WEB_DIR="${REPO_ROOT}/app/web" |
|
|
|
log() { printf "[update-embedded-web] %s\n" "$*"; } |
|
err() { printf "[update-embedded-web][ERROR] %s\n" "$*" >&2; } |
|
|
|
if [[ ! -d "${WEB_DIR}" ]]; then |
|
err "Expected web directory at ${WEB_DIR} not found." |
|
exit 1 |
|
fi |
|
|
|
# Choose a JS package runner |
|
JS_RUNNER="" |
|
if command -v bun >/dev/null 2>&1; then |
|
JS_RUNNER="bun" |
|
elif command -v npm >/dev/null 2>&1; then |
|
JS_RUNNER="npm" |
|
elif command -v yarn >/dev/null 2>&1; then |
|
JS_RUNNER="yarn" |
|
elif command -v pnpm >/dev/null 2>&1; then |
|
JS_RUNNER="pnpm" |
|
else |
|
err "No JavaScript package manager found. Install Bun (recommended) or npm/yarn/pnpm." |
|
exit 1 |
|
fi |
|
|
|
log "Using JavaScript runner: ${JS_RUNNER}" |
|
|
|
# Install dependencies and build the web app |
|
log "Installing frontend dependencies..." |
|
pushd "${WEB_DIR}" >/dev/null |
|
case "${JS_RUNNER}" in |
|
bun) |
|
bun install |
|
log "Building web app with Bun..." |
|
bun run build |
|
;; |
|
npm) |
|
npm ci || npm install |
|
log "Building web app with npm..." |
|
npm run build |
|
;; |
|
yarn) |
|
yarn install --frozen-lockfile || yarn install |
|
log "Building web app with yarn..." |
|
yarn build |
|
;; |
|
pnpm) |
|
pnpm install --frozen-lockfile || pnpm install |
|
log "Building web app with pnpm..." |
|
pnpm build |
|
;; |
|
*) |
|
err "Unsupported JS runner: ${JS_RUNNER}" |
|
exit 1 |
|
;; |
|
|
|
esac |
|
popd >/dev/null |
|
|
|
# Verify the output directory expected by go:embed exists |
|
DIST_DIR="${WEB_DIR}/dist" |
|
if [[ ! -d "${DIST_DIR}" ]]; then |
|
err "Build did not produce ${DIST_DIR}. Check your frontend build configuration." |
|
exit 1 |
|
fi |
|
|
|
log "Frontend build complete at ${DIST_DIR}." |
|
|
|
# Install the Go binary so it embeds the latest files |
|
log "Running 'go install' from repo root..." |
|
pushd "${REPO_ROOT}" >/dev/null |
|
GO111MODULE=on go install ./... |
|
popd >/dev/null |
|
|
|
log "Done. Your installed binary now includes the updated embedded web UI." |