Skip to content

refactor: eliminate unsafe type assertions from Group 2 test files#8258

Merged
Myestery merged 22 commits intomainfrom
refactor/cleanup-any-part8-group2
Jan 24, 2026
Merged

refactor: eliminate unsafe type assertions from Group 2 test files#8258
Myestery merged 22 commits intomainfrom
refactor/cleanup-any-part8-group2

Conversation

@Myestery
Copy link
Contributor

@Myestery Myestery commented Jan 23, 2026

Summary

Improved type safety in test files by eliminating unsafe type assertions and adopting official testing patterns. Reduced unsafe as unknown as type assertions and eliminated all null! assertions.

Changes

  • Adopted @pinia/testing patterns

    • Replaced manual Pinia store mocking with createTestingPinia() in useSelectionState.test.ts
    • Eliminated ~120 lines of mock boilerplate
    • Created createMockSettingStore() helper to replace duplicated store mocks in useCoreCommands.test.ts
  • Eliminated unsafe null assertions

    • Created explicit MockMaskEditorStore interface with proper nullable types in useCanvasTools.test.ts
    • Replaced null! initializations with null and used ! at point of use or ?. for optional chaining
  • Made partial mock intent explicit

    • Updated test utilities in litegraphTestUtils.ts to use explicit Partial<T> typing
    • Changed cast pattern from as T to as Partial<T> as T to show incomplete mock intent
    • Applied to createMockLGraphNode(), createMockPositionable(), and createMockLGraphGroup()
  • Created centralized mock utilities in src/utils/__tests__/litegraphTestUtils.ts

    • createMockLGraphNode(), createMockPositionable(), createMockLGraphGroup(), createMockSubgraphNode()
    • Updated 8+ test files to use centralized utilities
    • Used union types Partial<T> | Record<string, unknown> for flexible mock creation

Results

  • ✅ 0 typecheck errors
  • ✅ 0 lint errors
  • ✅ All tests passing in modified files
  • ✅ Eliminated all null! assertions
  • ✅ Reduced unsafe double-cast patterns significantly

Files Modified (18)

  • src/components/graph/SelectionToolbox.test.ts
  • src/components/graph/selectionToolbox/{BypassButton,ColorPickerButton,ExecuteButton}.test.ts
  • src/components/sidebar/tabs/queue/ResultGallery.test.ts
  • src/composables/canvas/useSelectedLiteGraphItems.test.ts
  • src/composables/graph/{useGraphHierarchy,useSelectionState}.test.ts
  • src/composables/maskeditor/{useCanvasHistory,useCanvasManager,useCanvasTools,useCanvasTransform}.test.ts
  • src/composables/node/{useNodePricing,useWatchWidget}.test.ts
  • src/composables/{useBrowserTabTitle,useCoreCommands}.test.ts
  • src/utils/__tests__/litegraphTestUtils.ts

┆Issue is synchronized with this Notion page by Unito

Reduced 'as unknown as' instances from ~107 to 6 (94% reduction) across 18 test files in graph components and composables.

Created centralized mock utilities:
- src/utils/__tests__/litegraphTestUtils.ts with 7 factory functions
- createMockLGraphNode(), createMockPositionable(), createMockLGraphGroup()
- createMockSubgraphNode(), createMockCanvas(), createMockLGraphCanvas()
- createPiniaStoreProps() for consistent store mocking

Type safety improvements:
- Object.assign pattern to avoid constructor conflicts
- Union types (Partial<T> | Record<string, unknown>) for flexible mocking
- 8 test files now use centralized utilities

Remaining 6 'as unknown as' assertions are required for incomplete Pinia store mocks where providing complete $state properties is impractical.

Results:
- ✅ 0 typecheck errors (down from 14)
- ✅ 0 lint errors
- ✅ 118/118 tests passing

Files modified:
- src/components/graph/SelectionToolbox.test.ts
- src/components/graph/selectionToolbox/BypassButton.test.ts
- src/components/graph/selectionToolbox/ColorPickerButton.test.ts
- src/components/graph/selectionToolbox/ExecuteButton.test.ts
- src/components/sidebar/tabs/queue/ResultGallery.test.ts
- src/composables/canvas/useSelectedLiteGraphItems.test.ts
- src/composables/graph/useGraphHierarchy.test.ts
- src/composables/graph/useSelectionState.test.ts
- src/composables/maskeditor/useCanvasHistory.test.ts
- src/composables/maskeditor/useCanvasManager.test.ts
- src/composables/maskeditor/useCanvasTransform.test.ts
- src/composables/node/useNodePricing.test.ts
- src/composables/node/useWatchWidget.test.ts
- src/composables/useCoreCommands.test.ts

New file:
- src/utils/__tests__/litegraphTestUtils.ts
@dosubot dosubot bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Jan 23, 2026
@github-actions
Copy link

github-actions bot commented Jan 23, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/23/2026, 09:56:15 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 23, 2026

🎭 Playwright Tests: ⚠️ Passed with flaky tests

Results: 503 passed, 0 failed, 2 flaky, 8 skipped (Total: 513)

❌ Failed Tests

