Skip to content

fix: sync node.imgs for legacy context menu in Vue Nodes mode#8143

Draft
christian-byrne wants to merge 2 commits intomainfrom
fix/sync-node-imgs-legacy-context-menu
Draft

fix: sync node.imgs for legacy context menu in Vue Nodes mode#8143
christian-byrne wants to merge 2 commits intomainfrom
fix/sync-node-imgs-legacy-context-menu

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Jan 18, 2026

Summary

Fixes missing "Copy Image", "Open Image", "Save Image", and "Open in Mask Editor" context menu options on SaveImage nodes when Vue Nodes mode is enabled.

Changes

  • Add syncLegacyNodeImgs store method to sync loaded image elements to node.imgs
  • Call sync on image load in ImagePreview component
  • Simplify mask editor handling to call composable directly

Technical Details

  • Only runs when vueNodesMode is enabled (no impact on legacy mode)
  • Reuses already-loaded <img> element from Vue (no duplicate network requests)
  • Store owns the sync logic, component just hands off the element

Supersedes #7416

┆Issue is synchronized with this Notion page by Unito

Add syncLegacyNodeImgs store method to sync loaded image elements to
node.imgs for backwards compatibility with legacy systems (Copy Image,
Open Image, Save Image, Open in Mask Editor).

- Only runs when vueNodesMode is enabled
- Reuses already-loaded img element from Vue component (no duplicate loading)
- Store owns the sync logic, component just hands off the element
- Simplify mask editor handling to call composable directly

Fixes missing context menu options on SaveImage vue node.

Amp-Thread-ID: https://ampcode.com/threads/T-019bba3e-0ad8-754a-bd50-5cf17165d5a6
Co-authored-by: Amp <amp@ampcode.com>
@christian-byrne christian-byrne requested a review from a team as a code owner January 18, 2026 03:48
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jan 18, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 18, 2026

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

📝 Walkthrough

Walkthrough

The changes refactor image preview handling by introducing a new syncLegacyNodeImgs function for backward-compatibility with legacy Vue nodes, replace commandStore with useMaskEditor hook for mask editor operations, and add corresponding test coverage for the new functionality.

Changes

Cohort / File(s) Summary
Vue Component Refactoring
src/renderer/extensions/vueNodes/components/ImagePreview.vue
Removed image element ref (currentImageEl) and simplified reference handling; switched from commandStore to useMaskEditor hook; integrated syncLegacyNodeImgs call in handleImageLoad for legacy node image synchronization; removed setupNodeForMaskEditor function; updated imports.
Store Implementation
src/stores/imagePreviewStore.ts
Added new public function syncLegacyNodeImgs to sync loaded HTMLImageElement into legacy Vue node objects when vueNodesMode is active; imported LiteGraph to support mode detection.
Store Tests
src/stores/imagePreviewStore.test.ts
Added LiteGraph mock with mockGetNodeById helper; introduced comprehensive test suite for syncLegacyNodeImgs covering vueNodesMode toggling, numeric/string node ID handling, missing node scenarios, and default activeIndex behavior; refactored createMockNode for flexible test node construction.

Sequence Diagram

sequenceDiagram
    participant ImagePreview as ImagePreview.vue
    participant Handler as Event Handler
    participant Store as nodeOutputStore
    participant Graph as LiteGraph
    participant Mask as useMaskEditor
    
    rect rgba(200, 150, 255, 0.5)
    Note over ImagePreview,Graph: Image Load Flow with Legacy Sync
    ImagePreview->>ImagePreview: Image element loads
    ImagePreview->>Handler: handleImageLoad(nodeId)
    Handler->>Store: syncLegacyNodeImgs(nodeId, element)
    alt vueNodesMode enabled
        Store->>Graph: rootGraph.getNodeById(nodeId)
        Graph-->>Store: Node object
        Store->>Store: node.imgs = [element]<br/>node.imageIndex = activeIndex
    end
    end
    
    rect rgba(100, 200, 255, 0.5)
    Note over ImagePreview,Mask: Mask Editor Opening Flow
    ImagePreview->>ImagePreview: User clicks edit mask
    ImagePreview->>Handler: handleEditMask()
    Handler->>Mask: useMaskEditor().openMaskEditor(node)
    Mask->>Mask: Initialize mask editor with node
    end
