From 153c203a89e5beecb625d147d1e80b41df476519 Mon Sep 17 00:00:00 2001 From: Daniel Han Date: Wed, 18 Mar 2026 05:59:42 +0000 Subject: [PATCH] Fix frontend rebuild detection and decouple oxc-validator install Address review feedback: - Check entire frontend/ directory for changes, not just src/. The build also depends on package.json, vite.config.ts, tailwind.config.ts, public/, and other config files. A change to any of these now triggers a rebuild. - Move oxc-validator npm install outside the frontend build gate in setup.sh so it always runs on setup, matching setup.ps1 which already had it outside the gate. --- studio/setup.ps1 | 16 ++++++++++++---- studio/setup.sh | 24 +++++++++++++++++------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/studio/setup.ps1 b/studio/setup.ps1 index 07eaf0ce92..e9a211eb45 100644 --- a/studio/setup.ps1 +++ b/studio/setup.ps1 @@ -749,17 +749,25 @@ Write-Host "" # PHASE 2: Frontend build (skip if pip-installed -- already bundled) # ========================================================================== $DistDir = Join-Path $FrontendDir "dist" -$SrcDir = Join-Path $FrontendDir "src" -# Skip build if dist/ exists and no source file is newer than dist/ +# Skip build if dist/ exists and no tracked input is newer than dist/. +# Checks src/, public/, package.json, config files -- not just src/. $NeedFrontendBuild = $true if ($IsPipInstall) { $NeedFrontendBuild = $false Write-Host "[OK] Running from pip install - frontend already bundled, skipping build" -ForegroundColor Green } elseif (Test-Path $DistDir) { $DistTime = (Get-Item $DistDir).LastWriteTime - $NewerSrc = Get-ChildItem -Path $SrcDir -Recurse -File -ErrorAction SilentlyContinue | + # Check src/ and public/ recursively + $NewerFile = Get-ChildItem -Path $FrontendDir -Include "src","public" -Directory -ErrorAction SilentlyContinue | + ForEach-Object { Get-ChildItem -Path $_.FullName -Recurse -File -ErrorAction SilentlyContinue } | Where-Object { $_.LastWriteTime -gt $DistTime } | Select-Object -First 1 - if (-not $NewerSrc) { + # Also check top-level config files (package.json, vite.config.ts, etc.) + if (-not $NewerFile) { + $NewerFile = Get-ChildItem -Path $FrontendDir -File -ErrorAction SilentlyContinue | + Where-Object { $_.Name -match '\.(json|ts|js|mjs)$' -and $_.LastWriteTime -gt $DistTime } | + Select-Object -First 1 + } + if (-not $NewerFile) { $NeedFrontendBuild = $false Write-Host "[OK] Frontend already built and up to date -- skipping build" -ForegroundColor Green } else { diff --git a/studio/setup.sh b/studio/setup.sh index 758dc6676a..2c93d57f78 100755 --- a/studio/setup.sh +++ b/studio/setup.sh @@ -41,14 +41,19 @@ if [[ "$keynames" == *$'\nCOLAB_'* ]]; then fi # ── Detect whether frontend needs building ── -# Skip if dist/ exists AND no source file is newer than dist/. +# Skip if dist/ exists AND no tracked input is newer than dist/. +# Checks src/, public/, package.json, config files -- not just src/. # This handles: PyPI installs (dist/ bundled), repeat runs (no changes), # and upgrades/pulls (source newer than dist/ triggers rebuild). _NEED_FRONTEND_BUILD=true if [ -d "$SCRIPT_DIR/frontend/dist" ]; then - # Check if any src/ file is newer than dist/ - _newest_src=$(find "$SCRIPT_DIR/frontend/src" -type f -newer "$SCRIPT_DIR/frontend/dist" 2>/dev/null | head -1) - if [ -z "$_newest_src" ]; then + _changed=$(find "$SCRIPT_DIR/frontend" -maxdepth 1 -name "*.json" -o -name "*.ts" -o -name "*.js" -o -name "*.mjs" | \ + xargs -r find -newer "$SCRIPT_DIR/frontend/dist" 2>/dev/null | head -1) + if [ -z "$_changed" ]; then + _changed=$(find "$SCRIPT_DIR/frontend/src" "$SCRIPT_DIR/frontend/public" \ + -type f -newer "$SCRIPT_DIR/frontend/dist" 2>/dev/null | head -1) + fi + if [ -z "$_changed" ]; then _NEED_FRONTEND_BUILD=false fi fi @@ -152,12 +157,17 @@ run_quiet "npm run build" npm run build _restore_gitignores trap - EXIT -cd "$SCRIPT_DIR/backend/core/data_recipe/oxc-validator" -run_quiet "npm install (oxc validator runtime)" npm install cd "$SCRIPT_DIR" echo "✅ Frontend built to frontend/dist" -fi # end frontend dist check +fi # end frontend build check + +# ── oxc-validator runtime (always install, independent of frontend build) ── +if [ -d "$SCRIPT_DIR/backend/core/data_recipe/oxc-validator" ]; then + cd "$SCRIPT_DIR/backend/core/data_recipe/oxc-validator" + run_quiet "npm install (oxc validator runtime)" npm install + cd "$SCRIPT_DIR" +fi # ── 6. Python venv + deps ──