📊 Browser Reports
  • chromium: View Report (✅ 493 / ❌ 0 / ⚠️ 1 / ⏭️ 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
Copy link
Contributor

coderabbitai bot commented Jan 23, 2026

📝 Walkthrough

Walkthrough

Refactors tests to centralize and tighten mock factories and typings (adds litegraphTestUtils helpers), migrates many tests to typed Pinia testing patterns, tightens function signatures (notably useChainCallback), adjusts widget typings, and removes an explicit return type from ComfyApp.graph. No runtime behavior changes reported.

Changes

Cohort / File(s) Summary
Test Mock Utilities
src/utils/__tests__/litegraphTestUtils.ts
Added factory helpers: createMockLGraphNode, createMockPositionable, createMockLGraphGroup, createMockSubgraphNode, createMockCanvas to standardize test mocks.
Selection & Graph Tests
src/components/graph/SelectionToolbox.test.ts, src/components/graph/selectionToolbox/BypassButton.test.ts, src/components/graph/selectionToolbox/ColorPickerButton.test.ts, src/components/graph/selectionToolbox/ExecuteButton.test.ts
Replaced inline mocks with centralized helpers; introduced typed canvas/positionable mocks and moved to Pinia testing utilities in some files.
Gallery & Thumbnails Tests
src/components/sidebar/tabs/queue/ResultGallery.test.ts, src/components/templates/thumbnails/BaseThumbnail.test.ts
Strengthened wrapper.vm typings via local type aliases for assertions; replaced loose any casts.
Canvas & Selection Composables Tests
src/composables/canvas/useSelectedLiteGraphItems.test.ts, src/composables/graph/useGraphHierarchy.test.ts, src/composables/graph/useSelectionState.test.ts
Introduced Rectangle-based bounding rects and mock creators; migrated tests to createTestingPinia and more strongly typed mock stores.
Mask Editor Tests
src/composables/maskeditor/useCanvasHistory.test.ts, src/composables/maskeditor/useCanvasManager.test.ts, src/composables/maskeditor/useCanvasTools.test.ts, src/composables/maskeditor/useCanvasTransform.test.ts, src/composables/maskeditor/useImageLoader.test.ts
Tightened mock typings for ImageBitmap/ImageData, replaced as any with Partial<> and non-null assertions; added MockMaskEditorStore interface in tests.
Node & Widget Tests
src/composables/node/useNodePricing.test.ts, src/composables/node/useWatchWidget.test.ts, src/composables/useCoreCommands.test.ts
Replaced ad-hoc node mocks with createMockLGraphNode and createMockSubgraph() helpers; relaxed widget callback types from any to unknown and improved test typing.
Queue & Utility Tests
src/composables/queue/useJobMenu.test.ts, src/composables/useBrowserTabTitle.test.ts, src/composables/useCachedRequest.test.ts
Converted several variadic mock functions to explicit signatures; introduced typed MockStore/MockDataStore aliases and narrowed parameter types.
Type / API Updates
src/composables/functional/useChainCallback.ts, src/extensions/core/widgetInputs.ts, src/scripts/app.ts
Replaced CallbackParams with inferred parameter typing; converted useChainCallback to a typed function; updated PrimitiveNode.controlValues to TWidgetValue[]; removed explicit return type from ComfyApp.graph getter.

Possibly related PRs

Suggested reviewers

  • DrJKL
  • shinshin86
  • KarryCharon
  • christian-byrne
  • comfyui-wiki
✨ Finishing touches
  • 📝 Generate docstrings

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 23, 2026

Bundle Size Report

Summary

  • Raw size: 21.8 MB baseline 21.8 MB — 🟢 -183 B
  • Gzip: 4.53 MB baseline 4.53 MB — 🟢 -63 B
  • Brotli: 3.36 MB baseline 3.36 MB — 🟢 -41 B
  • Bundles: 166 current • 166 baseline • 76 added / 76 removed

Category Glance
Other 🟢 -192 B (6.36 MB) · Data & Services 🔴 +17 B (3.17 MB) · Panels & Settings 🟢 -8 B (440 kB) · Vendor & Third-Party ⚪ 0 B (10.7 MB) · Graph Workspace ⚪ 0 B (949 kB) · Views & Navigation ⚪ 0 B (80.7 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-Dk6uzu5d.js (new) 22.7 kB 🔴 +22.7 kB 🔴 +6.82 kB 🔴 +5.97 kB
assets/index-p_qJ_am_.js (removed) 22.7 kB 🟢 -22.7 kB 🟢 -6.83 kB 🟢 -6.01 kB

Status: 1 added / 1 removed

Graph Workspace — 949 kB (baseline 949 kB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-DSbN1wP_.js (removed) 949 kB 🟢 -949 kB 🟢 -192 kB 🟢 -145 kB
assets/GraphView-XexoiuKT.js (new) 949 kB 🔴 +949 kB 🔴 +192 kB 🔴 +145 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-CCU-tpgx.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.6 kB 🟢 -3.05 kB
assets/CloudSurveyView-CCVt0YVn.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.6 kB 🔴 +3.05 kB
assets/CloudLoginView-CsHPcGt2.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.09 kB 🔴 +2.71 kB
assets/CloudLoginView-oRjtLNoo.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.71 kB
assets/UserCheckView-BMD-CF8w.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.44 kB 🟢 -2.12 kB
assets/UserCheckView-n1JJGXeb.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.44 kB 🔴 +2.13 kB
assets/CloudLayoutView-CYLJLZTO.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.25 kB 🟢 -1.95 kB
assets/CloudLayoutView-dtJy4x5K.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.25 kB 🔴 +1.96 kB
assets/CloudSignupView-DZiYmCEZ.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.33 kB 🔴 +2.01 kB
assets/CloudSignupView-MuOl0YlQ.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.02 kB
assets/CloudForgotPasswordView-BxLtAUcp.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/CloudForgotPasswordView-EWSJ_alw.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.92 kB 🟢 -1.68 kB
assets/UserSelectView-CPlnfVNp.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/UserSelectView-DdP6MAie.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.58 kB
assets/CloudSubscriptionRedirectView-CLbrnkSk.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.55 kB
assets/CloudSubscriptionRedirectView-JHiqTaED.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.55 kB
assets/CloudAuthTimeoutView-B1_z82p4.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.71 kB 🟢 -1.48 kB
assets/CloudAuthTimeoutView-B9_RcGfl.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.7 kB 🔴 +1.48 kB
assets/CloudSorryContactSupportView-CIWojqyX.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-DQZzOBYR.js 500 B 500 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

Panels & Settings — 440 kB (baseline 440 kB) • 🟢 -8 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/LegacyCreditsPanel-BeyRKUmu.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.94 kB 🔴 +5.22 kB
assets/LegacyCreditsPanel-BOxrvnQW.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.94 kB 🟢 -5.22 kB
assets/SubscriptionPanel-9b8dpNyi.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +5.01 kB 🔴 +4.41 kB
assets/SubscriptionPanel-CYHDO-_F.js (removed) 20.9 kB 🟢 -20.9 kB 🟢 -5.01 kB 🟢 -4.42 kB
assets/KeybindingPanel-BH40YnuC.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.73 kB 🟢 -3.31 kB
assets/KeybindingPanel-D-8Khape.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.73 kB 🔴 +3.31 kB
assets/AboutPanel-81422BIf.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.43 kB
assets/AboutPanel-CDZkaq_N.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.43 kB
assets/ExtensionPanel-9KyQW4nf.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/ExtensionPanel-CB_thq9S.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.7 kB 🔴 +2.4 kB
assets/WorkspacePanel-DgPQ3OlM.js (new) 8.17 kB 🔴 +8.17 kB 🔴 +2.31 kB 🔴 +2.08 kB
assets/WorkspacePanel-XfKNGLxu.js (removed) 8.17 kB 🟢 -8.17 kB 🟢 -2.31 kB 🟢 -2.08 kB
assets/ServerConfigPanel-BB1Kj4To.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.16 kB 🔴 +1.94 kB
assets/ServerConfigPanel-Bno8wisI.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.16 kB 🟢 -1.94 kB
assets/UserPanel-BXjiyBIG.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.9 kB 🟢 -1.68 kB
assets/UserPanel-CIVIM4FM.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.9 kB 🔴 +1.67 kB
assets/cloudRemoteConfig-CfyXZz6D.js (removed) 1.82 kB 🟢 -1.82 kB 🟢 -772 B 🟢 -655 B
assets/cloudRemoteConfig-CshDckMB.js (new) 1.82 kB 🔴 +1.82 kB 🔴 +772 B 🔴 +663 B
assets/config-BD_KIysV.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -608 B 🟢 -530 B
assets/config-DIrKuwih.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +605 B 🔴 +523 B
assets/remoteConfig-CZVd5eda.js 188 B 188 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/remoteConfig-maWXk_kA.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-_w0F8Os2.js 30.4 kB 30.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BcyB3JCe.js 28.9 kB 28.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BhNjTsTR.js 29.6 kB 29.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bv3zi5bR.js 34.3 kB 34.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BXVr0R9W.js 38.3 kB 38.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Ca_EqdTH.js 31.2 kB 31.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Ccc7OH1N.js 28.6 kB 28.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CheSGCN4.js 32.1 kB 32.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CY-0EA4m.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dkz0uATE.js 29.5 kB 29.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DNMBWO2D.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 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-BsoShyg5.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.06 kB
assets/auth-CVBIv8aU.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.06 kB
assets/firebaseAuthStore-CKH7ABCt.js (new) 217 B 🔴 +217 B 🔴 +136 B 🔴 +118 B
assets/firebaseAuthStore-D3XSv5xy.js (removed) 217 B 🟢 -217 B 🟢 -136 B 🟢 -117 B
assets/auth-CSFIBbpQ.js (new) 178 B 🔴 +178 B 🔴 +142 B 🔴 +148 B
assets/auth-DsSBGH1K.js (removed) 178 B 🟢 -178 B 🟢 -141 B 🟢 -130 B

Status: 3 added / 3 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-Bpq5_ISU.js (removed) 2.65 kB 🟢 -2.65 kB 🟢 -1.25 kB 🟢 -1.1 kB
assets/useSubscriptionDialog-DZ3yEfum.js (new) 2.65 kB 🔴 +2.65 kB 🔴 +1.25 kB 🔴 +1.1 kB
assets/useSubscriptionDialog-78s_QnSz.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -96 B
assets/useSubscriptionDialog-8e_c7ABI.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +95 B

Status: 2 added / 2 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/ComfyQueueButton-lRMRDwRO.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.42 kB
assets/ComfyQueueButton-V9APOZ0x.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.69 kB 🟢 -2.41 kB
assets/SubscribeButton-BquQYRrM.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.57 kB 🟢 -1.39 kB
assets/SubscribeButton-N4Z1e6LY.js (new) 4.63 kB 🔴 +4.63 kB 🔴 +1.57 kB 🔴 +1.39 kB
assets/CloudBadge-BcVA0Ba8.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -722 B 🟢 -645 B
assets/CloudBadge-BgFnJxtj.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +723 B 🔴 +656 B
assets/cloudFeedbackTopbarButton-5erYem19.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +675 B 🔴 +576 B
assets/cloudFeedbackTopbarButton-CuxysWrF.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -675 B 🟢 -577 B
assets/ComfyQueueButton-CLcmF_kx.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +107 B
assets/ComfyQueueButton-DtjWU-LU.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -114 B
assets/Button-CBiuMrWI.js 3.77 kB 3.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-CIuqyTWW.js 8.36 kB 8.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-BvUzYvJd.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DzXs11SA.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 3.17 MB (baseline 3.17 MB) • 🔴 +17 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-D9gZmZR1.js (new) 1.99 MB 🔴 +1.99 MB 🔴 +420 kB 🔴 +321 kB
assets/dialogService-C6dHnEMH.js (removed) 1.99 MB 🟢 -1.99 MB 🟢 -420 kB 🟢 -321 kB
assets/api-CHpdWJ81.js (new) 1.16 MB 🔴 +1.16 MB 🔴 +241 kB 🔴 +187 kB
assets/api-Dsi-tBgS.js (removed) 1.16 MB 🟢 -1.16 MB 🟢 -241 kB 🟢 -187 kB
assets/releaseStore-B37JrD62.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.4 kB 🟢 -2.12 kB
assets/releaseStore-DLZX45Wq.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.4 kB 🔴 +2.12 kB
assets/keybindingService-182Pikos.js (removed) 6.78 kB 🟢 -6.78 kB 🟢 -1.74 kB 🟢 -1.52 kB
assets/keybindingService-D3GHV26Z.js (new) 6.78 kB 🔴 +6.78 kB 🔴 +1.75 kB 🔴 +1.51 kB
assets/userStore-1W-UPTfC.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -812 B 🟢 -725 B
assets/userStore-D8E0ifqq.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +814 B 🔴 +725 B
assets/audioService-CYiIYnMS.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +933 B 🔴 +823 B
assets/audioService-DS5dGkBu.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -930 B 🟢 -820 B
assets/teamWorkspaceStore-BgZErvND.js (removed) 165 B 🟢 -165 B 🟢 -123 B 🟢 -116 B
assets/teamWorkspaceStore-CSAF5_7Q.js (new) 165 B 🔴 +165 B 🔴 +123 B 🔴 +107 B
assets/releaseStore-6kDJ6gxB.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -108 B
assets/releaseStore-boHLY97m.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +106 B
assets/serverConfigStore-D6BZBqR8.js 2.64 kB 2.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useErrorHandling-C_d6-2Hs.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.5 kB 🟢 -1.31 kB
assets/useErrorHandling-cCujetc9.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.5 kB 🔴 +1.31 kB
assets/useWorkspaceUI-C_eJxHbi.js (new) 2.25 kB 🔴 +2.25 kB 🔴 +757 B 🔴 +661 B
assets/useWorkspaceUI-D-DWyytI.js (removed) 2.25 kB 🟢 -2.25 kB 🟢 -757 B 🟢 -665 B
assets/useSubscriptionActions-D8lIzdjV.js (new) 2.22 kB 🔴 +2.22 kB 🔴 +869 B 🔴 +760 B
assets/useSubscriptionActions-DWk6NZrA.js (removed) 2.22 kB 🟢 -2.22 kB 🟢 -866 B 🟢 -759 B
assets/subscriptionCheckoutUtil-BCOOefw_.js (new) 1.98 kB 🔴 +1.98 kB 🔴 +862 B 🔴 +753 B
assets/subscriptionCheckoutUtil-DTcbobiM.js (removed) 1.98 kB 🟢 -1.98 kB 🟢 -858 B 🟢 -744 B
assets/useSubscriptionCredits-B5Un3go3.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -597 B 🟢 -525 B
assets/useSubscriptionCredits-cd4wioJF.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +595 B 🔴 +526 B
assets/audioUtils-CGu-eWLh.js (removed) 970 B 🟢 -970 B 🟢 -547 B 🟢 -488 B
assets/audioUtils-DC4qrMKu.js (new) 970 B 🔴 +970 B 🔴 +548 B 🔴 +482 B
assets/useCurrentUser-8dGUEy7r.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +98 B
assets/useCurrentUser-D0ijQFqI.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -107 B
assets/_plugin-vue_export-helper-Dt9-hEHc.js 467 B 467 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-CWN_VD-w.js 7.2 kB 7.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-BH-xeUTY.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tailwindUtil-CuQ_kVBG.js 488 B 488 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 7 added / 7 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-CzCG8jcG.js 408 kB 408 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-CCO1nq9Q.js 4.1 MB 4.1 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-D9jS_6ky.js 3.04 MB 3.04 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-C7fVHAth.js 256 kB 256 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-BKj_AHFn.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-CLU9nzy5.js 650 kB 650 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-DhS5MB4h.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-AIoMGdmt.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 6.36 MB (baseline 6.36 MB) • 🟢 -192 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-BffCzoxr.js (removed) 178 kB 🟢 -178 kB 🟢 -43 kB 🟢 -35.9 kB
assets/core-D400tm9B.js (new) 178 kB 🔴 +178 kB 🔴 +42.9 kB 🔴 +35.9 kB
assets/Load3D-BXRtyS5M.js (removed) 55.7 kB 🟢 -55.7 kB 🟢 -9.18 kB 🟢 -7.91 kB
assets/Load3D-DcLkre9L.js (new) 55.7 kB 🔴 +55.7 kB 🔴 +9.18 kB 🔴 +7.91 kB
assets/WidgetSelect-BUTJtKVR.js (new) 50.5 kB 🔴 +50.5 kB 🔴 +11.1 kB 🔴 +9.69 kB
assets/WidgetSelect-JEVazb3E.js (removed) 50.5 kB 🟢 -50.5 kB 🟢 -11.1 kB 🟢 -9.7 kB
assets/SubscriptionRequiredDialogContent-CxlFI7Dn.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.78 kB 🔴 +5.91 kB
assets/SubscriptionRequiredDialogContent-DUb2hU3e.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.78 kB 🟢 -5.92 kB
assets/CurrentUserPopoverWorkspace-BxFf5RpR.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -4.84 kB 🟢 -4.3 kB
assets/CurrentUserPopoverWorkspace-CcJQMuuL.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +4.84 kB 🔴 +4.3 kB
assets/WidgetInputNumber-CJ4Qx6bH.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.51 kB 🟢 -4.02 kB
assets/WidgetInputNumber-CSSssW_Y.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.51 kB 🔴 +4.01 kB
assets/WidgetRecordAudio-BYMBK9XF.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.96 kB 🟢 -4.44 kB
assets/WidgetRecordAudio-DTY8eM4g.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.96 kB 🔴 +4.43 kB
assets/SubscriptionPanelContentWorkspace-BHQWVQDG.js (removed) 17.7 kB 🟢 -17.7 kB 🟢 -4.34 kB 🟢 -3.78 kB
assets/SubscriptionPanelContentWorkspace-gxmYw0Uh.js (new) 17.7 kB 🔴 +17.7 kB 🔴 +4.34 kB 🔴 +3.78 kB
assets/WidgetImageCrop-Cj6-BCDp.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.63 kB
assets/WidgetImageCrop-DddWjMv7.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.14 kB 🔴 +3.63 kB
assets/PanelTemplate-BvqkSTzP.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.45 kB 🟢 -4.79 kB
assets/PanelTemplate-Cy8awek-.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.79 kB
assets/AudioPreviewPlayer-BUfTzee5.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.97 kB 🔴 +2.65 kB
assets/AudioPreviewPlayer-DcR4GVb4.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.97 kB 🟢 -2.65 kB
assets/WidgetWithControl-Cr--Hd6G.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.64 kB 🟢 -2.38 kB
assets/WidgetWithControl-W1JAtzNl.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.64 kB 🔴 +2.38 kB
assets/CreateWorkspaceDialogContent-BhH9iSyA.js (removed) 5.92 kB 🟢 -5.92 kB 🟢 -1.92 kB 🟢 -1.67 kB
assets/CreateWorkspaceDialogContent-C6B8RV1V.js (new) 5.92 kB 🔴 +5.92 kB 🔴 +1.92 kB 🔴 +1.67 kB
assets/EditWorkspaceDialogContent-DiGyI5az.js (removed) 5.69 kB 🟢 -5.69 kB 🟢 -1.87 kB 🟢 -1.63 kB
assets/EditWorkspaceDialogContent-DrY9fA5v.js (new) 5.69 kB 🔴 +5.69 kB 🔴 +1.87 kB 🔴 +1.64 kB
assets/ValueControlPopover-ChcLwsOK.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.55 kB 🟢 -1.37 kB
assets/ValueControlPopover-DBpgpvWV.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.54 kB 🔴 +1.37 kB
assets/DeleteWorkspaceDialogContent-CbNI7wFT.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.56 kB 🟢 -1.35 kB
assets/DeleteWorkspaceDialogContent-CkDMp_HB.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.56 kB 🔴 +1.35 kB
assets/LeaveWorkspaceDialogContent-Cd6uWl7x.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.5 kB 🟢 -1.3 kB
assets/LeaveWorkspaceDialogContent-LE9XfnHI.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.5 kB 🔴 +1.31 kB
assets/GlobalToast-Be5lEY8j.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +945 B
assets/GlobalToast-CyHC-izu.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -942 B
assets/SubscribeToRun-CQwXwIlF.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.15 kB 🟢 -1.01 kB
assets/SubscribeToRun-U8yddxvS.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.15 kB 🔴 +1.01 kB
assets/cloudSessionCookie--lmh4Lge.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +931 B 🔴 +799 B
assets/cloudSessionCookie-B_AJnBCz.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -932 B 🟢 -805 B
assets/BaseViewTemplate-CzbV5oAn.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -940 B
assets/BaseViewTemplate-HjMZErWk.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.05 kB 🔴 +941 B
assets/CloudRunButtonWrapper-Bz0cuzcL.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -644 B 🟢 -576 B
assets/CloudRunButtonWrapper-Dlxr7FdM.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +640 B 🔴 +594 B
assets/cloudBadges-BxPFJF0x.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +538 B 🔴 +496 B
assets/cloudBadges-G0MOWNJE.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -537 B 🟢 -478 B
assets/graphHasMissingNodes-CZTRLxNC.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +463 B 🔴 +422 B
assets/graphHasMissingNodes-DgKayTHa.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -457 B 🟢 -434 B
assets/cloudSubscription-CT8mExv_.js (new) 976 B 🔴 +976 B 🔴 +462 B 🔴 +400 B
assets/cloudSubscription-nwJC6aWh.js (removed) 976 B 🟢 -976 B 🟢 -460 B 🟢 -400 B
assets/nightlyBadges-BMvhMb7n.js (removed) 594 B 🟢 -594 B 🟢 -355 B 🟢 -312 B
assets/nightlyBadges-cmf2cG1a.js (new) 594 B 🔴 +594 B 🔴 +355 B 🔴 +310 B
assets/SubscriptionPanelContentWorkspace-1d19kpGZ.js (new) 266 B 🔴 +266 B 🔴 +136 B 🔴 +122 B
assets/SubscriptionPanelContentWorkspace-D4Dz7hSG.js (removed) 266 B 🟢 -266 B 🟢 -136 B 🟢 -113 B
assets/WidgetInputNumber-CYRpkpb9.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -112 B
assets/WidgetInputNumber-Dcuc2ygV.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +108 B
assets/WidgetLegacy-DV5awv4m.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -126 B
assets/WidgetLegacy-V5Hn9iek.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +110 B
assets/Load3D-B2jMVJ7X.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -107 B
assets/Load3D-CCwdpSPk.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +106 B
assets/auto-C-D16_U1.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-4PR1bHpF.js 18.5 kB 18.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B2EAJ50e.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B2K4kJ7I.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B8DPxzq3.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BeMMi6hO.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BFBrL4wa.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CDiUUOet.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CVY7Ty6w.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DFPZ6_-M.js 20.6 kB 20.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ds2wjN52.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Ep6sQmXs.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-D6PpiUVK.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BhEFmLQr.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BJmSXHk5.js 136 kB 136 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BwdWUSzx.js 119 kB 119 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C1TIlcBD.js 126 kB 126 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C8G9GjDN.js 123 kB 123 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cmx0L4BY.js 147 kB 147 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CNZb5sh8.js 107 kB 107 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cp7Xi9AK.js 106 kB 106 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-jf-B109s.js 121 kB 121 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-mcBLF1lP.js 119 kB 119 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-utjp9h7e.js 164 kB 164 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-CSW_ENx8.js 2.38 kB 2.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-DvEvCs7d.js 2 kB 2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-BqI9AZuA.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-gfxHG4G4.js 2.84 kB 2.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-DKpe8oFs.js 143 B 143 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-_yIUj67D.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BF6TtCbU.js 365 kB 365 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BlOB_fqn.js 355 kB 355 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BQZ8zPIN.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BrvlAvf6.js 437 kB 437 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CbhW6UrA.js 332 kB 332 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CK5btlaD.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D8jcNSNH.js 334 kB 334 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DdZJ1mp4.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DZm7fb-y.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-y33GjNKL.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/preservedQueryNamespaces-zCg1CMIu.js 3.23 kB 3.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DhQpJZe1.js 838 B 838 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-cVp-94Rc.js 1.96 kB 1.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-BoORvfqb.js 4.21 kB 4.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-C_FImE7Q.js 518 B 518 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-DacGBD5y.js 4.71 kB 4.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-XFIqgKWC.js 186 B 186 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-JRS-Yy_C.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-BaHD90N-.js 3.71 kB 3.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-CroZXP26.js 4.57 kB 4.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-BWtVkybW.js 3.79 kB 3.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-BEqVMoBy.js 2.58 kB 2.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-B82nEQwY.js 2.61 kB 2.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-B3dZxgK8.js 3.22 kB 3.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BmJCg-u2.js 1.31 kB 1.31 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-DZBuNrhg.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-CJnK-DG-.js 3.08 kB 3.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 30 added / 30 removed

@github-actions
Copy link

🔧 Auto-fixes Applied

This PR has been automatically updated to fix linting and formatting issues.

⚠️ Important: Your local branch is now behind. Run git pull before making additional changes to avoid conflicts.

Changes made:

  • ESLint auto-fixes
  • Oxfmt formatting

@Myestery
Copy link
Contributor Author

@coderabbitai full review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 23, 2026

✅ Actions performed

Full review triggered.

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: 13

Caution

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

⚠️ Outside diff range comments (2)
src/composables/graph/useSelectionState.test.ts (1)

91-160: Replace as unknown as with explicit Partial<T> as T casts in store mocks.

All four store mocks in this block use as unknown as ReturnType<...> which obscures their partial nature. Use Partial<ReturnType<...>> as ReturnType<...> instead to make the incomplete implementation explicit while maintaining type safety.

♻️ Suggested update (pattern)
-    } as unknown as ReturnType<typeof useCanvasStore>)
+    } as Partial<ReturnType<typeof useCanvasStore>> as ReturnType<
+      typeof useCanvasStore
+    >)

