Skip to content

Road to no explicit any part 8 group 5#8329

Merged
Myestery merged 9 commits intomainfrom
refactor/cleanup-any-part8-group5
Jan 27, 2026
Merged

Road to no explicit any part 8 group 5#8329
Myestery merged 9 commits intomainfrom
refactor/cleanup-any-part8-group5

Conversation

@Myestery
Copy link
Contributor

@Myestery Myestery commented Jan 27, 2026

Summary

  • Add createMockLLink and createMockLinks factory functions to handle hybrid Map/Record types
  • Replace as any assertions with type-safe factory functions in minimap tests
  • Implement proper Pinia store mocking using vi.hoisted() pattern
  • Remove unused createMockSubgraph export (shadowed by local implementations)

Test plan

  • All minimap tests pass (29 tests)
  • pnpm typecheck passes
  • pnpm lint passes
  • pnpm knip passes

┆Issue is synchronized with this Notion page by Unito

- Add createMockLLink and createMockLinks factory functions for hybrid Map/Record type
- Replace as any assertions with factory functions in minimap tests
- Implement proper Pinia store mocking using vi.hoisted pattern
- Update useMinimapGraph tests to use factory functions consistently
- Fix inline import type annotations in createMockSubgraph
- Clean up formatting inconsistencies in test files
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 27, 2026

📝 Walkthrough

Walkthrough

This PR tightens TypeScript types and refactors tests across the codebase: replacing unsafe casts with precise types and Vue refs, introducing hoisted/typed mock factories and reusable litegraph test utilities, and one small production typing/logging change in workflow validation. No public API signatures were changed.

Changes

Cohort / File(s) Summary
Platform updates tests
src/platform/updates/common/releaseService.test.ts, src/platform/updates/common/releaseStore.test.ts, src/platform/updates/common/useFrontendVersionMismatchWarning.test.ts, src/platform/updates/common/versionCompatibilityStore.test.ts, src/platform/updates/components/ReleaseNotificationToast.test.ts, src/platform/updates/components/WhatsNewPopup.test.ts
Replace unsafe casts with stricter typings/refs, tighten mocks (use of ref, explicit Mock types), adjust i18n mock param typing, add TestWindow typing for electronAPI. Tests only; no runtime behavior changes.
Minimap composables tests
src/renderer/extensions/minimap/composables/useMinimap.test.ts, src/renderer/extensions/minimap/composables/useMinimapGraph.test.ts, src/renderer/extensions/minimap/composables/useMinimapInteraction.test.ts, src/renderer/extensions/minimap/composables/useMinimapRenderer.test.ts, src/renderer/extensions/minimap/composables/useMinimapSettings.test.ts, src/renderer/extensions/minimap/composables/useMinimapViewport.test.ts
Migrate mocks to module-scoped factories and helper utilities, replace broad any casts with Ref<T> and precise Partial/MinimapCanvas typings, centralize mocked graph/canvas state, and introduce typed MockSettingStore and hoisted mocks.
Minimap canvas renderer & other rendering tests
src/renderer/extensions/minimap/minimapCanvasRenderer.test.ts, src/renderer/core/layout/transform/useTransformState.test.ts
Replace inline literal mocks and broad casts with helper-created litegraph mocks and precise Canvas/LGraphCanvas typings; use shared test utilities.
Workflow store & persistence tests
src/platform/workflow/management/stores/workflowStore.test.ts, src/platform/workflow/persistence/composables/useWorkflowAutoSave.test.ts, src/platform/workflow/templates/composables/useTemplateUrlLoader.test.ts, src/platform/workflow/templates/composables/useTemplateWorkflows.test.ts
Introduce/consume mock factories (createMockCanvas, createMockChangeTracker), tighten query param typings to allow string[], replace ad-hoc casts with vi.mocked(...) usages, and refine mock store typings; some draft-related tests were removed/adjusted.
Minimap test utilities
src/utils/__tests__/litegraphTestUtils.ts
Add new exported mock factory functions: createMockChangeTracker, createMockMinimapCanvas, createMockCanvas2DContext, createMockLLink, createMockLinks; add related type imports and helper defaults for reuse across tests.
Workflow validation (production)
src/platform/workflow/validation/composables/useWorkflowValidation.ts
Accept ISerialisedGraph into link fixer, update logger to accept rest params and concatenate args, and simplify linkValidation result usage. No signature changes to exported APIs.

Sequence Diagram(s)

(omitted — changes are test refactors and a small internal typing/logging tweak; not a new multi-component control flow)

Possibly related PRs

Suggested reviewers

  • shinshin86
  • jtydhr88
  • christian-byrne
  • AustinMroz
  • simula-r
✨ 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 27, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/27/2026, 06:17:26 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 27, 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 (✅ 491 / ❌ 0 / ⚠️ 2 / ⏭️ 8)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 9 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@github-actions
Copy link

github-actions bot commented Jan 27, 2026

Bundle Size Report

Summary

  • Raw size: 22 MB baseline 22 MB — 🟢 -192 B
  • Gzip: 4.59 MB baseline 4.59 MB — 🟢 -11 B
  • Brotli: 3.41 MB baseline 3.41 MB — 🟢 -149 B
  • Bundles: 170 current • 170 baseline • 82 added / 82 removed

