#!/usr/bin/env bash BOLD='\033[0;1m' EXTENSIONS=("${EXTENSIONS}") VSCODE_WEB="${INSTALL_PREFIX}/bin/code-server" # Set extension directory EXTENSION_ARG="" if [ -n "${EXTENSIONS_DIR}" ]; then EXTENSION_ARG="--extensions-dir=${EXTENSIONS_DIR}" fi run_vscode_web() { echo "👷 Running $VSCODE_WEB serve-local $EXTENSION_ARG --port ${PORT} --host 127.0.0.1 --accept-server-license-terms --without-connection-token --telemetry-level ${TELEMETRY_LEVEL} in the background..." echo "Check logs at ${LOG_PATH}!" "$VSCODE_WEB" serve-local "$EXTENSION_ARG" --port "${PORT}" --host 127.0.0.1 --accept-server-license-terms --without-connection-token --telemetry-level "${TELEMETRY_LEVEL}" > "${LOG_PATH}" 2>&1 & } # Check if the settings file exists... if [ ! -f ~/.vscode-server/data/Machine/settings.json ]; then echo "⚙️ Creating settings file..." mkdir -p ~/.vscode-server/data/Machine echo "${SETTINGS}" > ~/.vscode-server/data/Machine/settings.json fi # Check if vscode-server is already installed for offline or cached mode if [ -f "$VSCODE_WEB" ]; then if [ "${OFFLINE}" = true ] || [ "${USE_CACHED}" = true ]; then echo "🥳 Found a copy of VS Code Web" run_vscode_web exit 0 fi fi # Offline mode always expects a copy of vscode-server to be present if [ "${OFFLINE}" = true ]; then echo "Failed to find a copy of VS Code Web" exit 1 fi # Create install prefix mkdir -p ${INSTALL_PREFIX} printf "$${BOLD}Installing Microsoft Visual Studio Code Server!\n" # Download and extract vscode-server ARCH=$(uname -m) case "$ARCH" in x86_64) ARCH="x64" ;; aarch64) ARCH="arm64" ;; *) echo "Unsupported architecture" exit 1 ;; esac HASH=$(curl -fsSL https://update.code.visualstudio.com/api/commits/stable/server-linux-$ARCH-web | cut -d '"' -f 2) output=$(curl -fsSL https://vscode.download.prss.microsoft.com/dbazure/download/stable/$HASH/vscode-server-linux-$ARCH-web.tar.gz | tar -xz -C ${INSTALL_PREFIX} --strip-components 1) if [ $? -ne 0 ]; then echo "Failed to install Microsoft Visual Studio Code Server: $output" exit 1 fi printf "$${BOLD}VS Code Web has been installed.\n" # Install each extension... IFS=',' read -r -a EXTENSIONLIST <<< "$${EXTENSIONS}" for extension in "$${EXTENSIONLIST[@]}"; do if [ -z "$extension" ]; then continue fi printf "🧩 Installing extension $${CODE}$extension$${RESET}...\n" output=$($VSCODE_WEB "$EXTENSION_ARG" --install-extension "$extension" --force) if [ $? -ne 0 ]; then echo "Failed to install extension: $extension: $output" fi done if [ "${AUTO_INSTALL_EXTENSIONS}" = true ]; then if ! command -v jq > /dev/null; then echo "jq is required to install extensions from a workspace file." else WORKSPACE_DIR="$HOME" if [ -n "${FOLDER}" ]; then WORKSPACE_DIR="${FOLDER}" fi if [ -f "$WORKSPACE_DIR/.vscode/extensions.json" ]; then printf "🧩 Installing extensions from %s/.vscode/extensions.json...\n" "$WORKSPACE_DIR" extensions=$(jq -r '.recommendations[]' "$WORKSPACE_DIR"/.vscode/extensions.json) for extension in $extensions; do $VSCODE_WEB "$EXTENSION_ARG" --install-extension "$extension" --force done fi fi fi run_vscode_web