Apply the same change to the useNodeDefStore, useSidebarTabStore, and useNodeHelpStore mocks on lines 123, 139, and 160.

src/composables/queue/useJobMenu.test.ts (1)

146-162: Use Partial<TaskItemImpl> for MockTaskRef to make incomplete mock implementation explicit.

Record<string, unknown> obscures the actual type contract. Since TaskItemImpl is imported and available, using Partial<TaskItemImpl> with the double-cast pattern (as Partial<TaskItemImpl> as TaskItemImpl | undefined) explicitly acknowledges the mock's incomplete implementation while maintaining type safety, consistent with test-file typing guidance.

♻️ Suggested refactor
-type MockTaskRef = Record<string, unknown>
+type MockTaskRef = Partial<TaskItemImpl>
@@
-  taskRef: overrides.taskRef as TaskItemImpl | undefined,
+  taskRef: overrides.taskRef as Partial<TaskItemImpl> as TaskItemImpl | undefined,
🤖 Fix all issues with AI agents
In `@src/components/graph/SelectionToolbox.test.ts`:
- Around line 14-21: The test helper createMockCanvas currently casts to the
invalid type useCanvasStore.prototype.canvas (pinia composables have no
prototype); fix by removing that incorrect prototype reference and cast to a
real type or no type: either omit the annotation entirely, or import/use the
proper type like ReturnType<typeof useCanvasStore>['canvas'] (or the explicit
Canvas type if exported) and cast the returned object to that type; update
createMockCanvas to use the correct type reference (or no annotation) so the
mock's type is valid.
- Around line 23-31: The mock in createMockExtensionService implements only part
of the useExtensionService return shape; change its cast to make that explicit
by casting the object as Partial<ReturnType<typeof useExtensionService>> and
then as ReturnType<typeof useExtensionService> (i.e., use "as
Partial<ReturnType<typeof useExtensionService>> as ReturnType<typeof
useExtensionService>") so the incomplete mock is explicit while preserving the
original expected type; update the return statement in
createMockExtensionService accordingly.

In `@src/components/graph/selectionToolbox/BypassButton.test.ts`:
- Line 15: The test defines mockLGraphNode at module scope using
createMockLGraphNode which can leak state between tests; change to generate a
fresh mock per test by either moving the call into a beforeEach or introduce a
factory function (e.g., getMockLGraphNode) and call getMockLGraphNode() inside
each test that needs it so tests don't share/mutate the same mockLGraphNode
instance.

In `@src/components/graph/selectionToolbox/ColorPickerButton.test.ts`:
- Around line 16-25: The mock returned by createMockWorkflow only supplies
changeTracker but not other required fields of LoadedComfyWorkflow; update the
return value to use an explicit two-step cast so the incomplete object is first
typed as Partial<LoadedComfyWorkflow> and then cast to LoadedComfyWorkflow
(i.e., construct the object with changeTracker and overrides, cast it as
Partial<LoadedComfyWorkflow>, then cast that result to LoadedComfyWorkflow) so
the test intent is explicit while keeping the function signature
createMockWorkflow and the changeTracker mock unchanged.

In `@src/components/graph/selectionToolbox/ExecuteButton.test.ts`:
- Around line 47-49: The MockCommandStore type falsely promises a full store by
intersecting ReturnType<typeof useCommandStore> with { execute: Mock } while the
mock only implements execute; replace it by typing the mock as
Partial<ReturnType<typeof useCommandStore>> (e.g. const mock = { execute:
jest.fn() } as Partial<ReturnType<typeof useCommandStore>> as ReturnType<typeof
useCommandStore>) so missing properties are explicit, update usages of
MockCommandStore to use that pattern, and remove the MockCommandStore alias if
it’s no longer needed; ensure execute remains a Mock and all tests compile.

In `@src/components/sidebar/tabs/queue/ResultGallery.test.ts`:
- Line 95: The test currently casts mockGalleryItems directly to
ResultItemImpl[]; change this to the explicit double-cast pattern to indicate
the items are partials by casting mockGalleryItems as Partial<ResultItemImpl>[]
as ResultItemImpl[] and update the assignment at allGalleryItems to use that
double-cast so the incomplete implementation is explicit (reference:
allGalleryItems and ResultItemImpl in ResultGallery.test.ts).

In `@src/composables/functional/useChainCallback.ts`:
- Around line 8-13: The exported const useChainCallback likely should be a
function declaration per guidelines; verify whether the arrow was deliberately
chosen for its lexical this behavior for the chaining pattern—if not, change the
exported const useChainCallback to a named function declaration preserving the
same generic signature and parameters (originalCallback and callbacks) and
update any imports/usages accordingly; if the arrow is intentional, add a short
code comment above useChainCallback stating that the arrow function is required
for lexical this semantics to avoid automated refactors.
- Around line 17-24: The declared return type Ret is misleading because the
returned wrapper never returns the originalCallback's result; update the wrapper
to reflect side-effect-only behavior by changing its return type to void (remove
or stop using the Ret generic) so the function signature and the cast at the end
become (this: O, ...args: Args) => void; ensure you update any type parameters
or uses in useChainCallback that reference Ret and keep the implementation
calling originalCallback and callbacks as-is (referencing originalCallback and
callbacks in the returned function).

In `@src/composables/graph/useGraphHierarchy.test.ts`:
- Around line 37-56: The mock currently uses an "unknown" escape hatch; instead
declare mockCanvasStore with an explicit Partial type and avoid the double
cast—e.g. const mockCanvasStore: Partial<ReturnType<typeof useCanvasStore>> = {
canvas: { graph: { groups: mockGroups } }, $id: 'canvas', $state: {}, $patch:
vi.fn(), $reset: vi.fn(), $subscribe: vi.fn(), $onAction: vi.fn(), $dispose:
vi.fn(), _customProperties: new Set(), _p: {} }; then pass it into the mocked
factory with a single, deliberate cast when needed:
vi.mocked(useCanvasStore).mockReturnValue(mockCanvasStore as ReturnType<typeof
useCanvasStore>); this preserves type intent for mockCanvasStore and removes the
"unknown" escape hatch while keeping useCanvasStore mockable.

In `@src/composables/maskeditor/useImageLoader.test.ts`:
- Around line 117-133: The tests use verbose inline casts for mockStore members;
define a proper mock type/interface for your test (e.g., MockStore with
maskCanvas: {width:number;height:number}, rgbCanvas, imgCtx: {clearRect:
jest.Mock}, maskCtx: {clearRect: jest.Mock}, etc.) or cast mockStore once to
that type near the top of the test, then simplify assertions in the
useImageLoader/loadImages test to use direct property access like
mockStore.maskCanvas!.width and mockStore.imgCtx!.clearRect
toHaveBeenCalledWith(0,0,0,0) instead of repeated inline casts.
- Around line 10-30: Replace the ad-hoc unknown-typed mocks with explicit mock
interfaces/types: declare a MockStore type (with imgCanvas: HTMLCanvasElement |
null, maskCanvas, rgbCanvas, imgCtx: CanvasRenderingContext2D | null, maskCtx,
image: HTMLImageElement | null) and a MockDataStore type (with inputData typed
to the real input shape or any|null), then change mockStore and mockDataStore to
use Partial<MockStore>/Partial<MockDataStore> or those concrete types; update
the test setup in beforeEach that assigns canvases/contexts/images to match the
new types and remove the inline casts in the assertions that reference mockStore
and mockDataStore (the symbols to change: mockStore, mockDataStore, and the test
setup in beforeEach).

In `@src/composables/queue/useJobMenu.test.ts`:
- Around line 104-106: Replace the ad-hoc mock typing for nodeDefStoreMock with
the real ComfyNodeDefImpl to keep types aligned: import ComfyNodeDefImpl from
the store module and change nodeDefStoreMock.nodeDefsByName's type to
Record<string, Partial<ComfyNodeDefImpl>> so the mock can be partial while
preserving the actual shape; update any places creating entries to match
Partial<ComfyNodeDefImpl> fields used in tests.

In `@src/composables/useBrowserTabTitle.test.ts`:
- Around line 42-44: The test's reactive mock `settingStore` includes a
redundant type assertion "'Enabled' as string"; remove the unnecessary "as
string" so the `get` mock returns the string literal directly (keep the vi.fn
signature unchanged) — update the `settingStore` definition in
useBrowserTabTitle.test.ts where `get: vi.fn((_key: string) => 'Enabled' as
string)` appears to `get: vi.fn((_key: string) => 'Enabled')`.
♻️ Duplicate comments (1)
src/composables/maskeditor/useImageLoader.test.ts (1)