Category Glance
Other 🟢 -192 B (6.55 MB) · Data & Services 🔴 +8 B (3.19 MB) · Panels & Settings 🟢 -8 B (470 kB) · Vendor & Third-Party ⚪ 0 B (10.7 MB) · Graph Workspace ⚪ 0 B (960 kB) · Views & Navigation ⚪ 0 B (80.7 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BLGil196.js (removed) 22.8 kB 🟢 -22.8 kB 🟢 -6.84 kB 🟢 -6.03 kB
assets/index-C3AoNA-0.js (new) 22.8 kB 🔴 +22.8 kB 🔴 +6.84 kB 🔴 +6.03 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BjTIlQ3K.js (removed) 960 kB 🟢 -960 kB 🟢 -194 kB 🟢 -147 kB
assets/GraphView-D6vCpFLK.js (new) 960 kB 🔴 +960 kB 🔴 +194 kB 🔴 +147 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-BfGhMYHo.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.61 kB 🔴 +3.06 kB
assets/CloudSurveyView-xkq_g0Yk.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.6 kB 🟢 -3.05 kB
assets/CloudLoginView-C6az-XHT.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.09 kB 🔴 +2.72 kB
assets/CloudLoginView-Cn16Dc8k.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.72 kB
assets/UserCheckView-CgNivAxr.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.44 kB 🟢 -2.13 kB
assets/UserCheckView-DmsWW0xP.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.44 kB 🔴 +2.13 kB
assets/CloudLayoutView-B7kwxl0E.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.25 kB 🔴 +1.96 kB
assets/CloudLayoutView-BKEgd-xi.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.24 kB 🟢 -1.96 kB
assets/CloudSignupView---NUD8Zn.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.03 kB
assets/CloudSignupView-D6wYPeUz.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.33 kB 🔴 +2.03 kB
assets/CloudForgotPasswordView-DgsZf_rw.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.92 kB 🔴 +1.69 kB
assets/CloudForgotPasswordView-DSZiQpg8.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.92 kB 🟢 -1.69 kB
assets/UserSelectView-2oXBAYBW.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/UserSelectView-D9RemHze.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-0okeR0HH.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.53 kB
assets/CloudSubscriptionRedirectView-B9A9tyF6.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.54 kB
assets/CloudAuthTimeoutView-BpiJHM9B.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.71 kB 🔴 +1.49 kB
assets/CloudAuthTimeoutView-XMe40Fc6.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.7 kB 🟢 -1.48 kB
assets/CloudSorryContactSupportView-B5gYo5Lv.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-MvRmLoAK.js 500 B 500 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WorkspacePanel-C-S2OozT.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -5.89 kB 🟢 -5.14 kB
assets/WorkspacePanel-Xc_HssQz.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +5.89 kB 🔴 +5.14 kB
assets/LegacyCreditsPanel-CcUWnNxD.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.95 kB 🟢 -5.22 kB
assets/LegacyCreditsPanel-D-DKRnWB.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.95 kB 🔴 +5.22 kB
assets/SubscriptionPanel-Da99N49q.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +5.01 kB 🔴 +4.42 kB
assets/SubscriptionPanel-Do902z6E.js (removed) 20.9 kB 🟢 -20.9 kB 🟢 -5.01 kB 🟢 -4.41 kB
assets/KeybindingPanel-BqqFpZ3g.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.74 kB 🟢 -3.31 kB
assets/KeybindingPanel-BtuDj06R.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.74 kB 🔴 +3.31 kB
assets/AboutPanel-CdYtaM3I.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.43 kB
assets/AboutPanel-DqD6IzCv.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.43 kB
assets/ExtensionPanel-BGi9p4FO.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ExtensionPanel-h8ZzZgGS.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/ServerConfigPanel-0PFsH6SV.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.17 kB 🔴 +1.94 kB
assets/ServerConfigPanel-Cdl6bcn1.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.17 kB 🟢 -1.94 kB
assets/UserPanel-BGgR1ls4.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.91 kB 🔴 +1.67 kB
assets/UserPanel-CYC7kZf4.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.91 kB 🟢 -1.67 kB
assets/config-YxogKcGK.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -610 B 🟢 -533 B
assets/config-DY84lxna.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +604 B 🔴 +532 B
assets/refreshRemoteConfig-B4coiaTM.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +521 B 🔴 +485 B
assets/refreshRemoteConfig-h9dOIkaF.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -522 B 🟢 -488 B
assets/cloudRemoteConfig-C0aJj-o9.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +508 B 🔴 +433 B
assets/cloudRemoteConfig-KmYhJB-t.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -509 B 🟢 -438 B
assets/refreshRemoteConfig-BaiYmDG7.js (new) 169 B 🔴 +169 B 🔴 +108 B 🔴 +105 B
assets/refreshRemoteConfig-Bp6MOcEa.js (removed) 169 B 🟢 -169 B 🟢 -108 B 🟢 -102 B
assets/remoteConfig-w1E3DdAQ.js 536 B 536 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B0OU6-pB.js 39.4 kB 39.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BG8Zhz_I.js 32.9 kB 32.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bh7k-ZzJ.js 30.2 kB 30.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C_BaoiA5.js 25.8 kB 25.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CaVpP3Yk.js 35.2 kB 35.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CT-O-PKz.js 30.4 kB 30.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DQtYvoMH.js 31.2 kB 31.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DrFp_k1j.js 29.4 kB 29.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DWJH5Rx7.js 32 kB 32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-HIJPcXNb.js 26.4 kB 26.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-jYq3vZ8H.js 29.6 kB 29.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 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-D2kpcW-r.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.06 kB
assets/auth-uw32QruC.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.06 kB
assets/firebaseAuthStore-CV08sSy2.js (removed) 217 B 🟢 -217 B 🟢 -136 B 🟢 -119 B
assets/firebaseAuthStore-mN1asNMn.js (new) 217 B 🔴 +217 B 🔴 +136 B 🔴 +119 B
assets/auth--ssCrKZS.js (new) 178 B 🔴 +178 B 🔴 +141 B 🔴 +129 B
assets/auth-B1kaw6P5.js (removed) 178 B 🟢 -178 B 🟢 -142 B 🟢 -141 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-B1dvtr0I.js (new) 2.65 kB 🔴 +2.65 kB 🔴 +1.25 kB 🔴 +1.11 kB
assets/useSubscriptionDialog-CDcoaA17.js (removed) 2.65 kB 🟢 -2.65 kB 🟢 -1.25 kB 🟢 -1.11 kB
assets/useSubscriptionDialog-CcKJjCpo.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +100 B
assets/useSubscriptionDialog-D6JyMUe-.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -98 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-DvYf9SM8.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.42 kB
assets/ComfyQueueButton-Ww3IrQUW.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.69 kB 🟢 -2.42 kB
assets/SubscribeButton-DaRu9EN-.js (new) 4.63 kB 🔴 +4.63 kB 🔴 +1.57 kB 🔴 +1.39 kB
assets/SubscribeButton-DZk_TXll.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.57 kB 🟢 -1.39 kB
assets/CloudBadge-BdBmiEEU.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +722 B 🔴 +646 B
assets/CloudBadge-DCsF3Q15.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -724 B 🟢 -657 B
assets/cloudFeedbackTopbarButton-C-5X2IzZ.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +678 B 🔴 +575 B
assets/cloudFeedbackTopbarButton-DaemmSKL.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -676 B 🟢 -577 B
assets/ComfyQueueButton-BE-MoT3Q.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +113 B
assets/ComfyQueueButton-DRAaEQKD.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -120 B
assets/Button-B9mYP1x0.js 3.82 kB 3.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-DHZYSmi1.js 8.36 kB 8.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-CIuPULbC.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-BFtcBv-z.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 3.19 MB (baseline 3.19 MB) • 🔴 +8 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-Ajdxk9QZ.js (new) 2 MB 🔴 +2 MB 🔴 +423 kB 🔴 +323 kB
assets/dialogService-CPx1jn7R.js (removed) 2 MB 🟢 -2 MB 🟢 -423 kB 🟢 -323 kB
assets/api-9NKbKFl4.js (new) 1.17 MB 🔴 +1.17 MB 🔴 +244 kB 🔴 +189 kB
assets/api-Jl9YnUUI.js (removed) 1.17 MB 🟢 -1.17 MB 🟢 -244 kB 🟢 -189 kB
assets/releaseStore-D0Hc5Hbo.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.4 kB 🔴 +2.12 kB
assets/releaseStore-Di8i9JCe.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.4 kB 🟢 -2.12 kB
assets/keybindingService-_i9-8sT7.js (new) 6.78 kB 🔴 +6.78 kB 🔴 +1.74 kB 🔴 +1.51 kB
assets/keybindingService-CwB39Jut.js (removed) 6.78 kB 🟢 -6.78 kB 🟢 -1.74 kB 🟢 -1.52 kB
assets/userStore-DjkjSsfL.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -812 B 🟢 -725 B
assets/userStore-mxNb-CG2.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +813 B 🔴 +722 B
assets/audioService--hq30dBW.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -932 B 🟢 -821 B
assets/audioService-B-F5vOnj.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +931 B 🔴 +820 B
assets/teamWorkspaceStore-BporvKBV.js (removed) 165 B 🟢 -165 B 🟢 -123 B 🟢 -111 B
assets/teamWorkspaceStore-Fi6M_VyR.js (new) 165 B 🔴 +165 B 🔴 +123 B 🔴 +107 B
assets/releaseStore-HIEDXWYy.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -107 B
assets/releaseStore-SREywK5Q.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +111 B
assets/serverConfigStore-B2LzN8g1.js 2.64 kB 2.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useErrorHandling-0oKkSS4l.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.5 kB 🟢 -1.31 kB
assets/useErrorHandling-CqHkmS5K.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.5 kB 🔴 +1.31 kB
assets/useWorkspaceUI-CtmvcC_J.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -973 B 🟢 -834 B
assets/useWorkspaceUI-DAda2Dc8.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +975 B 🔴 +835 B
assets/useSubscriptionActions-BMi35yfv.js (new) 2.22 kB 🔴 +2.22 kB 🔴 +870 B 🔴 +761 B
assets/useSubscriptionActions-Us4rO6NQ.js (removed) 2.22 kB 🟢 -2.22 kB 🟢 -871 B 🟢 -761 B
assets/subscriptionCheckoutUtil-CG16SKoh.js (new) 2 kB 🔴 +2 kB 🔴 +865 B 🔴 +754 B
assets/subscriptionCheckoutUtil-Dq0aYNHH.js (removed) 2 kB 🟢 -2 kB 🟢 -865 B 🟢 -758 B
assets/useSubscriptionCredits-BgbFvvoL.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +598 B 🔴 +529 B
assets/useSubscriptionCredits-MrKyUgQm.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -598 B 🟢 -532 B
assets/audioUtils-d7bePrxH.js (removed) 970 B 🟢 -970 B 🟢 -546 B 🟢 -487 B
assets/audioUtils-MfC4AU2h.js (new) 970 B 🔴 +970 B 🔴 +548 B 🔴 +462 B
assets/useCurrentUser-AcXFjHOL.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +98 B
assets/useCurrentUser-CiS-TGa9.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -104 B
assets/_plugin-vue_export-helper-DLRTaeJK.js 467 B 467 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-8brfHtOx.js 7.2 kB 7.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DBMaRy6q.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tailwindUtil-Hy0jY5OA.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-DdBDBwvF.js 408 kB 408 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-Dk4vQph5.js 4.1 MB 4.1 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-BK91gQps.js 3.04 MB 3.04 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-Bh_PdEOO.js 256 kB 256 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-BKpliY5_.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BFRBT3RT.js 650 kB 650 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-DMjbEcx7.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-PDw3y6Aq.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 6.55 MB (baseline 6.55 MB) • 🟢 -192 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-CyITyi9j.js (removed) 180 kB 🟢 -180 kB 🟢 -43.3 kB 🟢 -36.2 kB
assets/core-BKywW9ui.js (new) 180 kB 🔴 +180 kB 🔴 +43.3 kB 🔴 +36.2 kB
assets/WidgetSelect-BjO__oiO.js (new) 51 kB 🔴 +51 kB 🔴 +11.2 kB 🔴 +9.83 kB
assets/WidgetSelect-DHcyseI2.js (removed) 51 kB 🟢 -51 kB 🟢 -11.2 kB 🟢 -9.79 kB
assets/Load3DControls-BhdTdUBu.js (removed) 35.9 kB 🟢 -35.9 kB 🟢 -5.87 kB 🟢 -5.09 kB
assets/Load3DControls-HNj7TvNw.js (new) 35.9 kB 🔴 +35.9 kB 🔴 +5.87 kB 🔴 +5.08 kB
assets/SubscriptionRequiredDialogContent--L0FnJJG.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.78 kB 🔴 +5.91 kB
assets/SubscriptionRequiredDialogContent-BVuzqIaY.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.78 kB 🟢 -5.91 kB
assets/CurrentUserPopoverWorkspace-Cvmz231s.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -4.99 kB 🟢 -4.43 kB
assets/CurrentUserPopoverWorkspace-CXMH2FDJ.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +4.99 kB 🔴 +4.42 kB
assets/Load3D-BLU18FI1.js (removed) 20.9 kB 🟢 -20.9 kB 🟢 -4.59 kB 🟢 -4.02 kB
assets/Load3D-Cv2QPclK.js (new) 20.9 kB 🔴 +20.9 kB 🔴 +4.59 kB 🔴 +4.01 kB
assets/WidgetInputNumber-BbLLU4h0.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.51 kB 🟢 -4.01 kB
assets/WidgetInputNumber-D2qp2BqM.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.51 kB 🔴 +4.02 kB
assets/WidgetRecordAudio-D49ywSJK.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.96 kB 🔴 +4.43 kB
assets/WidgetRecordAudio-DI3uqEVF.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.96 kB 🟢 -4.43 kB
assets/SubscriptionPanelContentWorkspace-Ck-J_wq0.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.47 kB 🔴 +3.9 kB
assets/SubscriptionPanelContentWorkspace-DAgg3Bu2.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.47 kB 🟢 -3.9 kB
assets/WidgetImageCrop-BpEiF0ck.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.14 kB 🔴 +3.62 kB
assets/WidgetImageCrop-DddLwwYW.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.63 kB
assets/PanelTemplate-BWtX2DGU.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.45 kB 🟢 -4.79 kB
assets/PanelTemplate-hs5_tMmQ.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.79 kB
assets/AudioPreviewPlayer-Bumtqils.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.97 kB 🟢 -2.65 kB
assets/AudioPreviewPlayer-Dv2BgtmJ.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.97 kB 🔴 +2.65 kB
assets/InviteMemberDialogContent-Ne6w3mgV.js (new) 8.36 kB 🔴 +8.36 kB 🔴 +2.51 kB 🔴 +2.17 kB
assets/InviteMemberDialogContent-oL4gaSgb.js (removed) 8.36 kB 🟢 -8.36 kB 🟢 -2.5 kB 🟢 -2.17 kB
assets/WidgetWithControl-DBWzkg9K.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.65 kB 🟢 -2.39 kB
assets/WidgetWithControl-DStubQQG.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.65 kB 🔴 +2.38 kB
assets/CreateWorkspaceDialogContent-BWoluB5i.js (new) 5.93 kB 🔴 +5.93 kB 🔴 +1.93 kB 🔴 +1.68 kB
assets/CreateWorkspaceDialogContent-D5PN1G6Z.js (removed) 5.93 kB 🟢 -5.93 kB 🟢 -1.93 kB 🟢 -1.68 kB
assets/EditWorkspaceDialogContent-8BU2SE82.js (new) 5.7 kB 🔴 +5.7 kB 🔴 +1.88 kB 🔴 +1.64 kB
assets/EditWorkspaceDialogContent-TM1MgM3v.js (removed) 5.7 kB 🟢 -5.7 kB 🟢 -1.88 kB 🟢 -1.64 kB
assets/ValueControlPopover-C8pTyiQ-.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.54 kB 🟢 -1.37 kB
assets/ValueControlPopover-CpeMEdVA.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.55 kB 🔴 +1.37 kB
assets/DeleteWorkspaceDialogContent-BroKGkA9.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.57 kB 🔴 +1.35 kB
assets/DeleteWorkspaceDialogContent-DhKZ_oxR.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.56 kB 🟢 -1.35 kB
assets/LeaveWorkspaceDialogContent-BeUVF2Qm.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.51 kB 🔴 +1.3 kB
assets/LeaveWorkspaceDialogContent-Pfw5SlF1.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.5 kB 🟢 -1.31 kB
assets/RemoveMemberDialogContent-CBNZUfxp.js (removed) 4.38 kB 🟢 -4.38 kB 🟢 -1.45 kB 🟢 -1.27 kB
assets/RemoveMemberDialogContent-QpmygB4T.js (new) 4.38 kB 🔴 +4.38 kB 🔴 +1.45 kB 🔴 +1.27 kB
assets/RevokeInviteDialogContent-aa9g1dW5.js (new) 4.29 kB 🔴 +4.29 kB 🔴 +1.47 kB 🔴 +1.29 kB
assets/RevokeInviteDialogContent-CHH1d0Jr.js (removed) 4.29 kB 🟢 -4.29 kB 🟢 -1.47 kB 🟢 -1.29 kB
assets/GlobalToast-B9kE9KPt.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +944 B
assets/GlobalToast-n6f0d3SJ.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -941 B
assets/SubscribeToRun-DAcGADkC.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.16 kB 🟢 -1.01 kB
assets/SubscribeToRun-DRmH7z-H.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.16 kB 🔴 +1.04 kB
assets/cloudSessionCookie-CF-HxoPY.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +936 B 🔴 +803 B
assets/cloudSessionCookie-Vt6Z3JoB.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -936 B 🟢 -804 B
assets/BaseViewTemplate-CT_Uoluf.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -937 B
assets/BaseViewTemplate-DkT35xvr.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +940 B
assets/CloudRunButtonWrapper-Bdb4Vq4i.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +645 B 🔴 +598 B
assets/CloudRunButtonWrapper-C-vsPwoj.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -643 B 🟢 -565 B
assets/cloudBadges-DfayzbBI.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -539 B 🟢 -479 B
assets/cloudBadges-Ql5oztl8.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +539 B 🔴 +501 B
assets/graphHasMissingNodes-2Jf1Gfp9.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +460 B 🔴 +423 B
assets/graphHasMissingNodes-BOXNcpoN.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -459 B 🟢 -430 B
assets/cloudSubscription-BQE216jD.js (new) 976 B 🔴 +976 B 🔴 +463 B 🔴 +401 B
assets/cloudSubscription-V4_Vy5C5.js (removed) 976 B 🟢 -976 B 🟢 -462 B 🟢 -399 B
assets/nightlyBadges-BoTL_FJq.js (removed) 594 B 🟢 -594 B 🟢 -358 B 🟢 -312 B
assets/nightlyBadges-CkVsCM5a.js (new) 594 B 🔴 +594 B 🔴 +357 B 🔴 +311 B
assets/SubscriptionPanelContentWorkspace-C_2Y_VdF.js (removed) 266 B 🟢 -266 B 🟢 -136 B 🟢 -119 B
assets/SubscriptionPanelContentWorkspace-CBU8YHIO.js (new) 266 B 🔴 +266 B 🔴 +136 B 🔴 +116 B
assets/WidgetInputNumber-CM-LD9VL.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -110 B
assets/WidgetInputNumber-wsf256Te.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +115 B
assets/WidgetLegacy-_AcIDSQp.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -113 B
assets/WidgetLegacy-DziLFbJs.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +105 B
assets/Load3D-D1ezQlNC.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +106 B
assets/Load3D-D5ozYeZD.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -109 B
assets/auto-BmypP-XQ.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-27PChCGl.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-B52_zgXW.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BC_Q8we6.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BZlNQPg2.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CgVf6wUK.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CuidUnsD.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D5OfZ3bv.js 18.5 kB 18.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Dmj47WTl.js 20.6 kB 20.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DUK2nLuH.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-K3soE7da.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-MVcGSIbM.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-rWQpxwnM.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-akhLOzys.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BAD0AZuf.js 111 kB 111 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cu50a8UC.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-d4ZcTV7L.js 172 kB 172 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DhCVcHpP.js 125 kB 125 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DvfWsSBh.js 129 kB 129 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dyymoku4.js 125 kB 125 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-oCqMFbo3.js 150 kB 150 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-rcgwfJJa.js 112 kB 112 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-RPBRc45Y.js 128 kB 128 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-sT768wiI.js 154 kB 154 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-8_T22Isd.js 2.38 kB 2.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-CBP8th-j.js 2 kB 2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-1THG_DJM.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-yhq80asg.js 2.82 kB 2.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-BiPjOPVW.js 143 B 143 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-75iqoHK1.js 412 kB 412 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BgIXRnZk.js 383 kB 383 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BkQR1m9D.js 342 kB 342 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C3-BImCp.js 448 kB 448 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CC3d1IX6.js 339 kB 339 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CCnfIwZD.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CeaH9-p6.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ChGhVGtO.js 413 kB 413 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ClsEmImE.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CUgTHcSh.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DaayC8qD.js 363 kB 363 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-B-XG7lU7.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-BAEfKuro.js 4.21 kB 4.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-CD3JnB1i.js 518 B 518 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-Bp7B7z1s.js 186 B 186 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-CgNPbPqq.js 4.71 kB 4.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-3mC7A_va.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-x8L_rIAb.js 3.71 kB 3.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-f72WaoQY.js 4.57 kB 4.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-Dd0p7l7V.js 3.79 kB 3.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-DOFSeOZG.js 2.58 kB 2.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-CZXFB71F.js 2.61 kB 2.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-bP5F2-qx.js 3.22 kB 3.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DOe9Bb1I.js 1.31 kB 1.31 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-DwdEJ3mA.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-BIK7gguT.js 3.08 kB 3.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 34 added / 34 removed

- Rename module-level mockCanvas/mockGraph to moduleMockCanvas/moduleMockGraph
- Remove shadowing local declarations in describe block
- Ensures vi.mock('@/scripts/app') references the same instances tests use
- Add reset method to createMockChangeTracker to satisfy ChangeTracker API
- Add sensible defaults to createMockLLink (id, type, slots, _pos)
- Tests can now call changeTracker.reset() without errors
- Mock links are usable without requiring all fields via overrides
@Myestery Myestery marked this pull request as ready for review January 27, 2026 03:49
@dosubot dosubot bot added the size:XXL This PR changes 1000+ lines, ignoring generated files. label Jan 27, 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: 4

🤖 Fix all issues with AI agents
In `@src/platform/workflow/validation/composables/useWorkflowValidation.ts`:
- Around line 80-82: The code casts the result of tryFixLinks to
ComfyWorkflowJSON without ensuring the fixed graph still matches the workflow
schema; update tryFixLinks (or the caller before assigning validatedData) to
re-run the workflow schema validation after link fixes and throw or return a
clear error if validation fails. Specifically, inside tryFixLinks (after the
link removal/patching logic) call the same validation routine used earlier (the
workflow schema validator), and either return a validated/typed
ComfyWorkflowJSON or propagate a validation error so the caller's cast is safe;
if you prefer to keep fixes local, perform the re-validation right before
assigning validatedData to guarantee the schema compliance.

In `@src/renderer/core/layout/transform/useTransformState.test.ts`:
- Around line 34-36: Replace direct casts to LGraphCanvas in the tests with
explicit partial casts using the Partial utility (e.g., change occurrences where
mocks pass only { ds: { offset, scale } } to use "as Partial<LGraphCanvas> as
LGraphCanvas") so the incomplete mock shape is explicit and type-safe; update
each call site that calls transformState.syncWithCanvas(...) (including the
instances called out in the review) to use this pattern, and for the test that
passes a null sentinel keep the existing null! as LGraphCanvas or alternatively
broaden the syncWithCanvas signature to accept LGraphCanvas | null if null
handling is intended to be part of the API.

In `@src/renderer/extensions/minimap/minimapCanvasRenderer.test.ts`:
- Around line 221-223: The test uses an overly verbose double-cast for the
groups array (`as Partial<(typeof mockGraph._groups)[number]>[] as typeof
mockGraph._groups`); replace this by introducing a small factory helper (e.g.,
createMockGroup) that returns the exact group type of mockGraph._groups elements
and use it to build the array (or map sample partial data through it) so you can
remove the double-cast; update tests to construct groups via createMockGroup and
reference mockGraph._groups only for the element type in the factory signature
to keep types strict and readable.

In `@src/utils/__tests__/litegraphTestUtils.ts`:
- Around line 257-279: The test utilities define two overlapping
helpers—createMockCanvas2DContext and createMockCanvasRenderingContext2D—leading
to duplication; either merge them into a single comprehensive factory or clearly
document/use-case split. Update the helpers by consolidating both into one
function named createMockCanvasRenderingContext2D (or export both but delegate
one to the other) so the full set of methods (clearRect, fillRect, beginPath,
measureText, etc.) are present, and remove duplicate logic; alternatively add
JSDoc comments to each function clarifying when to use
createMockCanvasRenderingContext2D (text-only/measureText) vs
createMockCanvas2DContext (rendering) and have one call the other to keep
maintenance minimal. Ensure references to createMockCanvas2DContext and
createMockCanvasRenderingContext2D in tests are updated to the chosen
implementation.

Comment on lines +80 to +82
validatedData = tryFixLinks(validatedGraphData, {
silent
}) as ComfyWorkflowJSON
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find linkFixer file and inspect tryFixLinks implementation
find src -type f -name "*linkFixer*" -o -name "*link*" | grep -i fixer | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 92


🏁 Script executed:

#!/bin/bash
# Also search for tryFixLinks definition
rg -l "tryFixLinks|fixBadLinks" src --type ts --type tsx

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 97


🏁 Script executed:

#!/bin/bash
# Check the useWorkflowValidation file to see the context
cat -n src/platform/workflow/validation/composables/useWorkflowValidation.ts | sed -n '70,90p'

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 654


🏁 Script executed:

#!/bin/bash
# Read the linkFixer.ts file to understand tryFixLinks implementation
wc -l src/utils/linkFixer.ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 96


🏁 Script executed:

#!/bin/bash
# Read linkFixer.ts, focusing on tryFixLinks definition
rg -n "tryFixLinks|export" src/utils/linkFixer.ts | head -30

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 101


🏁 Script executed:

#!/bin/bash
# Get the full linkFixer.ts file
cat -n src/utils/linkFixer.ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 19306


🏁 Script executed:

#!/bin/bash
# Search for tryFixLinks function definition
rg -n "tryFixLinks" src --type ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 297


🏁 Script executed:

#!/bin/bash
# Check imports in useWorkflowValidation.ts
head -40 src/platform/workflow/validation/composables/useWorkflowValidation.ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1273


🏁 Script executed:

#!/bin/bash
# Get more of the useWorkflowValidation.ts file to see full tryFixLinks
cat -n src/platform/workflow/validation/composables/useWorkflowValidation.ts | sed -n '1,100p'

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 3248


Add re-validation after link fixing for safety assurance.

tryFixLinks modifies the graph by removing and patching link references but doesn't re-validate the result against the workflow schema before returning. While logically, removing invalid links shouldn't break schema compliance, the type cast to ComfyWorkflowJSON (line 82) provides no guarantee. Consider adding a validation step after line 52 in tryFixLinks to confirm the modified graph still satisfies the schema, or document why re-validation is unnecessary if the link-only modifications preserve validity.

🤖 Prompt for AI Agents
In `@src/platform/workflow/validation/composables/useWorkflowValidation.ts` around
lines 80 - 82, The code casts the result of tryFixLinks to ComfyWorkflowJSON
without ensuring the fixed graph still matches the workflow schema; update
tryFixLinks (or the caller before assigning validatedData) to re-run the
workflow schema validation after link fixes and throw or return a clear error if
validation fails. Specifically, inside tryFixLinks (after the link
removal/patching logic) call the same validation routine used earlier (the
workflow schema validator), and either return a validated/typed
ComfyWorkflowJSON or propagate a validation error so the caller's cast is safe;
if you prefer to keep fixes local, perform the re-validation right before
assigning validatedData to guarantee the schema compliance.

Comment on lines 34 to +36
transformState.syncWithCanvas({
ds: { offset: [0, 0] }
} as unknown as LGraphCanvas)
} as LGraphCanvas)
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

