Fix regressions around deleting preview sites#2903
Merged
fredrikekelund merged 5 commits intotrunkfrom Mar 26, 2026
Merged
Conversation
Collaborator
📊 Performance Test ResultsComparing 99835ac vs trunk app-size
site-editor
site-startup
Results are median values from multiple test runs. Legend: 🟢 Improvement (faster) | 🔴 Regression (slower) | ⚪ No change (<50ms diff) |
fredrikekelund
commented
Mar 25, 2026
| 'site-context-menu-action': [ { action: string; siteId: string } ]; | ||
| 'site-event': [ SiteEvent ]; | ||
| 'snapshot-changed': [ SnapshotEvent ]; | ||
| 'snapshot-event': [ SnapshotEvent ]; |
Contributor
Author
There was a problem hiding this comment.
Nitpicky. It's just that this event no longer always captures the details for a single snapshot, so I found this to be a better name.
bcotrim
approved these changes
Mar 25, 2026
Contributor
bcotrim
left a comment
There was a problem hiding this comment.
Works as described
Code LGTM and nice improvements 👍
fredrikekelund
added a commit
that referenced
this pull request
Mar 26, 2026
* Support deleting all preview sites from CLI and app * Update tests * Fix * Improve schemas and types * Tweak
fredrikekelund
added a commit
that referenced
this pull request
Mar 26, 2026
* [skip ci] Code freeze: Update translatable strings for 1.7.7 * [skip ci] Code freeze: Add draft release notes for 1.7.7 * Fix Prettier lint error in ipc-handlers import statement (#2893) * Update Studio CLI settings toggle copy and layout (#2855) * Update Studio CLI toggle copy and layout Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Fix unit tests to follow UI change --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Wojtek Naruniec <wojtek@naruniec.me> * Studio: Borders don't have correct colors in dark mode (#2885) * Add rule for buttons borders * Improve comment --------- Co-authored-by: Kateryna Kodonenko <kateryna@automattic.com> * [skip ci] Update translations * [skip ci] Bump version to 1.7.7-beta1 * Update CLI version * Preliminary release notes cleanup * Fix: CLI doesn't generate site thumbnails (#2850) * Consolidate thumbnail capture to shared CLI path Create a single thumbnail capture path through captureSiteThumbnail() that is used by both the desktop UI (loadThemeDetails) and CLI events subscriber. This eliminates duplication and uses pendingCaptures deduplication to prevent concurrent BrowserWindow creation when the same site is captured by multiple paths simultaneously. * remove comments * Use sequential util with deduplicateKey for thumbnail capture * Fix E2E copy-site test targeting wrong BrowserWindow The thumbnail capture feature creates hidden BrowserWindows for screenshots. The copy-site test used getAllWindows()[0] to send the IPC event, which could target the screenshot window instead of the main app window, causing the copy action to silently fail. Use getFocusedWindow() with a visible-window fallback instead. --------- Co-authored-by: katinthehatsite <katerynakodonenko@gmail.com> * Disable Redis/memcached when JSPI is unavailable (#2900) * Disable Redis and memcached PHP extensions when JSPI is unavailable These extensions require JSPI (JavaScript Promise Integration), which is only available in Node.js 24+. On Node <24, enabling them crashes the WordPress server at startup. This conditionally disables them when JSPI isn't available, matching the pattern in process-manager-daemon.ts. Also bumps the minimum engine version to >=24.0.0 since the production build strips asyncify binaries, making Node 24+ a de facto requirement. * Revert engine version bump to >=22.0.0 * Sort sites by sortOrder when loading from IPC (#2902) * Fix regressions around deleting preview sites (#2903) * Support deleting all preview sites from CLI and app * Update tests * Fix * Improve schemas and types * Tweak * Fix JSPI detection using runtime feature check (#2906) * Fix JSPI detection using runtime feature check instead of Node version Replace semver.gte(process.version, '24.0.0') with a runtime check for WebAssembly.promising to detect JSPI availability. The version check assumed Node 24+ has JSPI enabled by default, but it requires the --experimental-wasm-jspi flag. This caused "Redis extension requires JSPI" errors when running CLI commands directly without the flag. Extract the check into a shared isJspiAvailable helper in tools/common/lib/jspi.ts so there is a single source of truth. * Remove unverified claim about JSPI proposal stage from comment * Fix linting * Address review suggestions * Pass `--experimental-wasm-jspi` to node in bin script --------- Co-authored-by: Fredrik Rombach Ekelund <fredrik.rombach.ekelund@automattic.com> * [skip ci] Update translations * [skip ci] Bump version to 1.7.7-beta2 * Minuscule CLI README tweak (#2917) * Minuscule CLI README tweak * Fix tests * Address review comments * Rename `appdata-v1.json` to `appdata-v1.deprecated.json` (#2916) * Rename `appdata-v1.json` to `appdata-v1.deprecated.json` * Fix tests * Fix tests * Fix tests * Fix What's New current step icon color in dark mode (#2921) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Update release notes for 1.7.7 (#2905) * Update release notes for 1.7.7 * Address review suggestions * Ensure that language packs are bundled in `wp-files` (#2922) * Add phpMyAdmin to What's New dialog (#2920) * Add phpMyAdmin to What's New dialog Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Improve wording * Force What's New for next version * Update phpMyAdmin illustration with dot grid background Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Shaun Andrews <shaun@automattic.com> * Refactor and clean up site deletion logic in app (#2915) * Refactor site deletion in app * Nit fix * [skip ci] Bump version to 1.7.7-beta3 --------- Co-authored-by: Roberto Aranda <roberto.aranda@automattic.com> Co-authored-by: Shaun Andrews <shaun@automattic.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Wojtek Naruniec <wojtek@naruniec.me> Co-authored-by: katinthehatsite <katerynakodonenko@gmail.com> Co-authored-by: Kateryna Kodonenko <kateryna@automattic.com> Co-authored-by: Fredrik Rombach Ekelund <fredrik.rombach.ekelund@automattic.com> Co-authored-by: Gergely Csécsey <gergely.csecsey@automattic.com> Co-authored-by: Ivan Ottinger <ivan.ottinger@automattic.com> Co-authored-by: Bernardo Cotrim <bmmcotrim@gmail.com> Co-authored-by: Fredrik Rombach Ekelund <fredrik@f26d.dev> Co-authored-by: Antonio Sejas <antonio.sejas@automattic.com> Co-authored-by: Wojtek Naruniec <wojtek.naruniec@automattic.com>
fredrikekelund
added a commit
that referenced
this pull request
Mar 27, 2026
* [skip ci] Code freeze: Update translatable strings for 1.7.7 * [skip ci] Code freeze: Add draft release notes for 1.7.7 * Fix Prettier lint error in ipc-handlers import statement (#2893) * Update Studio CLI settings toggle copy and layout (#2855) * Update Studio CLI toggle copy and layout Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Fix unit tests to follow UI change --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Wojtek Naruniec <wojtek@naruniec.me> * Studio: Borders don't have correct colors in dark mode (#2885) * Add rule for buttons borders * Improve comment --------- Co-authored-by: Kateryna Kodonenko <kateryna@automattic.com> * [skip ci] Update translations * [skip ci] Bump version to 1.7.7-beta1 * Update CLI version * Preliminary release notes cleanup * Fix: CLI doesn't generate site thumbnails (#2850) * Consolidate thumbnail capture to shared CLI path Create a single thumbnail capture path through captureSiteThumbnail() that is used by both the desktop UI (loadThemeDetails) and CLI events subscriber. This eliminates duplication and uses pendingCaptures deduplication to prevent concurrent BrowserWindow creation when the same site is captured by multiple paths simultaneously. * remove comments * Use sequential util with deduplicateKey for thumbnail capture * Fix E2E copy-site test targeting wrong BrowserWindow The thumbnail capture feature creates hidden BrowserWindows for screenshots. The copy-site test used getAllWindows()[0] to send the IPC event, which could target the screenshot window instead of the main app window, causing the copy action to silently fail. Use getFocusedWindow() with a visible-window fallback instead. --------- Co-authored-by: katinthehatsite <katerynakodonenko@gmail.com> * Disable Redis/memcached when JSPI is unavailable (#2900) * Disable Redis and memcached PHP extensions when JSPI is unavailable These extensions require JSPI (JavaScript Promise Integration), which is only available in Node.js 24+. On Node <24, enabling them crashes the WordPress server at startup. This conditionally disables them when JSPI isn't available, matching the pattern in process-manager-daemon.ts. Also bumps the minimum engine version to >=24.0.0 since the production build strips asyncify binaries, making Node 24+ a de facto requirement. * Revert engine version bump to >=22.0.0 * Sort sites by sortOrder when loading from IPC (#2902) * Fix regressions around deleting preview sites (#2903) * Support deleting all preview sites from CLI and app * Update tests * Fix * Improve schemas and types * Tweak * Fix JSPI detection using runtime feature check (#2906) * Fix JSPI detection using runtime feature check instead of Node version Replace semver.gte(process.version, '24.0.0') with a runtime check for WebAssembly.promising to detect JSPI availability. The version check assumed Node 24+ has JSPI enabled by default, but it requires the --experimental-wasm-jspi flag. This caused "Redis extension requires JSPI" errors when running CLI commands directly without the flag. Extract the check into a shared isJspiAvailable helper in tools/common/lib/jspi.ts so there is a single source of truth. * Remove unverified claim about JSPI proposal stage from comment * Fix linting * Address review suggestions * Pass `--experimental-wasm-jspi` to node in bin script --------- Co-authored-by: Fredrik Rombach Ekelund <fredrik.rombach.ekelund@automattic.com> * [skip ci] Update translations * [skip ci] Bump version to 1.7.7-beta2 * Minuscule CLI README tweak (#2917) * Minuscule CLI README tweak * Fix tests * Address review comments * Rename `appdata-v1.json` to `appdata-v1.deprecated.json` (#2916) * Rename `appdata-v1.json` to `appdata-v1.deprecated.json` * Fix tests * Fix tests * Fix tests * Fix What's New current step icon color in dark mode (#2921) Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Update release notes for 1.7.7 (#2905) * Update release notes for 1.7.7 * Address review suggestions * Ensure that language packs are bundled in `wp-files` (#2922) * Add phpMyAdmin to What's New dialog (#2920) * Add phpMyAdmin to What's New dialog Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Improve wording * Force What's New for next version * Update phpMyAdmin illustration with dot grid background Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Shaun Andrews <shaun@automattic.com> * Refactor and clean up site deletion logic in app (#2915) * Refactor site deletion in app * Nit fix * [skip ci] Bump version to 1.7.7-beta3 * Emit `deleted` site event when removing empty site (#2929) * Bump CLI version * [skip ci] Update translations * [skip ci] Bump version to 1.7.7 * [skip ci] Bump CLI version to 1.7.7 --------- Co-authored-by: Roberto Aranda <roberto.aranda@automattic.com> Co-authored-by: Shaun Andrews <shaun@automattic.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Wojtek Naruniec <wojtek@naruniec.me> Co-authored-by: katinthehatsite <katerynakodonenko@gmail.com> Co-authored-by: Kateryna Kodonenko <kateryna@automattic.com> Co-authored-by: Fredrik Rombach Ekelund <fredrik.rombach.ekelund@automattic.com> Co-authored-by: Gergely Csécsey <gergely.csecsey@automattic.com> Co-authored-by: Ivan Ottinger <ivan.ottinger@automattic.com> Co-authored-by: Bernardo Cotrim <bmmcotrim@gmail.com> Co-authored-by: Fredrik Rombach Ekelund <fredrik@f26d.dev> Co-authored-by: Antonio Sejas <antonio.sejas@automattic.com> Co-authored-by: Wojtek Naruniec <wojtek.naruniec@automattic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Related issues
How AI was used in this PR
Only to update
delete.test.ts.Proposed Changes
#2807 introduced two regressions:
The app no longer has direct access to the config file where the snapshots live (
cli.json), so the old strategy for the "Delete all preview sites" button of simply emptying thesnapshotsarray in the config file no longer works.I considered iterating over the snapshots and deleting them from
snapshot-slice.tswith a "bulk operation". That's how we used to do it before #1950, but that PR improved on what we had, so ideally we want to keep that behavior.In the end, my solution was to:
--alloption to thepreview deleteCLI command.preview delete --allcommand when the user clicks the "Delete all preview sites" button.preview delete <url>command. I added anoptimisticprop to those actions so the sites disappear immediately from the UI, without the progress bar we normally show for delete operations.Testing Instructions
npm start~/.studio/cli.jsondatefield for the snapshot. Change it toDate.now() - 604800000 * 2(two weeks ago)Pre-merge Checklist