205-208: Same verbose cast pattern as above.

These casts follow the same pattern and would benefit from the mock interface refactoring suggested earlier.

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: 6

Caution

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

⚠️ Outside diff range comments (1)
src/components/graph/SelectionToolbox.test.ts (1)

385-404: Inline mock should also use explicit Partial cast.

This inline mock duplicates the pattern from createMockExtensionService but with different return values. Consider reusing the helper or applying the same Partial cast pattern for consistency.

♻️ Suggested approach
       mockExtensionService.mockReturnValue({
         extensionCommands: {
           value: new Map([
             ['test-command', { id: 'test-command', title: 'Test Command' }]
           ])
         },
         loadExtensions: vi.fn(),
         registerExtension: vi.fn(),
         invokeExtensions: vi.fn(() => ['test-command']),
         invokeExtensionsAsync: vi.fn()
-      } as ReturnType<typeof useExtensionService>)
+      } as Partial<ReturnType<typeof useExtensionService>> as ReturnType<typeof useExtensionService>)
🤖 Fix all issues with AI agents
In `@src/composables/graph/useSelectionState.test.ts`:
- Around line 91-104: The test mock for useCanvasStore is using an unsafe
double-cast ("as unknown as ReturnType<typeof useCanvasStore>"); change these to
explicit partial typings by casting the mock object to Partial<ReturnType<typeof
useCanvasStore>> (e.g., vi.mocked(useCanvasStore).mockReturnValue({ ... } as
Partial<ReturnType<typeof useCanvasStore>>)). Do the same for the other store
mocks in this file (the blocks around the mocked stores at the other ranges
referenced) so mocks remain explicit about missing properties while keeping
type-safety and readability; reference useCanvasStore and mockSelectedItems to
find the exact mock objects to update.

In `@src/composables/maskeditor/useCanvasTools.test.ts`:
- Around line 11-17: The mockStore uses unsafe null! assertions for
canvas/context fields; change its type to the real store type (e.g.,
ReturnType<typeof useMaskEditorStore>) or an explicit interface where the canvas
and context properties are nullable (CanvasRenderingContext2D | null and
HTMLCanvasElement | null), then initialize fields to null (no ! cast) so tests
can assign real elements later; update the same pattern at the other occurrences
(lines referenced) to replace "null! as ..." with properly typed nullable fields
on mockStore.

In `@src/composables/node/useNodePricing.test.ts`:
- Around line 723-744: The inline verbose mock in the test should be extracted
to a helper: either add a new helper function
createMockNodeWithPriceBadge(nodeName, priceBadge, widgets, inputs) or extend
the existing createMockNode to accept a price_badge in its nodeData parameter;
then replace the long inline createMockNode call in useNodePricing.test.ts with
a call to createMockNodeWithPriceBadge (or the extended createMockNode) passing
the same name, the price_badge object (engine/expr/depends_on) and the
simplified inputs array (use connected:true/false instead of link values) so the
test remains concise and the unique symbols to update are createMockNode,
createMockNodeWithPriceBadge, and the price_badge nodeData structure.

In `@src/composables/useCoreCommands.test.ts`:
- Around line 174-195: Extract the duplicated Pinia mock into a helper: create a
function createMockSettingStore(getReturnValue: boolean): ReturnType<typeof
useSettingStore> that returns the common mock object (with get mocked to return
getReturnValue and all other methods/fields copied from the existing mock), then
replace the two vi.mocked(useSettingStore).mockReturnValue(...) calls with
vi.mocked(useSettingStore).mockReturnValue(createMockSettingStore(false)) and
vi.mocked(useSettingStore).mockReturnValue(createMockSettingStore(true))
respectively; ensure the helper includes get, addSetting, loadSettingValues,
set, exists, getDefaultValue, settingValues, settingsById, $id, $state, $patch,
$reset, $subscribe, $onAction, $dispose, _customProperties and _p to match the
original mock shape.
- Line 162: The test-level mockSubgraph is created once at module scope using
createMockSubgraph(), which lets vi.fn() instances retain call history across
tests; move the call to createMockSubgraph() into the test-level setup (e.g.,
inside beforeEach) or create it inline within each test so each test gets a
fresh mockSubgraph instance; update references to the module-scoped mockSubgraph
in tests to use the newly created local variable to ensure isolation and avoid
relying solely on vi.clearAllMocks().

In `@src/utils/__tests__/litegraphTestUtils.ts`:
- Around line 9-47: The helpers return concrete objects with a direct cast; make
the "partial mock" intent explicit by constructing a const partial: Partial<T>
inside each helper and then return partial as Partial<T> as T; update
createMockLGraphNode, createMockPositionable, and createMockLGraphGroup to build
a partial object (including current default fields and overrides) typed as
Partial<LGraphNode>/Partial<Positionable>/Partial<LGraphGroup> and return it
using the explicit Partial<T> as T cast.
♻️ Duplicate comments (13)
src/components/sidebar/tabs/queue/ResultGallery.test.ts (1)

95-95: Consider using the double-cast pattern for explicit partial indication.

Based on learnings, when creating mock objects that partially implement an interface, prefer as Partial<T>[] as T[] to make the incomplete implementation explicit. Since MockResultItem is already defined as Partial<ResultItemImpl> & {...}, the double-cast would better communicate intent.

♻️ Suggested improvement
-        allGalleryItems: mockGalleryItems as ResultItemImpl[],
+        allGalleryItems: mockGalleryItems as Partial<ResultItemImpl>[] as ResultItemImpl[],
src/composables/maskeditor/useImageLoader.test.ts (2)

10-30: Consider explicit mock types instead of unknown fields.

Typing mockStore/mockDataStore as unknown forces repeated casts later. Prefer explicit mock shapes or Partial<MaskEditorStore> as MaskEditorStore to keep type intent clear. Based on learnings, explicit partial types are preferred over unknown with inline casts.


117-133: Inline casts can be eliminated with stronger mock typing.

The repeated (mockStore.* as { ... }) casts are noisy; once mock types are explicit, these assertions can be simplified. Based on learnings, explicit partial mock types are preferred.

Also applies to: 205-208

src/composables/graph/useGraphHierarchy.test.ts (1)

37-56: Avoid the unknown escape hatch in the store mock.
Use an explicit Partial<ReturnType<typeof useCanvasStore>> and a single cast.

♻️ Suggested update
-    } as unknown as Partial<ReturnType<typeof useCanvasStore>>
+    } as Partial<ReturnType<typeof useCanvasStore>>
 
     vi.mocked(useCanvasStore).mockReturnValue(
-      mockCanvasStore as ReturnType<typeof useCanvasStore>
+      mockCanvasStore as Partial<ReturnType<typeof useCanvasStore>> as ReturnType<
+        typeof useCanvasStore
+      >
     )
Based on learnings, keep partial mock intent explicit.
src/components/graph/SelectionToolbox.test.ts (2)

14-21: Incorrect type reference: useCanvasStore.prototype.canvas is invalid.

useCanvasStore is a Pinia store composable function, not a class, so it doesn't have a prototype property. This cast is misleading and won't provide type safety.

♻️ Suggested fix
-function createMockCanvas(): typeof useCanvasStore.prototype.canvas {
-  return {
-    setDirty: vi.fn(),
-    state: {
-      selectionChanged: false
-    }
-  } as typeof useCanvasStore.prototype.canvas
-}
+function createMockCanvas() {
+  return {
+    setDirty: vi.fn(),
+    state: {
+      selectionChanged: false
+    }
+  } as Partial<ReturnType<typeof useCanvasStore>['canvas']> as ReturnType<typeof useCanvasStore>['canvas']
+}

23-31: Use explicit Partial cast for incomplete mock.

The mock only implements a subset of useExtensionService return type. Based on learnings, prefer as Partial<ReturnType<typeof useExtensionService>> as ReturnType<typeof useExtensionService> to make the incomplete implementation explicit.

♻️ Suggested fix
 function createMockExtensionService(): ReturnType<typeof useExtensionService> {
   return {
     extensionCommands: { value: new Map() },
     loadExtensions: vi.fn(),
     registerExtension: vi.fn(),
     invokeExtensions: vi.fn(() => []),
     invokeExtensionsAsync: vi.fn()
-  } as ReturnType<typeof useExtensionService>
+  } as Partial<ReturnType<typeof useExtensionService>> as ReturnType<typeof useExtensionService>
 }
src/components/graph/selectionToolbox/ColorPickerButton.test.ts (1)

16-25: Apply explicit Partial cast for incomplete workflow mock.

The mock only provides changeTracker but LoadedComfyWorkflow has additional required fields. Based on learnings, use the two-step cast to make the incomplete implementation explicit.

♻️ Suggested fix
 function createMockWorkflow(
   overrides: Partial<LoadedComfyWorkflow> = {}
 ): LoadedComfyWorkflow {
   return {
     changeTracker: {
       checkState: vi.fn() as Mock
     },
     ...overrides
-  } as LoadedComfyWorkflow
+  } as Partial<LoadedComfyWorkflow> as LoadedComfyWorkflow
 }
src/components/graph/selectionToolbox/BypassButton.test.ts (1)

15-15: Module-level mock may affect test isolation.

mockLGraphNode is created once at module scope and reused across all tests. If any test mutates this object, it could affect subsequent tests. Consider creating the mock in beforeEach or using a factory function.

♻️ Suggested improvement
-const mockLGraphNode = createMockLGraphNode({ type: 'TestNode' })
+function getMockLGraphNode() {
+  return createMockLGraphNode({ type: 'TestNode' })
+}

Then call getMockLGraphNode() in each test that needs it.

src/components/graph/selectionToolbox/ExecuteButton.test.ts (1)

47-49: MockCommandStore type intersection is misleading.

The type intersects ReturnType<typeof useCommandStore> with { execute: Mock }, but the mock object only provides execute. Based on learnings, prefer explicit Partial pattern.

♻️ Suggested pattern
-type MockCommandStore = ReturnType<typeof useCommandStore> & {
-  execute: Mock
-}
+// Remove type alias and use inline cast:

Then at line 97-99:

     mockCommandStore = {
       execute: vi.fn()
-    } as MockCommandStore
+    } as Partial<ReturnType<typeof useCommandStore>> as ReturnType<typeof useCommandStore>
src/composables/useBrowserTabTitle.test.ts (1)

42-44: Redundant type assertion on string literal.

The as string cast on 'Enabled' is unnecessary since string literals already satisfy the string type.

♻️ Minor cleanup
 const settingStore = reactive({
-  get: vi.fn((_key: string) => 'Enabled' as string)
+  get: vi.fn((_key: string) => 'Enabled')
 })
src/composables/queue/useJobMenu.test.ts (1)

104-106: Replace ad-hoc type with real ComfyNodeDefImpl.

The { id: string } shape is incomplete and risks drift from the actual store definition. Import ComfyNodeDefImpl from the store and use Record<string, Partial<ComfyNodeDefImpl>> to acknowledge the incomplete mock while maintaining type safety.

♻️ Suggested refactor
+import type { ComfyNodeDefImpl } from '@/stores/nodeDefStore'
+
 const nodeDefStoreMock = {
-  nodeDefsByName: {} as Record<string, { id: string }>
+  nodeDefsByName: {} as Record<string, Partial<ComfyNodeDefImpl>>
 }
src/composables/functional/useChainCallback.ts (2)

8-13: Function expression vs function declaration already flagged.