🧩 Analysis chain

🏁 Script executed:

# First, let's read the test file to see the actual casts at the mentioned lines
cat -n src/renderer/core/layout/transform/useTransformState.test.ts | head -360 | tail -330

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 12899


🏁 Script executed:

# Check the syncWithCanvas signature in the main file
rg -A 5 "syncWithCanvas" src/renderer/core/layout/transform/useTransformState.ts | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 444


🏁 Script executed:

# Also check the LGraphCanvas type definition
rg -B 2 -A 10 "interface LGraphCanvas\|type LGraphCanvas" --type ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Quick check: verify createMockCanvasContext structure and confirm it only provides partial properties
rg -B 2 -A 8 "createMockCanvasContext" src/renderer/core/layout/transform/useTransformState.test.ts | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 597


🏁 Script executed:

# Check if LGraphCanvas interface is defined in the repo to understand full interface
fd -t f "LGraphCanvas" --type ts | head -10

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 239


🏁 Script executed:

# Find LGraphCanvas interface definition
rg -A 15 "interface LGraphCanvas|type LGraphCanvas" --type ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 3992


🏁 Script executed:

# Also search more broadly for where LGraphCanvas is imported from
rg "LGraphCanvas" src/renderer/core/layout/transform/useTransformState.test.ts | head -5

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 308


🏁 Script executed:

# Let's verify the full LGraphCanvas class definition to understand its scope
rg -A 50 "^class LGraphCanvas|^export class LGraphCanvas" src/lib/litegraph/src/LGraphCanvas.ts | head -70

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2252


Use Partial<LGraphCanvas> casts for partial mocks.

Throughout the test file, mocks provide only a subset of LGraphCanvas properties (typically just { ds: { offset, scale } }). Use as Partial<LGraphCanvas> as LGraphCanvas to explicitly acknowledge the incomplete implementation while maintaining type safety. This pattern is preferred over direct interface casts in test files.

For the null case at line 75, the signature function syncWithCanvas(canvas: LGraphCanvas) doesn't accept null, but the implementation gracefully handles it (if (!canvas || !canvas.ds) return). The test's null! as LGraphCanvas is acceptable for testing this defensive behavior, or you could widen the signature to accept LGraphCanvas | null if null handling is a documented feature.

♻️ Example adjustments
-    } as LGraphCanvas)
+    } as Partial<LGraphCanvas> as LGraphCanvas)
-      syncWithCanvas(mockCanvas as LGraphCanvas)
+      syncWithCanvas(mockCanvas as Partial<LGraphCanvas> as LGraphCanvas)
-      syncWithCanvas(null! as LGraphCanvas)
+      syncWithCanvas(null as unknown as Partial<LGraphCanvas> as LGraphCanvas)

or consider widening signature to accept LGraphCanvas | null directly.

Applies to lines: 36, 65, 75, 87, 102, 117, 179, 204, 260, 268, 279, 325, 333, 346

🤖 Prompt for AI Agents
In `@src/renderer/core/layout/transform/useTransformState.test.ts` around lines 34
- 36, Replace direct casts to LGraphCanvas in the tests with explicit partial
casts using the Partial utility (e.g., change occurrences where mocks pass only
{ ds: { offset, scale } } to use "as Partial<LGraphCanvas> as LGraphCanvas") so
the incomplete mock shape is explicit and type-safe; update each call site that
calls transformState.syncWithCanvas(...) (including the instances called out in
the review) to use this pattern, and for the test that passes a null sentinel
keep the existing null! as LGraphCanvas or alternatively broaden the
syncWithCanvas signature to accept LGraphCanvas | null if null handling is
intended to be part of the API.

Comment on lines +221 to +223
] as Partial<
(typeof mockGraph._groups)[number]
>[] as typeof mockGraph._groups
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

Complex type cast for groups array.

The cast as Partial<(typeof mockGraph._groups)[number]>[] as typeof mockGraph._groups is verbose but correctly handles the nested partial type. This could potentially be simplified with a createMockGroup utility in the future.

🤖 Prompt for AI Agents
In `@src/renderer/extensions/minimap/minimapCanvasRenderer.test.ts` around lines
221 - 223, The test uses an overly verbose double-cast for the groups array (`as
Partial<(typeof mockGraph._groups)[number]>[] as typeof mockGraph._groups`);
replace this by introducing a small factory helper (e.g., createMockGroup) that
returns the exact group type of mockGraph._groups elements and use it to build
the array (or map sample partial data through it) so you can remove the
double-cast; update tests to construct groups via createMockGroup and reference
mockGraph._groups only for the element type in the factory signature to keep
types strict and readable.

Comment on lines +257 to +279
/**
* Creates a mock CanvasRenderingContext2D for canvas testing
*/
export function createMockCanvas2DContext(
overrides: Partial<CanvasRenderingContext2D> = {}
): CanvasRenderingContext2D {
const partial: Partial<CanvasRenderingContext2D> = {
clearRect: vi.fn(),
fillRect: vi.fn(),
strokeRect: vi.fn(),
beginPath: vi.fn(),
moveTo: vi.fn(),
lineTo: vi.fn(),
stroke: vi.fn(),
arc: vi.fn(),
fill: vi.fn(),
fillStyle: '',
strokeStyle: '',
lineWidth: 1,
...overrides
}
return partial as CanvasRenderingContext2D
}
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

Consider consolidating with existing createMockCanvasRenderingContext2D.

There's an existing createMockCanvasRenderingContext2D function at lines 124-132 that only mocks measureText. This new createMockCanvas2DContext is more complete with rendering methods (clearRect, fillRect, beginPath, etc.). Consider either:

  1. Consolidating these into one function, or
  2. Documenting when to use each (e.g., one for text measurement tests, one for rendering tests)
🤖 Prompt for AI Agents
In `@src/utils/__tests__/litegraphTestUtils.ts` around lines 257 - 279, The test
utilities define two overlapping helpers—createMockCanvas2DContext and
createMockCanvasRenderingContext2D—leading to duplication; either merge them
into a single comprehensive factory or clearly document/use-case split. Update
the helpers by consolidating both into one function named
createMockCanvasRenderingContext2D (or export both but delegate one to the
other) so the full set of methods (clearRect, fillRect, beginPath, measureText,
etc.) are present, and remove duplicate logic; alternatively add JSDoc comments
to each function clarifying when to use createMockCanvasRenderingContext2D
(text-only/measureText) vs createMockCanvas2DContext (rendering) and have one
call the other to keep maintenance minimal. Ensure references to
createMockCanvas2DContext and createMockCanvasRenderingContext2D in tests are
updated to the chosen implementation.

AustinMroz
AustinMroz previously approved these changes Jan 27, 2026
Copy link
Collaborator

@AustinMroz AustinMroz left a comment

Choose a reason for hiding this comment

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

Only saw a real tiny nit on this one.

Co-authored-by: AustinMroz <austin@comfy.org>
@Myestery Myestery disabled auto-merge January 27, 2026 18:24
@Myestery Myestery merged commit 3946d7b into main Jan 27, 2026
27 checks passed
@Myestery Myestery deleted the refactor/cleanup-any-part8-group5 branch January 27, 2026 18:25
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.

2 participants