Loading

Possibly related PRs

  • fix: image preview a11y #7252: Modifies ImagePreview.vue's image element reference handling and related event/state wiring, introducing imageWrapperEl and focus behavior while this PR removes currentImageEl—both involve image element ref refactoring in the same component.

Suggested reviewers

  • DrJKL
  • Myestery

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Jan 18, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/20/2026, 11:08:51 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 18, 2026

🎭 Playwright Tests: ❌ Failed

Results: 505 passed, 1 failed, 1 flaky, 8 skipped (Total: 515)

❌ Failed Tests

📊 Browser Reports
  • chromium: View Report (✅ 495 / ❌ 1 / ⚠️ 0 / ⏭️ 8)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 7 / ❌ 0 / ⚠️ 1 / ⏭️ 0)

@coderabbitai coderabbitai bot requested review from DrJKL and Myestery January 18, 2026 03:49
@github-actions
Copy link

github-actions bot commented Jan 18, 2026

Bundle Size Report

Summary

  • Raw size: 21.3 MB baseline 21.3 MB — 🔴 +75 B
  • Gzip: 4.43 MB baseline 4.43 MB — 🔴 +79 B
  • Brotli: 3.28 MB baseline 3.28 MB — 🔴 +271 B
  • Bundles: 155 current • 155 baseline • 65 added / 65 removed

Category Glance
Data & Services 🔴 +294 B (3.04 MB) · Graph Workspace 🟢 -219 B (1.02 MB) · Vendor & Third-Party ⚪ 0 B (10.4 MB) · Other ⚪ 0 B (6.25 MB) · Panels & Settings ⚪ 0 B (430 kB) · Views & Navigation ⚪ 0 B (80.7 kB) · + 5 more