The concern about using a function expression instead of a function declaration per coding guidelines has been noted in a previous review comment. Please address that feedback regarding whether the arrow function's this binding semantics are intentionally required here.


17-24: Return type mismatch already flagged.

The concern that the function is cast to return Ret (line 24) but never actually returns the original callback's result has been noted in a previous review comment. The current implementation discards any return value from originalCallback, making the Ret return type misleading. Please address that feedback by either capturing and returning the result or changing the return type to void.

} as Partial<typeof app.canvas.subgraph> as typeof app.canvas.subgraph
}

const mockSubgraph = createMockSubgraph()
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

Module-level mock may affect test isolation.

mockSubgraph is created once at module scope and reused. Since createMockSubgraph() creates mocks with vi.fn(), these mock functions accumulate call history across tests. While vi.clearAllMocks() in beforeEach resets call counts, consider creating a fresh subgraph per test for better isolation.

♻️ Suggested improvement

Move the creation into beforeEach or create inline in tests:

-const mockSubgraph = createMockSubgraph()
+let mockSubgraph: ReturnType<typeof createMockSubgraph>

 beforeEach(() => {
   vi.clearAllMocks()
   setActivePinia(createPinia())
+  mockSubgraph = createMockSubgraph()
   app.canvas.subgraph = undefined
   // ...
 })
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const mockSubgraph = createMockSubgraph()
let mockSubgraph: ReturnType<typeof createMockSubgraph>
beforeEach(() => {
vi.clearAllMocks()
setActivePinia(createPinia())
mockSubgraph = createMockSubgraph()
app.canvas.subgraph = undefined
// ...
})
🤖 Prompt for AI Agents
In `@src/composables/useCoreCommands.test.ts` at line 162, The test-level
mockSubgraph is created once at module scope using createMockSubgraph(), which
lets vi.fn() instances retain call history across tests; move the call to
createMockSubgraph() into the test-level setup (e.g., inside beforeEach) or
create it inline within each test so each test gets a fresh mockSubgraph
instance; update references to the module-scoped mockSubgraph in tests to use
the newly created local variable to ensure isolation and avoid relying solely on
vi.clearAllMocks().

DrJKL and others added 5 commits January 23, 2026 19:53
## Summary

Model management improvements: refactored tag API, enhanced UX for
trigger phrases and editing.

## Changes

### API Refactor
- Add `addAssetTags` (POST) and `removeAssetTags` (DELETE) endpoints in
assetService
- `updateAssetTags` now computes diff and calls remove/add serially
- Add `TagsOperationResult` schema; cache syncs with server response

### UX Improvements
- **Trigger phrases**: click to copy individual phrases, copy-all button
in header
- **Display name**: show edit icon on hover instead of relying on
double-click
- **Model type**: show plain text when immutable instead of disabled
select
- **Tags input**: only show edit icon on hover
- **Field labels**: updated styling to use muted foreground color
- **Optimistic update** for model type selection

---------

Co-authored-by: Amp <amp@ampcode.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
- The slider indicator is now only rounded at the ends and doesn't
display outside the widget at small values
- Prevents a bug where scrubbing would result in a 1/10 chance of
causing text selection after a completed scrub.

| Before | After |
| ------ | ----- |
| <img width="360" alt="before"
src="https://github.com/user-attachments/assets/94d1a232-4667-4f99-8fce-93567a10b2f3"
/> | <img width="360" alt="after"
src="https://github.com/user-attachments/assets/66a44109-906f-4c1e-809e-118c9c96eb4a"
/>|

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8251-Further-number-widget-fixes-2f06d73d3650811f9548ded527ca16ae)
by [Unito](https://www.unito.io)
## Summary
Improves type safety in test files by replacing unsafe type patterns
with proper TypeScript idioms.

## Changes
- Define typed `TestWindow` interface extending `Window` for Playwright
tests with custom properties
- Use `Partial<HTMLElement>` with single type assertion for DOM element
mocks
- Remove redundant type imports
- Fix `console.log` → `console.warn` in test fixture

## Files Changed
16 test files across browser_tests, packages, and src/components

## Test Plan
- ✅ `pnpm typecheck` passes
- ✅ No new `any` types introduced
- ✅ All pre-commit hooks pass

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8253-refactor-improve-TypeScript-patterns-in-test-files-Group-1-8-2f16d73d365081548f9ece7bcf0525ee)
by [Unito](https://www.unito.io)

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Adds `search_aliases` to Fuse.js search keys, enabling users to find
nodes by alternative names.



https://github.com/user-attachments/assets/6bde3e5d-29c7-4cb0-b102-e600a92c7019



## Changes
- Add `search_aliases` to Fuse.js keys in `nodeSearchService.ts`
- Add type definition for `search_aliases` field in `nodeDefSchema.ts`

**Depends on:** Comfy-Org/ComfyUI#12010

## Related PRs
- **Backend:** Comfy-Org/ComfyUI#12010,
Comfy-Org/ComfyUI#12035
- **Adding aliases**:
  - Comfy-Org/ComfyUI#12016
  - Comfy-Org/ComfyUI#12017
  - Comfy-Org/ComfyUI#12018
  - Comfy-Org/ComfyUI#12019
- **Docs:** Comfy-Org/docs#729

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8223-feat-Add-search_aliases-to-node-search-2ef6d73d365081d89bcccffb33659a88)
by [Unito](https://www.unito.io)

Co-authored-by: Amp <amp@ampcode.com>
Add a right-click context menu to the active jobs button that clears the
queue and matches the Queue Progress modal styling.

Per
[design](https://www.figma.com/design/LVilZgHGk5RwWOkVN6yCEK/Queue-Progress-Modal?node-id=3407-41345&m=dev)

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8216-feat-active-jobs-context-menu-2ef6d73d365081e68386cf0f7c3c23f2)
by [Unito](https://www.unito.io)
@Myestery Myestery requested a review from a team as a code owner January 23, 2026 18:53
@dosubot dosubot bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:XXL This PR changes 1000+ lines, ignoring generated files. labels Jan 23, 2026
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: 9

Caution

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

⚠️ Outside diff range comments (8)
src/components/dialog/content/setting/SettingItem.test.ts (1)

21-37: Remove @ts-expect-error by properly typing mountComponent props.

The current Record<string, unknown> with @ts-expect-error violates coding guidelines that forbid @ts-expect-error and weakens type safety. Use Partial<ComponentProps<typeof SettingItem>> for the parameter to allow flexible testing, then cast to ComponentProps<typeof SettingItem> when passing to mount.

✅ Proposed fix
+import type { ComponentProps } from 'vue-component-type-helpers'
+
-  const mountComponent = (props: Record<string, unknown>, options = {}) => {
+  const mountComponent = (
+    props: Partial<ComponentProps<typeof SettingItem>>,
+    options = {}
+  ) => {
     return mount(SettingItem, {
       global: {
         plugins: [PrimeVue, i18n, createPinia()],
         components: {
           Tag
         },
         directives: {
           tooltip: Tooltip
         },
         stubs: {
           'i-material-symbols:experiment-outline': true
         }
       },
-      // `@ts-expect-error` - Test utility accepts flexible props for testing edge cases
-      props,
+      props: props as ComponentProps<typeof SettingItem>,
       ...options
     })
   }
src/components/common/FormRadioGroup.vue (1)

31-59: Guard record-based options against undefined values.

With Record<string, string> support, optionValue may be absent, producing undefined values. That can create duplicate keys and break selection. Provide a fallback (e.g., label/text) when optionValue is missing.

🐛 Suggested hardening
-    return {
-      text: option[props.optionLabel || 'text'] || 'Unknown',
-      value: option[props.optionValue || 'value']
-    }
+    const labelKey = props.optionLabel || 'text'
+    const valueKey = props.optionValue || 'value'
+    const text = option[labelKey] ?? 'Unknown'
+    return {
+      text,
+      value: option[valueKey] ?? text
+    }
src/components/common/FormRadioGroup.test.ts (2)

95-115: Align modelValue type with string option values.

Options now use string ids ('1', '2', '3') but modelValue remains numeric. This mismatch can hide selection regressions if the component uses strict equality.

✅ Suggested adjustment
-        modelValue: 2,
+        modelValue: '2',

10-28: Use Partial<ComponentProps> for the mount helper.

The mount helper should accept partial props to remain flexible. Type the parameter as Partial<ComponentProps<typeof FormRadioGroup>> and cast to the full type when passing to mount().

♻️ Proposed update
-  type FormRadioGroupProps = ComponentProps<typeof FormRadioGroup>
-  const mountComponent = (props: FormRadioGroupProps, options = {}) => {
+  type FormRadioGroupProps = Partial<ComponentProps<typeof FormRadioGroup>>
+  const mountComponent = (props: FormRadioGroupProps, options = {}) => {
     return mount(FormRadioGroup, {
       global: {
         plugins: [PrimeVue],
         components: { RadioButton }
       },
-      props,
+      props: props as ComponentProps<typeof FormRadioGroup>,
       ...options
     })
   }
src/components/common/UrlInput.test.ts (1)

10-32: Use Partial<ComponentProps> for the mount helper's props parameter.

This allows optional props in tests and aligns with the repo's helper pattern. Update the signature to accept Partial<ComponentProps<typeof UrlInput>> with a default value of {}, then cast when passing to mount.

Suggested change
   const mountComponent = (
-    props: ComponentProps<typeof UrlInput> & {
+    props: Partial<ComponentProps<typeof UrlInput>> & {
       placeholder?: string
       disabled?: boolean
-    },
+    } = {},
     options = {}
   ) => {
     return mount(UrlInput, {
       global: {
         plugins: [PrimeVue],
         components: { IconField, InputIcon, InputText }
       },
-      props,
+      props: props as ComponentProps<typeof UrlInput>,
       ...options
     })
   }
src/components/common/UserAvatar.test.ts (1)

1-39: Use Partial<ComponentProps> for mount helper props to enable flexible testing.

The mount helper should accept partial props to keep tests ergonomic. Type the parameter as Partial<ComponentProps<typeof UserAvatar>> and cast to ComponentProps<typeof UserAvatar> when passing to mount, ensuring type safety at the call site.

Proposed update
-  const mountComponent = (props: ComponentProps<typeof UserAvatar> = {}) => {
+  const mountComponent = (
+    props: Partial<ComponentProps<typeof UserAvatar>> = {}
+  ) => {
     return mount(UserAvatar, {
       global: {
         plugins: [PrimeVue, i18n],
         components: { Avatar }
       },
-      props
+      props: props as ComponentProps<typeof UserAvatar>
     })
   }
src/components/dialog/content/signin/ApiKeyForm.test.ts (1)

1-75: Use Partial<ComponentProps> in test mount helpers for flexible partial prop mocking.

This helper currently requires full props typing. Use Partial<ComponentProps<typeof ApiKeyForm>> for the parameter and cast on mount, allowing tests to pass only necessary props without TypeScript errors.

Suggested fix
-  const mountComponent = (props: ComponentProps<typeof ApiKeyForm> = {}) => {
+  const mountComponent = (
+    props: Partial<ComponentProps<typeof ApiKeyForm>> = {}
+  ) => {
     return mount(ApiKeyForm, {
       global: {
         plugins: [PrimeVue, createPinia(), i18n],
         components: { Button, Form, InputText, Message }
       },
-      props
+      props: props as ComponentProps<typeof ApiKeyForm>
     })
   }
browser_tests/tests/featureFlags.spec.ts (1)

276-348: Synchronize waitForFunction condition with polling flag to prevent race condition.

The waitForFunction resolves when serverFeatureFlags.supports_preview_metadata exists, but featureFlagsReceived is set only on the next polling interval tick. The subsequent evaluate() call can execute before that tick fires, causing the assertion at line 359 to fail intermittently.

Wait on the __appReadiness.featureFlagsReceived flag instead to ensure the polling has registered the state change:

🔧 Proposed fix
-    await newPage.waitForFunction(
-      () =>
-        window['app']?.api?.serverFeatureFlags?.supports_preview_metadata !==
-        undefined,
-      {
-        timeout: 10000
-      }
-    )
+    await newPage.waitForFunction(
+      () => window.__appReadiness?.featureFlagsReceived === true,
+      {
+        timeout: 10000
+      }
+    )
🤖 Fix all issues with AI agents
In `@src/components/dialog/content/signin/SignInForm.test.ts`:
- Around line 143-146: Extract a single local VM type alias and reuse it where
tests currently repeat the intersection type: create a type (e.g., VMType)
defined as typeof wrapper.vm & { handleForgotPassword: (email: string, valid:
boolean) => void; onSubmit: (data: { valid: boolean; values: unknown }) => void
} and then replace each inline cast (the component const assignments using
wrapper.vm as typeof wrapper.vm & {...}) with wrapper.vm as VMType; update all
occurrences mentioned (current file SignInForm.test.ts at the blocks around
lines that define component) so the tests reuse the alias instead of repeating
the intersection.

In `@src/components/TopMenuSection.test.ts`:
- Around line 62-66: Replace the stubbed ContextMenu component in
TopMenuSection.test.ts with the real PrimeVue ContextMenu by importing
ContextMenu from 'primevue/contextmenu' and registering it in the test's
global.components (instead of the inline stub), and ensure the PrimeVue plugin
is added to global.plugins in the test setup (mirror the registration pattern
used in PackVersionSelectorPopover.test.ts) so the real ContextMenu is available
during testing.

In `@src/components/TopMenuSection.vue`:
- Around line 160-162: The command handler currently calls handleClearQueue()
with a discarded promise which can cause unhandled rejections and no user
feedback; wrap the await call to handleClearQueue() inside a try/catch, call
toastErrorHandler(err) (or a safe fallback toast/error message if
toastErrorHandler is undefined) on error before making any store mutations, and
ensure you await the call instead of using void; apply the same change for the
other occurrence (the block around lines 195-202) so both command handlers
handle errors explicitly.

In `@src/components/ui/button/button.variants.ts`:
- Around line 29-30: Remove the single-use 'unset' size variant from the size
variants map in button.variants.ts (the key 'unset') and update usages that rely
on it—specifically in ModelInfoPanel.vue where Button currently uses
size="unset": change the Button prop to size="md" (or another existing size like
"sm"/"icon-sm" as appropriate) and keep the manual Tailwind classes already
applied on that element (text-pretty whitespace-normal text-left text-xs) so the
visual styling remains identical; leave adding a dedicated 'unset' variant until
multiple components need the same pattern.

In `@src/platform/assets/services/assetService.ts`:
- Around line 528-533: The removeAssetTags response parsing mirrors addAssetTags
and should catch and log Zod parsing errors while returning a user-friendly
error to the caller: in removeAssetTags, after const result = await res.json()
and const parseResult = tagsOperationResultSchema.safeParse(result), if
parseResult.success is false, call the existing logger to log parseResult.error
(the Zod error) and then throw a sanitized error (e.g., new Error("Failed to
parse tag operation response")) instead of rethrowing the raw Zod error; use the
same helper fromZodError only for logging/diagnostics if needed but ensure the
thrown error is user-friendly and consistent with addAssetTags.
- Around line 498-503: The tagsOperationResultSchema.safeParse failure should be
logged but not leaked to callers: when parseResult.success is false, call the
same logger used elsewhere (e.g., processLogger.error or the asset service
logger) to record parseResult.error or fromZodError(parseResult.error) for
debugging, then throw a generic, user-friendly Error (e.g., "Invalid response
format from tags operation") instead of rethrowing the Zod error; update the
block around tagsOperationResultSchema / parseResult / fromZodError to follow
the pattern used by updateAsset (log detailed Zod error, throw a non-sensitive
error message).

In
`@src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.vue`:
- Around line 163-170: The current check sets text-edit when newValue ===
modelValue.value which also triggers after a drag that returns to the same
value; modify the logic in WidgetInputNumberInput.vue so textEdit is only
enabled for genuine clicks (no pointer movement). Track pointer movement with a
boolean (e.g., pointerMoved) that is set true on pointermove/touchmove and reset
on pointerdown/pointerup, and change the condition to set textEdit only when
newValue === modelValue.value AND pointerMoved is false (or when dragValue is
undefined and no pointer movement). Update the pointer event handlers to
maintain this flag and ensure it is cleared after focus so future interactions
behave normally while preserving existing use of textEdit, modelValue,
inputField, and dragValue.

In `@src/scripts/app.ts`:
- Around line 165-167: The getter graph currently declares return type LGraph |
undefined but forcibly returns this.rootGraphInternal! which contradicts the
type; fix by either (A) removing the non-null assertion and simply return
this.rootGraphInternal so the implementation matches LGraph | undefined, or (B)
change the signature to return LGraph (not undefined) and add a runtime check in
the graph getter that throws or asserts (mirroring the rootGraph getter) when
this.rootGraphInternal is undefined before returning it; reference: the graph
getter, this.rootGraphInternal, and the rootGraph getter for consistent
behavior.

In `@src/stores/assetsStore.ts`:
- Around line 505-519: The current sequential calls to
assetService.removeAssetTags and assetService.addAssetTags can leave server and
client out of sync if one call succeeds and the other fails; change to run both
operations concurrently with Promise.all for
assetService.removeAssetTags(asset.id, tagsToRemove) and
assetService.addAssetTags(asset.id, tagsToAdd), await both results, and only
call updateAssetInCache(asset.id, { tags: finalTags }, cacheKey) when both
promises succeed; compute finalTags from the combined responses (e.g., prefer
addResult.total_tags if present, or derive from both results) and keep the
existing catch block to revert to originalTags on any failure so the cache
remains consistent with server state.

@dosubot dosubot bot added size:XXL This PR changes 1000+ lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Jan 23, 2026
O,
T extends (this: O, ...args: any[]) => void
>(
export function useChainCallback<O, T>(
Copy link
Collaborator

Choose a reason for hiding this comment

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

Changes to the definition of this function scare me immensely, but from testing, everything seems to work as expected.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That was a very hard one to do without using any

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That was a very hard one to do without using any

@Myestery Myestery merged commit b1d8bf0 into main Jan 24, 2026
27 checks passed
@Myestery Myestery deleted the refactor/cleanup-any-part8-group2 branch January 24, 2026 04:10
Myestery added a commit that referenced this pull request Jan 29, 2026
## Summary

This PR removes unsafe type assertions ("as unknown as Type") from test
files and improves type safety across the codebase.

### Key Changes

#### Type Safety Improvements
- Removed all instances of "as unknown as" patterns from test files
- Used proper factory functions from litegraphTestUtils instead of
custom mocks
- Made incomplete mocks explicit using Partial<T> types
- Fixed DialogStore mocking with proper interface exports
- Improved type safety with satisfies operator where applicable

#### App Parameter Removal
- **Removed the unused `app` parameter from all ComfyExtension interface
methods**
- The app parameter was always undefined at runtime as it was never
passed from invokeExtensions
- Affected methods: init, setup, addCustomNodeDefs,
beforeRegisterNodeDef, beforeRegisterVueAppNodeDefs,
registerCustomNodes, loadedGraphNode, nodeCreated, beforeConfigureGraph,
afterConfigureGraph

##### Breaking Change Analysis
Verified via Sourcegraph that this is NOT a breaking change:
- Searched all 10 affected methods across GitHub repositories
- Only one external repository
([drawthingsai/draw-things-comfyui](https://github.com/drawthingsai/draw-things-comfyui))
declares the app parameter in their extension methods
- That repository never actually uses the app parameter (just declares
it in the function signature)
- All other repositories already omit the app parameter
- Search queries used:
- [init method
search](https://sourcegraph.com/search?q=context:global+repo:%5Egithub%5C.com/.*+lang:typescript+%22init%28app%22+-repo:Comfy-Org/ComfyUI_frontend&patternType=standard)
- [setup method
search](https://sourcegraph.com/search?q=context:global+repo:%5Egithub%5C.com/.*+lang:typescript+%22setup%28app%22+-repo:Comfy-Org/ComfyUI_frontend&patternType=standard)
  - Similar searches for all 10 methods confirmed no usage

### Files Changed

Test files:
-
src/components/settings/widgets/__tests__/WidgetInputNumberInput.test.ts
- src/services/keybindingService.escape.test.ts  
- src/services/keybindingService.forwarding.test.ts
- src/utils/__tests__/newUserService.test.ts →
src/utils/__tests__/useNewUserService.test.ts
- src/services/jobOutputCache.test.ts
-
src/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.test.ts
-
src/renderer/extensions/vueNodes/widgets/composables/useIntWidget.test.ts
-
src/renderer/extensions/vueNodes/widgets/composables/useFloatWidget.test.ts

Source files:
- src/types/comfy.ts - Removed app parameter from ComfyExtension
interface
- src/services/extensionService.ts - Improved type safety with
FunctionPropertyNames helper
- src/scripts/metadata/isobmff.ts - Fixed extractJson return type per
review
- src/extensions/core/*.ts - Updated extension implementations
- src/scripts/app.ts - Updated app initialization

### Testing
- All existing tests pass
- Type checking passes  
- ESLint/oxlint checks pass
- No breaking changes for external repositories

Part of the "Road to No Explicit Any" initiative.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344 (this PR)
christian-byrne pushed a commit that referenced this pull request Jan 30, 2026
## Summary

This PR removes unsafe type assertions ("as unknown as Type") from test
files and improves type safety across the codebase.

### Key Changes

#### Type Safety Improvements
- Removed all instances of "as unknown as" patterns from test files
- Used proper factory functions from litegraphTestUtils instead of
custom mocks
- Made incomplete mocks explicit using Partial<T> types
- Fixed DialogStore mocking with proper interface exports
- Improved type safety with satisfies operator where applicable

#### App Parameter Removal
- **Removed the unused `app` parameter from all ComfyExtension interface
methods**
- The app parameter was always undefined at runtime as it was never
passed from invokeExtensions
- Affected methods: init, setup, addCustomNodeDefs,
beforeRegisterNodeDef, beforeRegisterVueAppNodeDefs,
registerCustomNodes, loadedGraphNode, nodeCreated, beforeConfigureGraph,
afterConfigureGraph

##### Breaking Change Analysis
Verified via Sourcegraph that this is NOT a breaking change:
- Searched all 10 affected methods across GitHub repositories
- Only one external repository
([drawthingsai/draw-things-comfyui](https://github.com/drawthingsai/draw-things-comfyui))
declares the app parameter in their extension methods
- That repository never actually uses the app parameter (just declares
it in the function signature)
- All other repositories already omit the app parameter
- Search queries used:
- [init method
search](https://sourcegraph.com/search?q=context:global+repo:%5Egithub%5C.com/.*+lang:typescript+%22init%28app%22+-repo:Comfy-Org/ComfyUI_frontend&patternType=standard)
- [setup method
search](https://sourcegraph.com/search?q=context:global+repo:%5Egithub%5C.com/.*+lang:typescript+%22setup%28app%22+-repo:Comfy-Org/ComfyUI_frontend&patternType=standard)
  - Similar searches for all 10 methods confirmed no usage

### Files Changed

Test files:
-
src/components/settings/widgets/__tests__/WidgetInputNumberInput.test.ts
- src/services/keybindingService.escape.test.ts  
- src/services/keybindingService.forwarding.test.ts
- src/utils/__tests__/newUserService.test.ts →
src/utils/__tests__/useNewUserService.test.ts
- src/services/jobOutputCache.test.ts
-
src/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.test.ts
-
src/renderer/extensions/vueNodes/widgets/composables/useIntWidget.test.ts
-
src/renderer/extensions/vueNodes/widgets/composables/useFloatWidget.test.ts

Source files:
- src/types/comfy.ts - Removed app parameter from ComfyExtension
interface
- src/services/extensionService.ts - Improved type safety with
FunctionPropertyNames helper
- src/scripts/metadata/isobmff.ts - Fixed extractJson return type per
review
- src/extensions/core/*.ts - Updated extension implementations
- src/scripts/app.ts - Updated app initialization

### Testing
- All existing tests pass
- Type checking passes  
- ESLint/oxlint checks pass
- No breaking changes for external repositories

Part of the "Road to No Explicit Any" initiative.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344 (this PR)
Myestery added a commit that referenced this pull request Jan 30, 2026
## Summary

This PR removes unsafe type assertions ("as unknown as Type") from test
files and improves type safety across the codebase.

### Key Changes

#### Type Safety Improvements
- Removed improper `as unknown as Type` patterns from 17 test files in
Group 8 part 7
- Replaced with proper TypeScript patterns using factory functions and
Mock types
- Fixed createTestingPinia usage in test files (was incorrectly using
createPinia)
- Fixed vi.hoisted pattern for mockSetDirty in viewport tests  
- Fixed vi.doMock lint issues with vi.mock and vi.hoisted pattern
- Retained necessary `as unknown as` casts only for complex mock objects
where direct type assertions would fail

### Files Changed

Test files (Group 8 part 7 - services, stores, utils):
- src/services/nodeOrganizationService.test.ts
- src/services/providers/algoliaSearchProvider.test.ts
- src/services/providers/registrySearchProvider.test.ts
- src/stores/comfyRegistryStore.test.ts
- src/stores/domWidgetStore.test.ts
- src/stores/executionStore.test.ts
- src/stores/firebaseAuthStore.test.ts
- src/stores/modelToNodeStore.test.ts
- src/stores/queueStore.test.ts
- src/stores/subgraphNavigationStore.test.ts
- src/stores/subgraphNavigationStore.viewport.test.ts
- src/stores/subgraphStore.test.ts
- src/stores/systemStatsStore.test.ts
- src/stores/workspace/nodeHelpStore.test.ts
- src/utils/colorUtil.test.ts
- src/utils/executableGroupNodeChildDTO.test.ts

Source files:
- src/stores/modelStore.ts - Improved type handling

### Testing
- All TypeScript type checking passes (`pnpm typecheck`)
- All affected test files pass (`pnpm test:unit`)
- Linting passes without errors (`pnpm lint`)
- Code formatting applied (`pnpm format`)

Part of the "Road to No Explicit Any" initiative, cleaning up type
casting issues from branch `fix/remove-any-types-part8`.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344
- Part 8 Group 7: #8459 (this PR)

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8459-Road-to-No-explicit-any-Group-8-part-7-test-files-2f86d73d36508114ad28d82e72a3a5e9)
by [Unito](https://www.unito.io)
snomiao pushed a commit that referenced this pull request Jan 30, 2026
## Summary

This PR removes unsafe type assertions ("as unknown as Type") from test
files and improves type safety across the codebase.

### Key Changes

#### Type Safety Improvements
- Removed improper `as unknown as Type` patterns from 17 test files in
Group 8 part 7
- Replaced with proper TypeScript patterns using factory functions and
Mock types
- Fixed createTestingPinia usage in test files (was incorrectly using
createPinia)
- Fixed vi.hoisted pattern for mockSetDirty in viewport tests  
- Fixed vi.doMock lint issues with vi.mock and vi.hoisted pattern
- Retained necessary `as unknown as` casts only for complex mock objects
where direct type assertions would fail

### Files Changed

Test files (Group 8 part 7 - services, stores, utils):
- src/services/nodeOrganizationService.test.ts
- src/services/providers/algoliaSearchProvider.test.ts
- src/services/providers/registrySearchProvider.test.ts
- src/stores/comfyRegistryStore.test.ts
- src/stores/domWidgetStore.test.ts
- src/stores/executionStore.test.ts
- src/stores/firebaseAuthStore.test.ts
- src/stores/modelToNodeStore.test.ts
- src/stores/queueStore.test.ts
- src/stores/subgraphNavigationStore.test.ts
- src/stores/subgraphNavigationStore.viewport.test.ts
- src/stores/subgraphStore.test.ts
- src/stores/systemStatsStore.test.ts
- src/stores/workspace/nodeHelpStore.test.ts
- src/utils/colorUtil.test.ts
- src/utils/executableGroupNodeChildDTO.test.ts

Source files:
- src/stores/modelStore.ts - Improved type handling

### Testing
- All TypeScript type checking passes (`pnpm typecheck`)
- All affected test files pass (`pnpm test:unit`)
- Linting passes without errors (`pnpm lint`)
- Code formatting applied (`pnpm format`)

Part of the "Road to No Explicit Any" initiative, cleaning up type
casting issues from branch `fix/remove-any-types-part8`.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344
- Part 8 Group 7: #8459 (this PR)

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8459-Road-to-No-explicit-any-Group-8-part-7-test-files-2f86d73d36508114ad28d82e72a3a5e9)
by [Unito](https://www.unito.io)
Myestery added a commit that referenced this pull request Jan 30, 2026
## Summary

This PR removes unsafe type assertions ("as unknown as Type") from test
files and improves type safety across the codebase.

### Key Changes

#### Type Safety Improvements
- Removed improper `as unknown as Type` patterns from test files in
Group 8 part 8
- Replaced with proper TypeScript patterns using Pinia store testing
patterns
- Fixed parameter shadowing issue in typeGuardUtil.test.ts (constructor
→ nodeConstructor)
- Fixed stale mock values in useConflictDetection.test.ts using getter
functions
- Refactored useManagerState tests to follow proper Pinia store testing
patterns with createTestingPinia

### Files Changed

Test files (Group 8 part 8 - utils and manager composables):
- src/utils/typeGuardUtil.test.ts - Fixed parameter shadowing
- src/utils/graphTraversalUtil.test.ts - Removed unsafe type assertions
- src/utils/litegraphUtil.test.ts - Improved type handling
- src/workbench/extensions/manager/composables/useManagerState.test.ts -
Complete rewrite using Pinia testing patterns
-
src/workbench/extensions/manager/composables/useConflictDetection.test.ts
- Fixed stale mock values with getters
- src/workbench/extensions/manager/composables/useManagerQueue.test.ts -
Type safety improvements
-
src/workbench/extensions/manager/composables/nodePack/useMissingNodes.test.ts
- Removed unsafe casts
-
src/workbench/extensions/manager/composables/nodePack/usePacksSelection.test.ts
- Type improvements
-
src/workbench/extensions/manager/composables/nodePack/usePacksStatus.test.ts
- Type improvements
- src/workbench/extensions/manager/utils/versionUtil.test.ts - Type
safety fixes

Source files (minor type fixes):
- src/utils/fuseUtil.ts - Type improvements
- src/utils/linkFixer.ts - Type safety fixes
- src/utils/syncUtil.ts - Type improvements
-
src/workbench/extensions/manager/composables/nodePack/useWorkflowPacks.ts
- Type fix
-
src/workbench/extensions/manager/composables/useConflictAcknowledgment.ts
- Type fix

### Testing
- All TypeScript type checking passes (`pnpm typecheck`)
- All affected test files pass (`pnpm test:unit`)
- Linting passes without errors (`pnpm lint`)
- Code formatting applied (`pnpm format`)

Part of the "Road to No Explicit Any" initiative, cleaning up type
casting issues from branch `fix/remove-any-types-part8`.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344
- Part 8 Group 7: #8459
- Part 8 Group 8: #8496 (this PR)

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8496-Road-to-No-explicit-any-Group-8-part-8-test-files-2f86d73d365081f3afdcf8d01fba81e1)
by [Unito](https://www.unito.io)

---------

Co-authored-by: GitHub Action <action@github.com>
DrJKL pushed a commit that referenced this pull request Jan 31, 2026
## Summary

This PR removes unsafe type assertions ("as unknown as Type") from test
files and improves type safety across the codebase.

### Key Changes

#### Type Safety Improvements
- Removed improper `as unknown as Type` patterns from 17 test files in
Group 8 part 7
- Replaced with proper TypeScript patterns using factory functions and
Mock types
- Fixed createTestingPinia usage in test files (was incorrectly using
createPinia)
- Fixed vi.hoisted pattern for mockSetDirty in viewport tests  
- Fixed vi.doMock lint issues with vi.mock and vi.hoisted pattern
- Retained necessary `as unknown as` casts only for complex mock objects
where direct type assertions would fail

### Files Changed

Test files (Group 8 part 7 - services, stores, utils):
- src/services/nodeOrganizationService.test.ts
- src/services/providers/algoliaSearchProvider.test.ts
- src/services/providers/registrySearchProvider.test.ts
- src/stores/comfyRegistryStore.test.ts
- src/stores/domWidgetStore.test.ts
- src/stores/executionStore.test.ts
- src/stores/firebaseAuthStore.test.ts
- src/stores/modelToNodeStore.test.ts
- src/stores/queueStore.test.ts
- src/stores/subgraphNavigationStore.test.ts
- src/stores/subgraphNavigationStore.viewport.test.ts
- src/stores/subgraphStore.test.ts
- src/stores/systemStatsStore.test.ts
- src/stores/workspace/nodeHelpStore.test.ts
- src/utils/colorUtil.test.ts
- src/utils/executableGroupNodeChildDTO.test.ts

Source files:
- src/stores/modelStore.ts - Improved type handling

### Testing
- All TypeScript type checking passes (`pnpm typecheck`)
- All affected test files pass (`pnpm test:unit`)
- Linting passes without errors (`pnpm lint`)
- Code formatting applied (`pnpm format`)

Part of the "Road to No Explicit Any" initiative, cleaning up type
casting issues from branch `fix/remove-any-types-part8`.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344
- Part 8 Group 7: #8459 (this PR)

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8459-Road-to-No-explicit-any-Group-8-part-7-test-files-2f86d73d36508114ad28d82e72a3a5e9)
by [Unito](https://www.unito.io)
DrJKL pushed a commit that referenced this pull request Jan 31, 2026
## Summary

This PR removes unsafe type assertions ("as unknown as Type") from test
files and improves type safety across the codebase.

### Key Changes

#### Type Safety Improvements
- Removed improper `as unknown as Type` patterns from test files in
Group 8 part 8
- Replaced with proper TypeScript patterns using Pinia store testing
patterns
- Fixed parameter shadowing issue in typeGuardUtil.test.ts (constructor
→ nodeConstructor)
- Fixed stale mock values in useConflictDetection.test.ts using getter
functions
- Refactored useManagerState tests to follow proper Pinia store testing
patterns with createTestingPinia

### Files Changed

Test files (Group 8 part 8 - utils and manager composables):
- src/utils/typeGuardUtil.test.ts - Fixed parameter shadowing
- src/utils/graphTraversalUtil.test.ts - Removed unsafe type assertions
- src/utils/litegraphUtil.test.ts - Improved type handling
- src/workbench/extensions/manager/composables/useManagerState.test.ts -
Complete rewrite using Pinia testing patterns
-
src/workbench/extensions/manager/composables/useConflictDetection.test.ts
- Fixed stale mock values with getters
- src/workbench/extensions/manager/composables/useManagerQueue.test.ts -
Type safety improvements
-
src/workbench/extensions/manager/composables/nodePack/useMissingNodes.test.ts
- Removed unsafe casts
-
src/workbench/extensions/manager/composables/nodePack/usePacksSelection.test.ts
- Type improvements
-
src/workbench/extensions/manager/composables/nodePack/usePacksStatus.test.ts
- Type improvements
- src/workbench/extensions/manager/utils/versionUtil.test.ts - Type
safety fixes

Source files (minor type fixes):
- src/utils/fuseUtil.ts - Type improvements
- src/utils/linkFixer.ts - Type safety fixes
- src/utils/syncUtil.ts - Type improvements
-
src/workbench/extensions/manager/composables/nodePack/useWorkflowPacks.ts
- Type fix
-
src/workbench/extensions/manager/composables/useConflictAcknowledgment.ts
- Type fix

### Testing
- All TypeScript type checking passes (`pnpm typecheck`)
- All affected test files pass (`pnpm test:unit`)
- Linting passes without errors (`pnpm lint`)
- Code formatting applied (`pnpm format`)

Part of the "Road to No Explicit Any" initiative, cleaning up type
casting issues from branch `fix/remove-any-types-part8`.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344
- Part 8 Group 7: #8459
- Part 8 Group 8: #8496 (this PR)

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8496-Road-to-No-explicit-any-Group-8-part-8-test-files-2f86d73d365081f3afdcf8d01fba81e1)
by [Unito](https://www.unito.io)

---------

Co-authored-by: GitHub Action <action@github.com>
Myestery added a commit that referenced this pull request Feb 2, 2026
## Summary

This PR removes `any` types from UI component files and replaces them
with proper TypeScript types.

### Key Changes

#### Type Safety Improvements
- Replaced `any` with `unknown`, explicit types, or proper interfaces
across UI components
- Used `ComponentPublicInstance` with explicit method signatures for
component refs
- Used `Record<string, unknown>` for dynamic property access
- Added generics for form components with flexible value types
- Used `CSSProperties` for style objects

### Files Changed

UI Components:
- src/components/common/ComfyImage.vue - Used proper class prop type
- src/components/common/DeviceInfo.vue - Used `string | number` for
formatValue
- src/components/common/FormItem.vue - Used `unknown` for model value
- src/components/common/FormRadioGroup.vue - Added generic type
parameter
- src/components/common/TreeExplorer.vue - Used proper async function
signature
- src/components/custom/widget/WorkflowTemplateSelectorDialog.vue -
Fixed duplicate import
- src/components/graph/CanvasModeSelector.vue - Used
`ComponentPublicInstance` for ref
- src/components/node/NodePreview.vue - Changed `any` to `unknown`
- src/components/queue/job/JobDetailsPopover.vue - Removed unnecessary
casts
- src/components/queue/job/JobFiltersBar.vue - Removed `as any` casts
- src/platform/assets/components/MediaAssetContextMenu.vue - Added
`ContextMenuInstance` type
- src/renderer/extensions/minimap/MiniMapPanel.vue - Used
`CSSProperties`
- src/renderer/extensions/vueNodes/composables/useNodeTooltips.ts -
Added `PrimeVueTooltipElement` interface
-
src/renderer/extensions/vueNodes/widgets/components/form/FormSelectButton.vue
- Used `Record<string, unknown>`
-
src/workbench/extensions/manager/components/manager/infoPanel/tabs/DescriptionTabPanel.vue
- Added `LicenseObject` interface

### Testing
- All TypeScript type checking passes (`pnpm typecheck`)
- Linting passes without errors (`pnpm lint`)

Part of the "Road to No Explicit Any" initiative.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344
- Part 8 Group 7: #8459
- Part 8 Group 8: #8496
- Part 9: #8498
- Part 10: #8499

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8499-Road-to-No-Explicit-Any-Part-10-2f86d73d365081aab129f165c7d02434)
by [Unito](https://www.unito.io)
Myestery added a commit that referenced this pull request Feb 2, 2026
## Summary

This PR removes `any` types from core source files and replaces them
with proper TypeScript types.

### Key Changes

#### Type Safety Improvements
- Replaced `any` with `unknown`, explicit types, or proper interfaces
across core files
- Introduced new type definitions: `SceneConfig`, `Load3DNode`,
`ElectronWindow`
- Used `Object.assign` instead of `as any` for dynamic property
assignment
- Replaced `as any` casts with proper type assertions

### Files Changed

Source files:
- src/extensions/core/widgetInputs.ts - Removed unnecessary `as any`
cast
- src/platform/cloud/onboarding/auth.ts - Used `Record<string, unknown>`
and Sentry types
- src/platform/telemetry/providers/cloud/MixpanelTelemetryProvider.ts -
Used `AuditLog[]` type
- src/platform/workflow/management/stores/workflowStore.ts - Used
`typeof ComfyWorkflow` constructor type
- src/scripts/app.ts - Used `ResultItem[]` for Clipspace images
- src/services/colorPaletteService.ts - Used `Object.assign` instead of
`as any`
- src/services/customerEventsService.ts - Used `unknown` instead of
`any`
- src/services/load3dService.ts - Added proper interface types for
Load3D nodes
- src/types/litegraph-augmentation.d.ts - Used `TWidgetValue[]` type
- src/utils/envUtil.ts - Added ElectronWindow interface
- src/workbench/extensions/manager/stores/comfyManagerStore.ts - Typed
event as `CustomEvent<{ ui_id?: string }>`

### Testing
- All TypeScript type checking passes (`pnpm typecheck`)
- Linting passes without errors (`pnpm lint`)
- Code formatting applied (`pnpm format`)

Part of the "Road to No Explicit Any" initiative.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344
- Part 8 Group 7: #8459
- Part 8 Group 8: #8496
- Part 9: #8498 (this PR)
@Myestery Myestery mentioned this pull request Feb 3, 2026
5 tasks
AustinMroz pushed a commit that referenced this pull request Feb 6, 2026
## Summary

This PR removes `any` types from widgets, services, stores, and test
files, replacing them with proper TypeScript types.

### Key Changes

#### Type Safety Improvements
- Replaced `any` with `unknown`, explicit types, or proper interfaces
across widgets and services
- Added proper type imports (TgpuRoot, Point, StyleValue, etc.)
- Created typed interfaces (NumericWidgetOptions, TestWindow,
ImportFailureDetail, etc.)
- Fixed function return types to be non-nullable where appropriate
- Added type guards and null checks instead of non-null assertions
- Used `ComponentProps` from vue-component-type-helpers for component
testing

#### Widget System
- Added index signature to IWidgetOptions for Record compatibility
- Centralized disabled logic in WidgetInputNumberInput
- Moved template type assertions to computed properties
- Fixed ComboWidget getOptionLabel type assertions
- Improved remote widget type handling with runtime checks

#### Services & Stores
- Fixed getOrCreateViewer to return non-nullable values
- Updated addNodeOnGraph to use specific options type `{ pos?: Point }`
- Added proper type assertions for settings store retrieval
- Fixed executionIdToCurrentId return type (string | undefined)

#### Test Infrastructure
- Exported GraphOrSubgraph from litegraph barrel to avoid circular
dependencies
- Updated test fixtures with proper TypeScript types (TestInfo,
LGraphNode)
- Replaced loose Record types with ComponentProps in tests
- Added proper error handling in WebSocket fixture

#### Code Organization
- Created shared i18n-types module for locale data types
- Made ImportFailureDetail non-exported (internal use only)
- Added @public JSDoc tag to ElectronWindow type
- Fixed console.log usage in scripts to use allowed methods

### Files Changed

**Widgets & Components:**
-
src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.vue
-
src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDefault.vue
-
src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue
- src/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue
-
src/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.ts
- src/lib/litegraph/src/widgets/ComboWidget.ts
- src/lib/litegraph/src/types/widgets.ts
- src/components/common/LazyImage.vue
- src/components/load3d/Load3dViewerContent.vue

**Services & Stores:**
- src/services/litegraphService.ts
- src/services/load3dService.ts
- src/services/colorPaletteService.ts
- src/stores/maskEditorStore.ts
- src/stores/nodeDefStore.ts
- src/platform/settings/settingStore.ts
- src/platform/workflow/management/stores/workflowStore.ts

**Composables & Utils:**
- src/composables/node/useWatchWidget.ts
- src/composables/useCanvasDrop.ts
- src/utils/widgetPropFilter.ts
- src/utils/queueDisplay.ts
- src/utils/envUtil.ts

**Test Files:**
- browser_tests/fixtures/ComfyPage.ts
- browser_tests/fixtures/ws.ts
- browser_tests/tests/actionbar.spec.ts
-
src/workbench/extensions/manager/components/manager/skeleton/PackCardGridSkeleton.test.ts
- src/lib/litegraph/src/subgraph/subgraphUtils.test.ts
- src/components/rightSidePanel/shared.test.ts
- src/platform/cloud/subscription/composables/useSubscription.test.ts
-
src/platform/workflow/persistence/composables/useWorkflowPersistence.test.ts

**Scripts & Types:**
- scripts/i18n-types.ts (new shared module)
- scripts/diff-i18n.ts
- scripts/check-unused-i18n-keys.ts
- src/workbench/extensions/manager/types/conflictDetectionTypes.ts
- src/types/algoliaTypes.ts
- src/types/simplifiedWidget.ts

**Infrastructure:**
- src/lib/litegraph/src/litegraph.ts (added GraphOrSubgraph export)
- src/lib/litegraph/src/infrastructure/CustomEventTarget.ts
- src/platform/assets/services/assetService.ts

**Stories:**
- apps/desktop-ui/src/views/InstallView.stories.ts
- src/components/queue/job/JobDetailsPopover.stories.ts

**Extension Manager:**
- src/workbench/extensions/manager/composables/useConflictDetection.ts
- src/workbench/extensions/manager/composables/useManagerQueue.ts
- src/workbench/extensions/manager/services/comfyManagerService.ts
- src/workbench/extensions/manager/utils/conflictMessageUtil.ts

### Testing

- [x] All TypeScript type checking passes (`pnpm typecheck`)
- [x] ESLint passes without errors (`pnpm lint`)
- [x] Format checks pass (`pnpm format:check`)
- [x] Knip (unused exports) passes (`pnpm knip`)
- [x] Pre-commit and pre-push hooks pass

Part of the "Road to No Explicit Any" initiative.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344
- Part 8 Group 7: #8459
- Part 8 Group 8: #8496
- Part 9: #8498
- Part 10: #8499

---------

Co-authored-by: Comfy Org PR Bot <snomiao+comfy-pr@gmail.com>
Co-authored-by: christian-byrne <72887196+christian-byrne@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
snomiao pushed a commit that referenced this pull request Feb 6, 2026
## Summary

This PR removes `any` types from widgets, services, stores, and test
files, replacing them with proper TypeScript types.

### Key Changes

#### Type Safety Improvements
- Replaced `any` with `unknown`, explicit types, or proper interfaces
across widgets and services
- Added proper type imports (TgpuRoot, Point, StyleValue, etc.)
- Created typed interfaces (NumericWidgetOptions, TestWindow,
ImportFailureDetail, etc.)
- Fixed function return types to be non-nullable where appropriate
- Added type guards and null checks instead of non-null assertions
- Used `ComponentProps` from vue-component-type-helpers for component
testing

#### Widget System
- Added index signature to IWidgetOptions for Record compatibility
- Centralized disabled logic in WidgetInputNumberInput
- Moved template type assertions to computed properties
- Fixed ComboWidget getOptionLabel type assertions
- Improved remote widget type handling with runtime checks

#### Services & Stores
- Fixed getOrCreateViewer to return non-nullable values
- Updated addNodeOnGraph to use specific options type `{ pos?: Point }`
- Added proper type assertions for settings store retrieval
- Fixed executionIdToCurrentId return type (string | undefined)

#### Test Infrastructure
- Exported GraphOrSubgraph from litegraph barrel to avoid circular
dependencies
- Updated test fixtures with proper TypeScript types (TestInfo,
LGraphNode)
- Replaced loose Record types with ComponentProps in tests
- Added proper error handling in WebSocket fixture

#### Code Organization
- Created shared i18n-types module for locale data types
- Made ImportFailureDetail non-exported (internal use only)
- Added @public JSDoc tag to ElectronWindow type
- Fixed console.log usage in scripts to use allowed methods

### Files Changed

**Widgets & Components:**
-
src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.vue
-
src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDefault.vue
-
src/renderer/extensions/vueNodes/widgets/components/WidgetSelectDropdown.vue
- src/renderer/extensions/vueNodes/widgets/components/WidgetTextarea.vue
-
src/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.ts
- src/lib/litegraph/src/widgets/ComboWidget.ts
- src/lib/litegraph/src/types/widgets.ts
- src/components/common/LazyImage.vue
- src/components/load3d/Load3dViewerContent.vue

**Services & Stores:**
- src/services/litegraphService.ts
- src/services/load3dService.ts
- src/services/colorPaletteService.ts
- src/stores/maskEditorStore.ts
- src/stores/nodeDefStore.ts
- src/platform/settings/settingStore.ts
- src/platform/workflow/management/stores/workflowStore.ts

**Composables & Utils:**
- src/composables/node/useWatchWidget.ts
- src/composables/useCanvasDrop.ts
- src/utils/widgetPropFilter.ts
- src/utils/queueDisplay.ts
- src/utils/envUtil.ts

**Test Files:**
- browser_tests/fixtures/ComfyPage.ts
- browser_tests/fixtures/ws.ts
- browser_tests/tests/actionbar.spec.ts
-
src/workbench/extensions/manager/components/manager/skeleton/PackCardGridSkeleton.test.ts
- src/lib/litegraph/src/subgraph/subgraphUtils.test.ts
- src/components/rightSidePanel/shared.test.ts
- src/platform/cloud/subscription/composables/useSubscription.test.ts
-
src/platform/workflow/persistence/composables/useWorkflowPersistence.test.ts

**Scripts & Types:**
- scripts/i18n-types.ts (new shared module)
- scripts/diff-i18n.ts
- scripts/check-unused-i18n-keys.ts
- src/workbench/extensions/manager/types/conflictDetectionTypes.ts
- src/types/algoliaTypes.ts
- src/types/simplifiedWidget.ts

**Infrastructure:**
- src/lib/litegraph/src/litegraph.ts (added GraphOrSubgraph export)
- src/lib/litegraph/src/infrastructure/CustomEventTarget.ts
- src/platform/assets/services/assetService.ts

**Stories:**
- apps/desktop-ui/src/views/InstallView.stories.ts
- src/components/queue/job/JobDetailsPopover.stories.ts

**Extension Manager:**
- src/workbench/extensions/manager/composables/useConflictDetection.ts
- src/workbench/extensions/manager/composables/useManagerQueue.ts
- src/workbench/extensions/manager/services/comfyManagerService.ts
- src/workbench/extensions/manager/utils/conflictMessageUtil.ts

### Testing

- [x] All TypeScript type checking passes (`pnpm typecheck`)
- [x] ESLint passes without errors (`pnpm lint`)
- [x] Format checks pass (`pnpm format:check`)
- [x] Knip (unused exports) passes (`pnpm knip`)
- [x] Pre-commit and pre-push hooks pass

Part of the "Road to No Explicit Any" initiative.

### Previous PRs in this series:
- Part 2: #7401
- Part 3: #7935
- Part 4: #7970
- Part 5: #8064
- Part 6: #8083
- Part 7: #8092
- Part 8 Group 1: #8253
- Part 8 Group 2: #8258
- Part 8 Group 3: #8304
- Part 8 Group 4: #8314
- Part 8 Group 5: #8329
- Part 8 Group 6: #8344
- Part 8 Group 7: #8459
- Part 8 Group 8: #8496
- Part 9: #8498
- Part 10: #8499

---------

Co-authored-by: Comfy Org PR Bot <snomiao+comfy-pr@gmail.com>
Co-authored-by: christian-byrne <72887196+christian-byrne@users.noreply.github.com>
Co-authored-by: github-actions <github-actions@github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants