Files
api/web/scripts/deploy-dev.sh
Eli Bosley 88087d5201 feat: mount vue apps, not web components (#1639)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Standalone web bundle with auto-mount utilities and a self-contained
test page.
* New responsive modal components for consistent mobile/desktop dialogs.
  * Header actions to copy OS/API versions.

* **Improvements**
* Refreshed UI styles (muted borders), accessibility and animation
refinements.
  * Theming updates and Tailwind v4–aligned, component-scoped styles.
  * Runtime GraphQL endpoint override and CSRF header support.

* **Bug Fixes**
* Safer network fetching and improved manifest/asset loading with
duplicate protection.

* **Tests/Chores**
* Parallel plugin tests, new extractor test suite, and updated
build/test scripts.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-09-03 15:42:21 -04:00

154 lines
4.8 KiB
Bash
Executable File

#!/bin/bash
# Check if the server name is provided
if [[ -z "$1" ]]; then
echo "Error: SSH server name is required."
echo "Usage: $0 <server_name>"
exit 1
fi
# Set server name from command-line argument
server_name="$1"
# Source directory paths
standalone_directory=".nuxt/standalone-apps/"
# Check what we have to deploy
has_standalone=false
if [ -d "$standalone_directory" ]; then
has_standalone=true
fi
# Exit if standalone directory doesn't exist
if [ "$has_standalone" = false ]; then
echo "Error: Standalone apps directory does not exist."
echo "Please run 'pnpm build' or 'pnpm build:standalone' first."
exit 1
fi
exit_code=0
# Deploy standalone apps if they exist
if [ "$has_standalone" = true ]; then
echo "Deploying standalone apps..."
# Ensure remote directory exists
ssh root@"${server_name}" "mkdir -p /usr/local/emhttp/plugins/dynamix.my.servers/unraid-components/standalone/"
# Run rsync with proper quoting
rsync -avz --delete -e "ssh" "$standalone_directory" "root@${server_name}:/usr/local/emhttp/plugins/dynamix.my.servers/unraid-components/standalone/"
standalone_exit_code=$?
# If standalone rsync failed, update exit_code
if [ $standalone_exit_code -ne 0 ]; then
exit_code=$standalone_exit_code
fi
fi
# Update the auth-request.php file to include the new web component JS
update_auth_request() {
local server_name="$1"
# SSH into server and update auth-request.php
ssh "root@${server_name}" bash -s << 'EOF'
AUTH_REQUEST_FILE='/usr/local/emhttp/auth-request.php'
UNRAID_COMPS_DIR='/usr/local/emhttp/plugins/dynamix.my.servers/unraid-components/'
# Find ALL JS/MJS/CSS files under unraid-components
if [ -d "$UNRAID_COMPS_DIR" ]; then
mapfile -t FILES_TO_ADD < <(find "$UNRAID_COMPS_DIR" -type f \( -name "*.js" -o -name "*.mjs" -o -name "*.css" \) | sed 's|/usr/local/emhttp||' | sort -u)
else
echo "Unraid components directory not found"
exit 1
fi
if grep -q '\$arrWhitelist' "$AUTH_REQUEST_FILE"; then
# Create a timestamped backup
TIMESTAMP=$(date +%s)
BACKUP_FILE="${AUTH_REQUEST_FILE}.bak.${TIMESTAMP}"
TEMP_FILE="${AUTH_REQUEST_FILE}.tmp.new"
# Create backup
cp "$AUTH_REQUEST_FILE" "$BACKUP_FILE" || {
echo "Failed to create backup of $AUTH_REQUEST_FILE" >&2
exit 1
}
# Clean up any existing temp file
rm -f "$TEMP_FILE"
# Process the file through both stages using a pipeline
# First remove existing web component entries, then add new ones
awk '
BEGIN { in_array = 0 }
/\$arrWhitelist\s*=\s*\[/ {
in_array = 1
print $0
next
}
in_array && /^\s*\]/ {
in_array = 0
print $0
next
}
!in_array || !/\/plugins\/dynamix\.my\.servers\/unraid-components\/.*\.(m?js|css)/ {
print $0
}
' "$AUTH_REQUEST_FILE" | \
awk -v files_to_add="$(printf '%s\n' "${FILES_TO_ADD[@]}" | sed "s/'/\\\\'/g" | sort -u | awk '{printf " \047%s\047,\n", $0}')" '
/\$arrWhitelist\s*=\s*\[/ {
print $0
print files_to_add
next
}
{ print }
' > "$TEMP_FILE"
# Check pipeline succeeded and temp file is non-empty
if [ ${PIPESTATUS[0]} -ne 0 ] || [ ${PIPESTATUS[1]} -ne 0 ] || [ ! -s "$TEMP_FILE" ]; then
echo "Failed to process $AUTH_REQUEST_FILE" >&2
rm -f "$TEMP_FILE"
exit 1
fi
# Verify the temp file has the expected content
if ! grep -q '\$arrWhitelist' "$TEMP_FILE" 2>/dev/null; then
echo "Generated file does not contain \$arrWhitelist array" >&2
rm -f "$TEMP_FILE"
exit 1
fi
# Atomically replace the original file
mv "$TEMP_FILE" "$AUTH_REQUEST_FILE" || {
echo "Failed to update $AUTH_REQUEST_FILE" >&2
rm -f "$TEMP_FILE"
exit 1
}
echo "Updated $AUTH_REQUEST_FILE with new web component JS files (backup: $BACKUP_FILE)"
else
echo "\$arrWhitelist array not found in $AUTH_REQUEST_FILE" >&2
exit 1
fi
EOF
}
update_auth_request "$server_name"
auth_request_exit_code=$?
# If auth request update failed, update exit_code
if [ $auth_request_exit_code -ne 0 ]; then
exit_code=$auth_request_exit_code
fi
# Play built-in sound based on the operating system
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
afplay /System/Library/Sounds/Glass.aiff
elif [[ "$OSTYPE" == "linux-gnu" ]]; then
# Linux
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then
# Windows
powershell.exe -c "(New-Object Media.SoundPlayer 'C:\Windows\Media\Windows Default.wav').PlaySync()"
fi
# Exit with the final exit code (non-zero if any command failed)
exit $exit_code