Per-category breakdown
App Entry Points — 22.4 kB (baseline 22.4 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CNBKWQB8.js (new) 22.4 kB 🔴 +22.4 kB 🔴 +6.74 kB 🔴 +5.91 kB
assets/index-rQe1blsW.js (removed) 22.4 kB 🟢 -22.4 kB 🟢 -6.74 kB 🟢 -5.94 kB

Status: 1 added / 1 removed

Graph Workspace — 1.02 MB (baseline 1.02 MB) • 🟢 -219 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-C1pLySqn.js (removed) 1.02 MB 🟢 -1.02 MB 🟢 -201 kB 🟢 -153 kB
assets/GraphView-CstjRBFc.js (new) 1.02 MB 🔴 +1.02 MB 🔴 +201 kB 🔴 +153 kB

Status: 1 added / 1 removed

Views & Navigation — 80.7 kB (baseline 80.7 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-CAuQDWaF.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.61 kB 🔴 +3.06 kB
assets/CloudSurveyView-CyqXedkW.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.61 kB 🟢 -3.06 kB
assets/CloudLoginView-2A2xx4qf.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.1 kB 🟢 -2.72 kB
assets/CloudLoginView-BAQuu_n0.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.1 kB 🔴 +2.71 kB
assets/UserCheckView-66PQuT5K.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.46 kB 🟢 -2.13 kB
assets/UserCheckView-B-NYxgpi.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.45 kB 🔴 +2.13 kB
assets/CloudLayoutView-Be7EpShG.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.25 kB 🔴 +1.96 kB
assets/CloudLayoutView-CdBfS-Xw.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.25 kB 🟢 -1.97 kB
assets/CloudSignupView-BXUfa068.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.02 kB
assets/CloudSignupView-cdKLJx9O.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.33 kB 🔴 +2.03 kB
assets/CloudForgotPasswordView-BKNQ-4m5.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/CloudForgotPasswordView-EXRI05_7.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/UserSelectView-_6Q-BTa7.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.56 kB
assets/UserSelectView-B03WJrtw.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.56 kB
assets/CloudSubscriptionRedirectView-CHNqT_W2.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.54 kB
assets/CloudSubscriptionRedirectView-D_uYoz01.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.53 kB
assets/CloudAuthTimeoutView-C99dwn0a.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.71 kB 🟢 -1.49 kB
assets/CloudAuthTimeoutView-Cdsgi6nm.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/CloudSorryContactSupportView-QtHXqQri.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-Bf1taiS0.js 500 B 500 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

Panels & Settings — 430 kB (baseline 430 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/LegacyCreditsPanel-Bc3BS9Uq.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.95 kB 🟢 -5.22 kB
assets/LegacyCreditsPanel-BYX1s3Iw.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.95 kB 🔴 +5.24 kB
assets/SubscriptionPanel-B-RLXAMO.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5 kB 🟢 -4.38 kB
assets/SubscriptionPanel-B4M1cjFj.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5 kB 🔴 +4.39 kB
assets/KeybindingPanel-4v-Oo6LI.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.74 kB 🟢 -3.31 kB
assets/KeybindingPanel-BKHthNT2.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.75 kB 🔴 +3.32 kB
assets/AboutPanel-CgOv-zzC.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.69 kB 🔴 +2.44 kB
assets/AboutPanel-DzPExCQN.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.43 kB
assets/ExtensionPanel-BlLgT7gE.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/ExtensionPanel-POJ-eTcP.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ServerConfigPanel-C-6z7h2f.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.17 kB 🔴 +1.94 kB
assets/ServerConfigPanel-D4iC0aP0.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.17 kB 🟢 -1.93 kB
assets/UserPanel-8YKt0CZN.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.91 kB 🟢 -1.67 kB
assets/UserPanel-C1kF79lj.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.91 kB 🔴 +1.67 kB
assets/cloudRemoteConfig-D-Xs6LwB.js (removed) 1.82 kB 🟢 -1.82 kB 🟢 -770 B 🟢 -654 B
assets/cloudRemoteConfig-x_LpfhGy.js (new) 1.82 kB 🔴 +1.82 kB 🔴 +770 B 🔴 +652 B
assets/remoteConfig-B0rgMcLx.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/remoteConfig-CW7J8vSK.js 188 B 188 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-6DVADt2n.js 34.3 kB 34.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B0j03ezr.js 38.3 kB 38.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BHe-AJJN.js 29.6 kB 29.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BT2lfy0S.js 29.5 kB 29.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cp0lF2Mp.js 31.2 kB 31.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CwdesOpm.js 32.1 kB 32.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D3SeHgho.js 28.6 kB 28.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D42m_JEJ.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-FF_vLB0C.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-reUMVWRn.js 30.4 kB 30.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-s7kHNBdQ.js 28.9 kB 28.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

User & Accounts — 3.94 kB (baseline 3.94 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BXw95u7z.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.06 kB
assets/auth-sCVi-uGJ.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.07 kB
assets/firebaseAuthStore-B8KXdXJm.js (new) 217 B 🔴 +217 B 🔴 +138 B 🔴 +119 B
assets/firebaseAuthStore-CsNrMfaH.js (removed) 217 B 🟢 -217 B 🟢 -138 B 🟢 -119 B
assets/auth-37dvaO5d.js (new) 178 B 🔴 +178 B 🔴 +142 B 🔴 +131 B
assets/auth-CGY6d1Vo.js (removed) 178 B 🟢 -178 B 🟢 -142 B 🟢 -128 B

Status: 3 added / 3 removed

Editors & Dialogs — 2.8 kB (baseline 2.8 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-CE_Kpmz9.js (removed) 2.62 kB 🟢 -2.62 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/useSubscriptionDialog-CJNED1hZ.js (new) 2.62 kB 🔴 +2.62 kB 🔴 +1.24 kB 🔴 +1.1 kB
assets/useSubscriptionDialog-Bl7T2Yr3.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +105 B
assets/useSubscriptionDialog-C0morkU9.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -95 B

Status: 2 added / 2 removed

UI Components — 32.8 kB (baseline 32.8 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SubscribeButton-B8X2z12a.js (new) 12.5 kB 🔴 +12.5 kB 🔴 +3.01 kB 🔴 +2.7 kB
assets/SubscribeButton-CWgya0iU.js (removed) 12.5 kB 🟢 -12.5 kB 🟢 -3.01 kB 🟢 -2.7 kB
assets/ComfyQueueButton-ArU3AKCo.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.41 kB
assets/ComfyQueueButton-DaVb2n-w.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.69 kB 🟢 -2.41 kB
assets/CloudBadge-aLMr7zFA.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +732 B 🔴 +650 B
assets/CloudBadge-fW01mZlZ.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -730 B 🟢 -650 B
assets/cloudFeedbackTopbarButton-Bph5SyMH.js (removed) 866 B 🟢 -866 B 🟢 -525 B 🟢 -438 B
assets/cloudFeedbackTopbarButton-Cylt4WOZ.js (new) 866 B 🔴 +866 B 🔴 +526 B 🔴 +443 B
assets/ComfyQueueButton-C3LEJsky.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -123 B
assets/ComfyQueueButton-Dj45tg7h.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +112 B
assets/Button-BFptkwN0.js 3.75 kB 3.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-CkcXZWJQ.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-_hGIrcI2.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 3.04 MB (baseline 3.04 MB) • 🔴 +294 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-Dd0xBl9H.js (new) 1.87 MB 🔴 +1.87 MB 🔴 +397 kB 🔴 +304 kB
assets/dialogService-srQGEk4f.js (removed) 1.87 MB 🟢 -1.87 MB 🟢 -397 kB 🟢 -304 kB
assets/api-CILaMsG8.js (new) 1.15 MB 🔴 +1.15 MB 🔴 +239 kB 🔴 +185 kB
assets/api-DM0_1dxc.js (removed) 1.15 MB 🟢 -1.15 MB 🟢 -239 kB 🟢 -185 kB
assets/releaseStore-BHCYEvqn.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.41 kB 🟢 -2.13 kB
assets/releaseStore-CaIoGjfl.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.41 kB 🔴 +2.13 kB
assets/keybindingService-DJ-XSxHT.js (removed) 6.78 kB 🟢 -6.78 kB 🟢 -1.74 kB 🟢 -1.52 kB
assets/keybindingService-YGiJ70Xg.js (new) 6.78 kB 🔴 +6.78 kB 🔴 +1.74 kB 🔴 +1.51 kB
assets/userStore-CP7e8pMr.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -813 B 🟢 -725 B
assets/userStore-DE0_0VRI.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +813 B 🔴 +726 B
assets/audioService-CYQEIyXG.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -933 B 🟢 -823 B
assets/audioService-DLrK7thr.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +932 B 🔴 +822 B
assets/releaseStore-BRVTvnr0.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -108 B
assets/releaseStore-Bv5Nsmd9.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +106 B
assets/serverConfigStore-CDOQj4Ec.js 2.64 kB 2.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 7 added / 7 removed

Utilities & Hooks — 18.7 kB (baseline 18.7 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useErrorHandling-Dn98PBwn.js (removed) 5 kB 🟢 -5 kB 🟢 -1.47 kB 🟢 -1.28 kB
assets/useErrorHandling-DWM7lj5z.js (new) 5 kB 🔴 +5 kB 🔴 +1.47 kB 🔴 +1.28 kB
assets/subscriptionCheckoutUtil-CJwgxjj4.js (removed) 1.98 kB 🟢 -1.98 kB 🟢 -860 B 🟢 -749 B
assets/subscriptionCheckoutUtil-DoGY1ZTm.js (new) 1.98 kB 🔴 +1.98 kB 🔴 +860 B 🔴 +748 B
assets/audioUtils-CD9wZyVI.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +621 B 🔴 +526 B
assets/audioUtils-DFCnxyVO.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -619 B 🟢 -526 B
assets/useCurrentUser-CGETpOQH.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +98 B
assets/useCurrentUser-DsDpzWiR.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -98 B
assets/_plugin-vue_export-helper-xVPqUhAl.js 467 B 467 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-De0C_hc6.js 7.2 kB 7.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-0PqWmn-8.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-BUCOyXf2.js 421 B 421 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tailwindUtil-Chuu3TbR.js 487 B 487 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 4 added / 4 removed

Vendor & Third-Party — 10.4 MB (baseline 10.4 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-Dr8GmMlH.js 408 kB 408 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-DqqTGPL6.js 3.92 MB 3.92 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-EBXVECvF.js 3.04 MB 3.04 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-ViWrLgbb.js 172 kB 172 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-Dqb1VEds.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BxNhpyUI.js 650 kB 650 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-VHAq3Lid.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-CArXWFIl.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 6.25 MB (baseline 6.25 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-B3oUt30Z.js (removed) 177 kB 🟢 -177 kB 🟢 -42.8 kB 🟢 -35.8 kB
assets/core-BQcN7set.js (new) 177 kB 🔴 +177 kB 🔴 +42.8 kB 🔴 +35.8 kB
assets/Load3D-CvOFYa18.js (removed) 55.7 kB 🟢 -55.7 kB 🟢 -9.18 kB 🟢 -7.91 kB
assets/Load3D-qNOVJtzI.js (new) 55.7 kB 🔴 +55.7 kB 🔴 +9.18 kB 🔴 +7.91 kB
assets/WidgetSelect-B2_82U66.js (new) 50.5 kB 🔴 +50.5 kB 🔴 +11.1 kB 🔴 +9.67 kB
assets/WidgetSelect-BkqE7X7-.js (removed) 50.5 kB 🟢 -50.5 kB 🟢 -11.1 kB 🟢 -9.69 kB
assets/SubscriptionRequiredDialogContent-De0f3924.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.78 kB 🔴 +5.91 kB
assets/SubscriptionRequiredDialogContent-zp_nHGD8.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.78 kB 🟢 -5.9 kB
assets/WidgetRecordAudio-CCMnlp0l.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.96 kB 🔴 +4.43 kB
assets/WidgetRecordAudio-DFQNpoan.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.97 kB 🟢 -4.43 kB
assets/WidgetInputNumber-DMFfjWmb.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.49 kB 🟢 -4.01 kB
assets/WidgetInputNumber-qi9VnAMo.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.49 kB 🔴 +4.01 kB
assets/WidgetImageCrop-18qPIYX8.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.63 kB
assets/WidgetImageCrop-D8BEWZVw.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.14 kB 🔴 +3.63 kB
assets/PanelTemplate-9k-icfyF.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.45 kB 🟢 -4.8 kB
assets/PanelTemplate-CyCIGGEU.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.8 kB
assets/AudioPreviewPlayer-Dr6m114O.js (removed) 12.7 kB 🟢 -12.7 kB 🟢 -3.47 kB 🟢 -3.13 kB
assets/AudioPreviewPlayer-srv01Fxl.js (new) 12.7 kB 🔴 +12.7 kB 🔴 +3.48 kB 🔴 +3.13 kB
assets/WidgetWithControl-BizZIyDr.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.65 kB 🟢 -2.39 kB
assets/WidgetWithControl-DWtH8zsJ.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.65 kB 🔴 +2.39 kB
assets/ValueControlPopover-BsENwwNF.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.55 kB 🟢 -1.38 kB
assets/ValueControlPopover-DeFLrxte.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.55 kB 🔴 +1.38 kB
assets/WidgetAudioUI-DHLKPAwM.js (removed) 3.22 kB 🟢 -3.22 kB 🟢 -1.19 kB 🟢 -1.08 kB
assets/WidgetAudioUI-oSuUBTYz.js (new) 3.22 kB 🔴 +3.22 kB 🔴 +1.19 kB 🔴 +1.08 kB
assets/GlobalToast-DX1wbNB6.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +940 B
assets/GlobalToast-PF-VeAe1.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -938 B
assets/SubscribeToRun-BEEciGJW.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.16 kB 🔴 +1.02 kB
assets/SubscribeToRun-CHs263YD.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.16 kB 🟢 -1.01 kB
assets/cloudSessionCookie-4M4clINl.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +917 B 🔴 +796 B
assets/cloudSessionCookie-Bufpw-HV.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -916 B 🟢 -794 B
assets/BaseViewTemplate-CIVFzgwi.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.05 kB 🔴 +941 B
assets/BaseViewTemplate-CJdqqdfk.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -934 B
assets/CloudRunButtonWrapper-BUT65K95.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +645 B 🔴 +595 B
assets/CloudRunButtonWrapper-DOiNYoZ8.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -645 B 🟢 -570 B
assets/cloudBadges-4IcJvEwc.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -535 B 🟢 -496 B
assets/cloudBadges-BkE4u-vq.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +536 B 🔴 +478 B
assets/graphHasMissingNodes-B_o3rO1y.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +463 B 🔴 +413 B
assets/graphHasMissingNodes-Bp3Jfv5q.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -461 B 🟢 -413 B
assets/cloudSubscription-CLEqRYGo.js (removed) 976 B 🟢 -976 B 🟢 -458 B 🟢 -396 B
assets/cloudSubscription-Dj7LE1Iw.js (new) 976 B 🔴 +976 B 🔴 +459 B 🔴 +398 B
assets/AudioPreviewPlayer-CeXtM6M-.js (removed) 191 B 🟢 -191 B 🟢 -120 B 🟢 -105 B
assets/AudioPreviewPlayer-CJxchkG-.js (new) 191 B 🔴 +191 B 🔴 +120 B 🔴 +116 B
assets/WidgetInputNumber-Cew0BBgW.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -115 B
assets/WidgetInputNumber-SoIv0Ska.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +116 B
assets/WidgetLegacy-8EGEjsde.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +113 B
assets/WidgetLegacy-BHLj8eyx.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -108 B
assets/WidgetSelect-BeGzSYsv.js (new) 161 B 🔴 +161 B 🔴 +113 B 🔴 +111 B
assets/WidgetSelect-D3gM1pxd.js (removed) 161 B 🟢 -161 B 🟢 -113 B 🟢 -107 B
assets/Load3D-BIRs3-u0.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -101 B
assets/Load3D-DUKMU1eb.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +119 B
assets/auto-Bv9cmrEd.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-6dIwsSNi.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BahwM9ZP.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BoJZgy7S.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BQtdp20P.js 20.6 kB 20.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CEMgeOuO.js 18.5 kB 18.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CnxND6sZ.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-coXkrooi.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CZcHDaAg.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DDPGTXy9.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DsGC6118.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-yZ2AjT4s.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-B2qJgYQV.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BH76kbq7.js 104 kB 104 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C-gNarDo.js 105 kB 105 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CA0dzqpC.js 124 kB 124 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CbaIObx3.js 121 kB 121 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CKH_pYcz.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CotnVZA-.js 134 kB 134 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D-IO_jVl.js 119 kB 119 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DLii8dI6.js 117 kB 117 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-i8aQGyai.js 145 kB 145 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Uwzs8jut.js 141 kB 141 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-vWcCEZeZ.js 117 kB 117 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-Bj6UL3Mt.js 2.38 kB 2.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-D8pQnmES.js 2 kB 2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-D0aiBzXG.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-BCNtw1s2.js 2.84 kB 2.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-FcNs04XW.js 143 B 143 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-6qSb98D5.js 329 kB 329 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B4G_Dl5E.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BhmSU7DZ.js 371 kB 371 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bxky0ZDY.js 332 kB 332 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CCSKuw9P.js 400 kB 400 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Cd4f2ERd.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CLdE8MPH.js 355 kB 355 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CqDWLi76.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CqyprhWq.js 433 kB 433 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D4Fo85EU.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DF-ErmAt.js 351 kB 351 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/preservedQueryNamespaces-BsMrb3S_.js 3.23 kB 3.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DZ1Jt5wB.js 838 B 838 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-CqTjxoQm.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-BIIoltvA.js 4.21 kB 4.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-Dneex3J5.js 518 B 518 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-CUDq_bgN.js 4.71 kB 4.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-T8Ljl7oe.js 186 B 186 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-1bZGfe6O.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-CE6qc5iJ.js 3.71 kB 3.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-Bjqrk0m2.js 4.57 kB 4.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-CrN6SGuP.js 3.79 kB 3.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-CtnWVTX2.js 2.58 kB 2.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-zNq5xTi-.js 2.61 kB 2.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-D4Dx6Rvq.js 3.22 kB 3.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DfR_ZXyS.js 1.31 kB 1.31 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-CDG12iu3.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-VNa5cXfN.js 3.08 kB 3.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 25 added / 25 removed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/stores/imagePreviewStore.test.ts (1)

26-31: Prefer Partial for mock typing.

The current cast hides incompleteness; using Partial<LGraphNode> makes the intent explicit and aligns with test typing conventions.

♻️ Suggested adjustment
-const createMockNode = (overrides: Record<string, unknown> = {}): LGraphNode =>
-  ({
-    id: 1,
-    type: 'TestNode',
-    ...overrides
-  }) as LGraphNode
+const createMockNode = (overrides: Partial<LGraphNode> = {}): LGraphNode =>
+  ({
+    id: 1,
+    type: 'TestNode',
+    ...overrides
+  }) as Partial<LGraphNode> as LGraphNode

Based on learnings, prefer Partial<Interface> casts for incomplete mock objects.

🤖 Fix all issues with AI agents
In `@src/renderer/extensions/vueNodes/components/ImagePreview.vue`:
- Around line 214-218: Hoist the call to the composable out of the event handler
by invoking useMaskEditor() once in the component setup and storing its return
(e.g. const maskEditor = useMaskEditor()) so handleEditMask uses
maskEditor.openMaskEditor(node) instead of calling useMaskEditor() inside the
handler; update the setup block to create maskEditor and ensure handleEditMask
references that variable to avoid missing component instance/injection timing
issues.

Comment on lines 214 to +218
const handleEditMask = () => {
setupNodeForMaskEditor()
void commandStore.execute('Comfy.MaskEditor.OpenMaskEditor')
if (!props.nodeId) return
const node = app.rootGraph?.getNodeById(Number(props.nodeId))
if (!node) return
useMaskEditor().openMaskEditor(node)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Hoist useMaskEditor() to setup to avoid instance/timing pitfalls.

Calling composables inside event handlers can miss the active component instance if the composable uses injection. Safer to instantiate once in setup and reuse.

♻️ Suggested refactor
-const nodeOutputStore = useNodeOutputStore()
+const nodeOutputStore = useNodeOutputStore()
+const maskEditor = useMaskEditor()
...
-  useMaskEditor().openMaskEditor(node)
+  maskEditor.openMaskEditor(node)
🤖 Prompt for AI Agents
In `@src/renderer/extensions/vueNodes/components/ImagePreview.vue` around lines
214 - 218, Hoist the call to the composable out of the event handler by invoking
useMaskEditor() once in the component setup and storing its return (e.g. const
maskEditor = useMaskEditor()) so handleEditMask uses
maskEditor.openMaskEditor(node) instead of calling useMaskEditor() inside the
handler; update the setup block to create maskEditor and ensure handleEditMask
references that variable to avoid missing component instance/injection timing
issues.

@christian-byrne christian-byrne marked this pull request as draft January 18, 2026 04:30
christian-byrne added a commit that referenced this pull request Jan 31, 2026
## Summary
Fix for COM-14110: Preview image does not display new outputs in
vue-nodes.

## Problem
The merge logic in `setOutputsByLocatorId` updated `app.nodeOutputs` but
returned early without updating the reactive `nodeOutputs.value` ref.
This caused Vue components to never receive merged output updates
because only the non-reactive `app.nodeOutputs` was being updated.

## Solution
Added `nodeOutputs.value[nodeLocatorId] = existingOutput` after the
merge loop, before the return statement.

## Testing
- Added 2 unit tests covering the merge behavior
- All 4076 existing unit tests pass
- Typechecks pass
- Lint passes

## Notes
- Related open PRs touching same files: #8143, #8366 - potential minor
conflicts possible

Fixes COM-14110

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8479-fix-update-reactive-ref-after-merge-in-imagePreviewStore-2f86d73d365081f1a145fa5a9782515f)
by [Unito](https://www.unito.io)

Co-authored-by: Amp <amp@ampcode.com>
github-actions bot pushed a commit that referenced this pull request Jan 31, 2026
## Summary
Fix for COM-14110: Preview image does not display new outputs in
vue-nodes.

## Problem
The merge logic in `setOutputsByLocatorId` updated `app.nodeOutputs` but
returned early without updating the reactive `nodeOutputs.value` ref.
This caused Vue components to never receive merged output updates
because only the non-reactive `app.nodeOutputs` was being updated.

## Solution
Added `nodeOutputs.value[nodeLocatorId] = existingOutput` after the
merge loop, before the return statement.

## Testing
- Added 2 unit tests covering the merge behavior
- All 4076 existing unit tests pass
- Typechecks pass
- Lint passes

## Notes
- Related open PRs touching same files: #8143, #8366 - potential minor
conflicts possible

Fixes COM-14110

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8479-fix-update-reactive-ref-after-merge-in-imagePreviewStore-2f86d73d365081f1a145fa5a9782515f)
by [Unito](https://www.unito.io)

Co-authored-by: Amp <amp@ampcode.com>
github-actions bot pushed a commit that referenced this pull request Jan 31, 2026
## Summary
Fix for COM-14110: Preview image does not display new outputs in
vue-nodes.

## Problem
The merge logic in `setOutputsByLocatorId` updated `app.nodeOutputs` but
returned early without updating the reactive `nodeOutputs.value` ref.
This caused Vue components to never receive merged output updates
because only the non-reactive `app.nodeOutputs` was being updated.

## Solution
Added `nodeOutputs.value[nodeLocatorId] = existingOutput` after the
merge loop, before the return statement.

## Testing
- Added 2 unit tests covering the merge behavior
- All 4076 existing unit tests pass
- Typechecks pass
- Lint passes

## Notes
- Related open PRs touching same files: #8143, #8366 - potential minor
conflicts possible

Fixes COM-14110

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8479-fix-update-reactive-ref-after-merge-in-imagePreviewStore-2f86d73d365081f1a145fa5a9782515f)
by [Unito](https://www.unito.io)

Co-authored-by: Amp <amp@ampcode.com>
DrJKL pushed a commit that referenced this pull request Jan 31, 2026
## Summary
Fix for COM-14110: Preview image does not display new outputs in
vue-nodes.

## Problem
The merge logic in `setOutputsByLocatorId` updated `app.nodeOutputs` but
returned early without updating the reactive `nodeOutputs.value` ref.
This caused Vue components to never receive merged output updates
because only the non-reactive `app.nodeOutputs` was being updated.

## Solution
Added `nodeOutputs.value[nodeLocatorId] = existingOutput` after the
merge loop, before the return statement.

## Testing
- Added 2 unit tests covering the merge behavior
- All 4076 existing unit tests pass
- Typechecks pass
- Lint passes

## Notes
- Related open PRs touching same files: #8143, #8366 - potential minor
conflicts possible

Fixes COM-14110

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8479-fix-update-reactive-ref-after-merge-in-imagePreviewStore-2f86d73d365081f1a145fa5a9782515f)
by [Unito](https://www.unito.io)

Co-authored-by: Amp <amp@ampcode.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant