Skip to content

Road to No explicit any: Group 8 (part 6) test files#8344

Merged
Myestery merged 17 commits intomainfrom
refactor/cleanup-any-part8-group6
Jan 29, 2026
Merged

Road to No explicit any: Group 8 (part 6) test files#8344
Myestery merged 17 commits intomainfrom
refactor/cleanup-any-part8-group6

Conversation

@Myestery
Copy link
Contributor

@Myestery Myestery commented Jan 27, 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 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) 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:

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:

- Replace 'as unknown as Type' patterns with proper typing
- Use factory functions from litegraphTestUtils
- Use 'satisfies' and Partial for type-safe mocks
- Improve mock typing for Pinia stores
- Export DialogInstance from dialogStore
- Fix edge case test type assertions
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 27, 2026

📝 Walkthrough

Walkthrough

Tightens TypeScript typings across tests and utilities, refactors extension invocation APIs to be generic/type-safe, and changes multiple ComfyExtension hook and extension registration callback signatures affecting how the app instance is passed.

Changes

Cohort / File(s) Summary
Vue node & widget tests
src/renderer/extensions/vueNodes/components/LGraphNode.test.ts, src/renderer/extensions/vueNodes/widgets/components/WidgetGalleria.test.ts, src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberInput.test.ts, src/renderer/extensions/vueNodes/widgets/components/form/FormSelectButton.test.ts
Tightened test typings: removed broad any casts, refined computed/prop types, and narrowed option shapes; no runtime change.
Numeric widget composable tests
src/renderer/extensions/vueNodes/widgets/composables/useFloatWidget.test.ts, src/renderer/extensions/vueNodes/widgets/composables/useIntWidget.test.ts
Imported INumericWidget, replaced any fixtures with typed mocks and added required fields/casts to satisfy interface shape.
Remote widget & API tests
src/renderer/extensions/vueNodes/widgets/composables/useRemoteWidget.test.ts, src/scripts/api.featureFlags.test.ts
Replaced ad-hoc mocks with typed helpers (createMockLGraphNode, createMockWidget), tightened axios/WebSocket mock typings and event handler signatures.
Service & util tests
src/services/gateway/registrySearchGateway.test.ts, src/services/jobOutputCache.test.ts, src/services/keybindingService.escape.test.ts, src/services/keybindingService.forwarding.test.ts, src/services/mediaCacheService.test.ts, src/utils/__tests__/litegraphTestUtils.ts
Improved spy/mock typing, constrained override parameter types (e.g., Partial<ChangeTracker>), and adjusted dialog/store mocks for type safety.
Extension service & core types
src/services/extensionService.ts, src/types/comfy.ts
Refactored invokeExtensions/invokeExtensionsAsync to use generics with FunctionPropertyNames, Parameters, and ReturnType; expanded ComfyExtension hook signatures to include app: ComfyApp.
Extension registration callbacks
src/extensions/core/clipspace.ts, src/extensions/core/rerouteNode.ts, src/extensions/core/saveImageExtraOutput.ts, src/extensions/core/widgetInputs.ts
Adjusted extension registration function arities/signatures (removed or changed app parameter in init, registerCustomNodes, beforeRegisterNodeDef, etc.) to align with updated types.
Scripts & metadata
src/scripts/app.ts, src/scripts/metadata/isobmff.ts, src/scripts/ui.ts
Adjusted hook parameter ordering/types (beforeRegisterVueAppNodeDefs), tightened extractJson return type, and changed Props index signature to unknown.
Dialog store export
src/stores/dialogStore.ts
Exported DialogInstance interface for external typing.
Misc small test/type changes
src/services/mediaCacheService.test.ts, other test files under src/renderer/... and src/services/...
Various small type refinements (spy return types, URL mock casts, test casts) across tests.

Sequence Diagram(s)

(omitted)

Possibly related PRs

Suggested reviewers

  • DrJKL
  • simula-r
  • christian-byrne
  • AustinMroz
✨ 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/29/2026, 06:05:33 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 27, 2026

🎭 Playwright Tests: ✅ Passed

Results: 507 passed, 0 failed, 0 flaky, 8 skipped (Total: 515)

📊 Browser Reports
  • chromium: View Report (✅ 495 / ❌ 0 / ⚠️ 0 / ⏭️ 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)

@Myestery Myestery changed the title refactor: improve type safety in test files (group 6) Road to No explicit any: Group 8 (part 6) test files Jan 27, 2026
@github-actions
Copy link

github-actions bot commented Jan 27, 2026

Bundle Size Report

Summary

  • Raw size: 22.1 MB baseline 22.1 MB — 🟢 -259 B
  • Gzip: 4.6 MB baseline 4.6 MB — 🟢 -116 B
  • Brotli: 3.42 MB baseline 3.42 MB — 🟢 -396 B
  • Bundles: 173 current • 173 baseline • 81 added / 81 removed

Category Glance
Other 🟢 -238 B (7.1 MB) · Data & Services 🟢 -13 B (2.7 MB) · Panels & Settings 🟢 -8 B (471 kB) · Vendor & Third-Party ⚪ 0 B (10.7 MB) · Graph Workspace ⚪ 0 B (973 kB) · Views & Navigation ⚪ 0 B (80.7 kB) · + 5 more

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

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-D820EhRt.js (new) 26 kB 🔴 +26 kB 🔴 +7.5 kB 🔴 +6.6 kB
assets/index-DMgMiSVB.js (removed) 26 kB 🟢 -26 kB 🟢 -7.51 kB 🟢 -6.6 kB

Status: 1 added / 1 removed

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

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BkbZVLzX.js (removed) 973 kB 🟢 -973 kB 🟢 -197 kB 🟢 -148 kB
assets/GraphView-BXr9mY-O.js (new) 973 kB 🔴 +973 kB 🔴 +197 kB 🔴 +148 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-B2jgI8vq.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.6 kB 🔴 +3.05 kB
assets/CloudSurveyView-TjUDBYBm.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.61 kB 🟢 -3.05 kB
assets/CloudLoginView-B-mGUJc5.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.71 kB
assets/CloudLoginView-BgkHhTst.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.09 kB 🔴 +2.71 kB
assets/UserCheckView-CUC42cxo.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.45 kB 🟢 -2.13 kB
assets/UserCheckView-DVqpjEm-.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.45 kB 🔴 +2.13 kB
assets/CloudLayoutView-Bch7dpg5.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.24 kB 🔴 +1.95 kB
assets/CloudLayoutView-DoRA7gTt.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.24 kB 🟢 -1.95 kB
assets/CloudSignupView-CZ7Hh_UA.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.33 kB 🔴 +2.02 kB
assets/CloudSignupView-D9hh9LsX.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.02 kB
assets/CloudForgotPasswordView-Ce-nDfs2.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.92 kB 🔴 +1.69 kB
assets/CloudForgotPasswordView-Ch-ebCHy.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/UserSelectView-CIcotGRt.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/UserSelectView-D1x2aiiH.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-8wpJhwyF.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.54 kB
assets/CloudSubscriptionRedirectView-OvelSzaX.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-B-qQ1ogo.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.7 kB 🟢 -1.48 kB
assets/CloudAuthTimeoutView-BcmPB-0a.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.7 kB 🔴 +1.48 kB
assets/CloudSorryContactSupportView-n5f-fGMz.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-V93lMUpe.js 500 B 500 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WorkspacePanel-Crhlp_wE.js (new) 29.8 kB 🔴 +29.8 kB 🔴 +5.89 kB 🔴 +5.14 kB
assets/WorkspacePanel-D1ipA30x.js (removed) 29.8 kB 🟢 -29.8 kB 🟢 -5.89 kB 🟢 -5.13 kB
assets/LegacyCreditsPanel-C4nKJKpT.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.95 kB 🔴 +5.23 kB
assets/LegacyCreditsPanel-H1Psotiq.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.95 kB 🟢 -5.23 kB
assets/SubscriptionPanel-Dej9_bXV.js (new) 21 kB 🔴 +21 kB 🔴 +5.05 kB 🔴 +4.45 kB
assets/SubscriptionPanel-DGgjGSFU.js (removed) 21 kB 🟢 -21 kB 🟢 -5.05 kB 🟢 -4.45 kB
assets/KeybindingPanel-DN6HR2bs.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.74 kB 🟢 -3.3 kB
assets/KeybindingPanel-IBu2sAMX.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.74 kB 🔴 +3.3 kB
assets/AboutPanel-N1dGU2Jw.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.42 kB
assets/AboutPanel-QmVXNJyJ.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.43 kB
assets/ExtensionPanel-CpixuxdN.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.41 kB
assets/ExtensionPanel-pCn_XdDz.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ServerConfigPanel-C9CoSRO2.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.16 kB 🟢 -1.94 kB
assets/ServerConfigPanel-liUaW7Tb.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.16 kB 🔴 +1.94 kB
assets/UserPanel-B-L9B3EM.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.9 kB 🟢 -1.67 kB
assets/UserPanel-DnIZLwS5.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.9 kB 🔴 +1.67 kB
assets/refreshRemoteConfig-BMUYOKg2.js (removed) 1.31 kB 🟢 -1.31 kB 🟢 -573 B 🟢 -500 B
assets/refreshRemoteConfig-CAn-TI4m.js (new) 1.31 kB 🔴 +1.31 kB 🔴 +570 B 🔴 +502 B
assets/config-sUiempTV.js (removed) 1.16 kB 🟢 -1.16 kB 🟢 -608 B 🟢 -540 B
assets/config-Cis2adVU.js (new) 1.15 kB 🔴 +1.15 kB 🔴 +603 B 🔴 +534 B
assets/cloudRemoteConfig-DXzvQvh6.js (new) 1.11 kB 🔴 +1.11 kB 🔴 +513 B 🔴 +435 B
assets/cloudRemoteConfig-KYqGhvSR.js (removed) 1.11 kB 🟢 -1.11 kB 🟢 -512 B 🟢 -446 B
assets/refreshRemoteConfig-DDrODmVa.js (removed) 169 B 🟢 -169 B 🟢 -108 B 🟢 -103 B
assets/refreshRemoteConfig-tNamhWem.js (new) 169 B 🔴 +169 B 🔴 +108 B 🔴 +107 B
assets/remoteConfig-B0mlVvm7.js 788 B 788 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-2UNjEj6k.js 32.9 kB 32.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B2OMGvh7.js 31.2 kB 31.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BcujOfpn.js 29.6 kB 29.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BI09_t23.js 29.4 kB 29.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BKamuseh.js 25.8 kB 25.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BlTun9tZ.js 26.4 kB 26.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CZ62uO3e.js 30.2 kB 30.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DaK-NByz.js 35.2 kB 35.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DaS3cSXp.js 39.4 kB 39.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DWbMuaAa.js 32 kB 32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-S7pA60Hj.js 30.4 kB 30.4 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-Drw3w4e8.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.05 kB
assets/auth-VTltK67s.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.24 kB 🟢 -1.07 kB
assets/firebaseAuthStore-BW7dpd8l.js (new) 217 B 🔴 +217 B 🔴 +136 B 🔴 +117 B
assets/firebaseAuthStore-DD4BtFBQ.js (removed) 217 B 🟢 -217 B 🟢 -136 B 🟢 -118 B
assets/auth-CYvhZ7Qz.js (removed) 178 B 🟢 -178 B 🟢 -142 B 🟢 -136 B
assets/auth-Dkvi-VI-.js (new) 178 B 🔴 +178 B 🔴 +142 B 🔴 +129 B

Status: 3 added / 3 removed

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

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-CwKP9BKn.js (removed) 2.71 kB 🟢 -2.71 kB 🟢 -1.28 kB 🟢 -1.14 kB
assets/useSubscriptionDialog-D9A3o9ZK.js (new) 2.71 kB 🔴 +2.71 kB 🔴 +1.29 kB 🔴 +1.15 kB
assets/useSubscriptionDialog-BOZ3dKPc.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -95 B
assets/useSubscriptionDialog-CDqpB7dZ.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +97 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-CX9oSdmY.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.42 kB
assets/ComfyQueueButton-HkZc3xOw.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.69 kB 🟢 -2.41 kB
assets/SubscribeButton-6OnY7-fO.js (removed) 4.63 kB 🟢 -4.63 kB 🟢 -1.57 kB 🟢 -1.38 kB
assets/SubscribeButton-CaRS2nKk.js (new) 4.63 kB 🔴 +4.63 kB 🔴 +1.57 kB 🔴 +1.39 kB
assets/cloudFeedbackTopbarButton-aZk-bW-X.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +675 B 🔴 +575 B
assets/cloudFeedbackTopbarButton-CyxrIqzP.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -676 B 🟢 -575 B
assets/ComfyQueueButton-4d51ejPE.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -108 B
assets/ComfyQueueButton-DsU1ra4g.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +110 B
assets/Button-Bb_i0j7c.js 3.82 kB 3.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-BNjL4ma_.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-qACg_vGT.js 8.36 kB 8.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-D80lITos.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DSv9NFvF.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 4 added / 4 removed

Data & Services — 2.7 MB (baseline 2.7 MB) • 🟢 -13 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-C-QcFWO2.js (removed) 2 MB 🟢 -2 MB 🟢 -424 kB 🟢 -324 kB
assets/dialogService-BQT1h1mI.js (new) 2 MB 🔴 +2 MB 🔴 +424 kB 🔴 +323 kB
assets/api-BIDJhnaR.js (new) 674 kB 🔴 +674 kB 🔴 +149 kB 🔴 +118 kB
assets/api-BvD9_cNo.js (removed) 674 kB 🟢 -674 kB 🟢 -149 kB 🟢 -118 kB
assets/releaseStore-7H1jFp_0.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.4 kB 🔴 +2.12 kB
assets/releaseStore-bQz1NrSq.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.4 kB 🟢 -2.12 kB
assets/keybindingService-ksqF21JY.js (new) 6.78 kB 🔴 +6.78 kB 🔴 +1.74 kB 🔴 +1.52 kB
assets/keybindingService-z7geqZJ7.js (removed) 6.78 kB 🟢 -6.78 kB 🟢 -1.74 kB 🟢 -1.52 kB
assets/bootstrapStore-BZuDOOKk.js (removed) 2.69 kB 🟢 -2.69 kB 🟢 -1.03 kB 🟢 -963 B
assets/bootstrapStore-Cw_17yAB.js (new) 2.69 kB 🔴 +2.69 kB 🔴 +1.03 kB 🔴 +968 B
assets/userStore-B9zKfmP7.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -811 B 🟢 -724 B
assets/userStore-BZPqOq-e.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +813 B 🔴 +725 B
assets/audioService-Cr5mTs4M.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -930 B 🟢 -810 B
assets/audioService-D8jjUOIg.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +930 B 🔴 +819 B
assets/releaseStore-BQe3c-Gk.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +111 B
assets/releaseStore-DU4noyJ9.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -111 B
assets/serverConfigStore-DOoqLe5c.js 2.64 kB 2.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useErrorHandling-DpTBvf8B.js (removed) 5.21 kB 🟢 -5.21 kB 🟢 -1.53 kB 🟢 -1.35 kB
assets/useErrorHandling-k9HY9zba.js (new) 5.21 kB 🔴 +5.21 kB 🔴 +1.53 kB 🔴 +1.35 kB
assets/useWorkspaceUI-CLdYCyVE.js (new) 3.42 kB 🔴 +3.42 kB 🔴 +976 B 🔴 +840 B
assets/useWorkspaceUI-NjilRQPG.js (removed) 3.42 kB 🟢 -3.42 kB 🟢 -976 B 🟢 -836 B
assets/useSubscriptionActions-CdmtDcDE.js (removed) 2.22 kB 🟢 -2.22 kB 🟢 -868 B 🟢 -760 B
assets/useSubscriptionActions-DEywbXd8.js (new) 2.22 kB 🔴 +2.22 kB 🔴 +869 B 🔴 +760 B
assets/subscriptionCheckoutUtil-BX7jgHsJ.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -872 B 🟢 -763 B
assets/subscriptionCheckoutUtil-M03PBbhi.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +872 B 🔴 +770 B
assets/useSubscriptionCredits-BBUdNSCg.js (removed) 1.39 kB 🟢 -1.39 kB 🟢 -600 B 🟢 -530 B
assets/useSubscriptionCredits-DBNUg0mL.js (new) 1.39 kB 🔴 +1.39 kB 🔴 +600 B 🔴 +529 B
assets/audioUtils-BsAQ3HZz.js (removed) 970 B 🟢 -970 B 🟢 -549 B 🟢 -490 B
assets/audioUtils-CIUf_7KD.js (new) 970 B 🔴 +970 B 🔴 +548 B 🔴 +491 B
assets/useCurrentUser-gcfpUZMg.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +106 B
assets/useCurrentUser-SIBx2dTk.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -101 B
assets/_plugin-vue_export-helper-DuK_Fly3.js 467 B 467 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-GMAsfHxw.js 7.2 kB 7.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-ivqHoiOs.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tailwindUtil-CJjrIEVR.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-DHGfk3hn.js 408 kB 408 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-jpGqhHNG.js 4.1 MB 4.1 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-4Jj8eU28.js 3.04 MB 3.04 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-aCG649nF.js 263 kB 263 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-CERwhPwK.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BxrEVL6s.js 650 kB 650 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-Dwii0E-t.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-IX6P8SWv.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.1 MB (baseline 7.1 MB) • 🟢 -238 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-at1g2hfR.js (removed) 180 kB 🟢 -180 kB 🟢 -43.3 kB 🟢 -36.2 kB
assets/core-BE6mWBiU.js (new) 180 kB 🔴 +180 kB 🔴 +43.3 kB 🔴 +36.1 kB
assets/WidgetSelect-B3LwmwL7.js (removed) 51 kB 🟢 -51 kB 🟢 -11.3 kB 🟢 -9.81 kB
assets/WidgetSelect-zkVOlwLb.js (new) 51 kB 🔴 +51 kB 🔴 +11.2 kB 🔴 +9.81 kB
assets/Load3DControls-DFV3Nw-A.js (new) 35.9 kB 🔴 +35.9 kB 🔴 +5.87 kB 🔴 +5.08 kB
assets/Load3DControls-DNyz2M4Y.js (removed) 35.9 kB 🟢 -35.9 kB 🟢 -5.87 kB 🟢 -5.09 kB
assets/SubscriptionRequiredDialogContent-B_eg6kYg.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.79 kB 🟢 -5.92 kB
assets/SubscriptionRequiredDialogContent-jAzuH6lX.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.79 kB 🔴 +5.92 kB
assets/CurrentUserPopoverWorkspace-BFKMOK-d.js (new) 22.2 kB 🔴 +22.2 kB 🔴 +4.99 kB 🔴 +4.42 kB
assets/CurrentUserPopoverWorkspace-ckJOgT6H.js (removed) 22.2 kB 🟢 -22.2 kB 🟢 -4.99 kB 🟢 -4.42 kB
assets/Load3D-BsB6_JDm.js (removed) 19.2 kB 🟢 -19.2 kB 🟢 -4.37 kB 🟢 -3.85 kB
assets/Load3D-CpKHeKqh.js (new) 19.2 kB 🔴 +19.2 kB 🔴 +4.37 kB 🔴 +3.85 kB
assets/WidgetRecordAudio-DacXRf32.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.97 kB 🟢 -4.44 kB
assets/WidgetRecordAudio-DbOPClEY.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.97 kB 🔴 +4.44 kB
assets/WidgetInputNumber-C1R4HxsT.js (removed) 18.3 kB 🟢 -18.3 kB 🟢 -4.51 kB 🟢 -4.02 kB
assets/WidgetInputNumber-DqT8weDo.js (new) 18.3 kB 🔴 +18.3 kB 🔴 +4.51 kB 🔴 +4.02 kB
assets/SubscriptionPanelContentWorkspace-DZU7-yxz.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.47 kB 🟢 -3.9 kB
assets/SubscriptionPanelContentWorkspace-hPMtXhpO.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.47 kB 🔴 +3.9 kB
assets/WidgetImageCrop-C5P0Ow0y.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.62 kB
assets/WidgetImageCrop-EYDnwBcp.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.14 kB 🔴 +3.62 kB
assets/PanelTemplate-DJSwpueV.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.8 kB
assets/PanelTemplate-zNxA44dA.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.46 kB 🟢 -4.8 kB
assets/AudioPreviewPlayer-D3MYERYS.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.98 kB 🟢 -2.65 kB
assets/AudioPreviewPlayer-lZMZz858.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.98 kB 🔴 +2.65 kB
assets/InviteMemberDialogContent-3ccI3xKQ.js (removed) 8.36 kB 🟢 -8.36 kB 🟢 -2.51 kB 🟢 -2.17 kB
assets/InviteMemberDialogContent-CxgWf84P.js (new) 8.36 kB 🔴 +8.36 kB 🔴 +2.5 kB 🔴 +2.17 kB
assets/WidgetWithControl-BVizt3Hi.js (removed) 8.07 kB 🟢 -8.07 kB 🟢 -2.68 kB 🟢 -2.41 kB
assets/WidgetWithControl-vvhde3-H.js (new) 8.07 kB 🔴 +8.07 kB 🔴 +2.68 kB 🔴 +2.41 kB
assets/CreateWorkspaceDialogContent-BA6XJPDu.js (new) 5.93 kB 🔴 +5.93 kB 🔴 +1.93 kB 🔴 +1.68 kB
assets/CreateWorkspaceDialogContent-BrZ0ppdM.js (removed) 5.93 kB 🟢 -5.93 kB 🟢 -1.93 kB 🟢 -1.69 kB
assets/EditWorkspaceDialogContent-DHHv7m5x.js (removed) 5.7 kB 🟢 -5.7 kB 🟢 -1.88 kB 🟢 -1.64 kB
assets/EditWorkspaceDialogContent-K-tkmQvT.js (new) 5.7 kB 🔴 +5.7 kB 🔴 +1.88 kB 🔴 +1.64 kB
assets/ValueControlPopover-3xOH_Sn6.js (removed) 5.17 kB 🟢 -5.17 kB 🟢 -1.69 kB 🟢 -1.5 kB
assets/ValueControlPopover-BeRFG4mS.js (new) 5.17 kB 🔴 +5.17 kB 🔴 +1.68 kB 🔴 +1.5 kB
assets/DeleteWorkspaceDialogContent-CEyq44KT.js (removed) 4.59 kB 🟢 -4.59 kB 🟢 -1.56 kB 🟢 -1.35 kB
assets/DeleteWorkspaceDialogContent-ZSCC217r.js (new) 4.59 kB 🔴 +4.59 kB 🔴 +1.56 kB 🔴 +1.35 kB
assets/LeaveWorkspaceDialogContent-ByUxP4yU.js (new) 4.41 kB 🔴 +4.41 kB 🔴 +1.5 kB 🔴 +1.3 kB
assets/LeaveWorkspaceDialogContent-tj1PkxkP.js (removed) 4.41 kB 🟢 -4.41 kB 🟢 -1.51 kB 🟢 -1.3 kB
assets/RemoveMemberDialogContent-D-LMXeYy.js (removed) 4.38 kB 🟢 -4.38 kB 🟢 -1.45 kB 🟢 -1.26 kB
assets/RemoveMemberDialogContent-GKGbCzQR.js (new) 4.38 kB 🔴 +4.38 kB 🔴 +1.46 kB 🔴 +1.26 kB
assets/RevokeInviteDialogContent-brI5RsKG.js (new) 4.29 kB 🔴 +4.29 kB 🔴 +1.47 kB 🔴 +1.29 kB
assets/RevokeInviteDialogContent-XAOMwVgJ.js (removed) 4.29 kB 🟢 -4.29 kB 🟢 -1.47 kB 🟢 -1.29 kB
assets/GlobalToast-bsilrlcz.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.09 kB 🔴 +945 B
assets/GlobalToast-BZEeUqne.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -945 B
assets/SubscribeToRun-CHCUFuao.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.15 kB 🔴 +1.01 kB
assets/SubscribeToRun-D-WjARyH.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.16 kB 🟢 -1.01 kB
assets/cloudSessionCookie-OyBUjy6W.js (removed) 2.94 kB 🟢 -2.94 kB 🟢 -928 B 🟢 -802 B
assets/cloudSessionCookie-yTSbXt0m.js (new) 2.94 kB 🔴 +2.94 kB 🔴 +929 B 🔴 +806 B
assets/BaseViewTemplate-DFws52cw.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -942 B
assets/BaseViewTemplate-DZDo6-AW.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +943 B
assets/CloudRunButtonWrapper-B5XImnJo.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -646 B 🟢 -562 B
assets/CloudRunButtonWrapper-B94axw1-.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +645 B 🔴 +561 B
assets/cloudBadges-CtYrdK0Q.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -539 B 🟢 -475 B
assets/cloudBadges-DylMUVu4.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +538 B 🔴 +475 B
assets/graphHasMissingNodes-5moERqDW.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -461 B 🟢 -409 B
assets/graphHasMissingNodes-ZqzKr2s7.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +463 B 🔴 +412 B
assets/cloudSubscription-BQJu8Y0p.js (new) 976 B 🔴 +976 B 🔴 +467 B 🔴 +400 B
assets/cloudSubscription-CYw4B1WG.js (removed) 976 B 🟢 -976 B 🟢 -467 B 🟢 -398 B
assets/nightlyBadges-C-CUwIfq.js (removed) 595 B 🟢 -595 B 🟢 -357 B 🟢 -308 B
assets/nightlyBadges-kR9dixCB.js (new) 595 B 🔴 +595 B 🔴 +357 B 🔴 +311 B
assets/SubscriptionPanelContentWorkspace-Bo39YwJz.js (removed) 266 B 🟢 -266 B 🟢 -136 B 🟢 -125 B
assets/SubscriptionPanelContentWorkspace-p34ssxXS.js (new) 266 B 🔴 +266 B 🔴 +136 B 🔴 +124 B
assets/WidgetInputNumber-BaZFHWPH.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -111 B
assets/WidgetInputNumber-CSig_wLv.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +114 B
assets/WidgetLegacy-CmLFgs5Z.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +104 B
assets/WidgetLegacy-FIHDRhDt.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -111 B
assets/Load3D-BViu9fq9.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -111 B
assets/Load3D-Dbm287ts.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +116 B
assets/auto-DWs2ctGL.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BEw5ErI4.js 18.5 kB 18.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BGeHkplA.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BV0l36Iz.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C_Y3D6Cn.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C6piRza5.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Cf8Zq1td.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CiziP3Xs.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-D1595tOr.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DXauvccL.js 20.6 kB 20.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-P5QCEfZc.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-WbYP_D61.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-COrIg4fJ.js 188 B 188 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-Cp-AD5FJ.js 499 kB 499 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-DHwPdKGO.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BHtk4Fg_.js 174 kB 174 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BMSlgLcp.js 155 kB 155 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BQCWi9e4.js 112 kB 112 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BWJjz1qs.js 130 kB 130 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CJicmTR7.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CNOkBy-u.js 126 kB 126 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CySb1R5_.js 151 kB 151 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DMUPIFMF.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DpsGU4si.js 126 kB 126 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dz6IPJXM.js 144 kB 144 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-lrEzMywH.js 128 kB 128 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-DUmUhXD6.js 2.38 kB 2.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-CD66_Mw_.js 2 kB 2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-Bqe7yvm_.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-De3MzVmp.js 2.82 kB 2.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-CC2-PIpB.js 143 B 143 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-A7pvB7zM.js 370 kB 370 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BIVjUijC.js 345 kB 345 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Chkn0HaI.js 343 kB 343 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CK_6GHao.js 452 kB 452 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CToVAwnT.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DDabdWgx.js 417 kB 417 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DgvJyE3d.js 386 kB 386 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DjxaeFt_.js 416 kB 416 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DslnWEGg.js 377 kB 377 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-EPAM3kwk.js 373 kB 373 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-NrulhNyH.js 366 kB 366 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-CmezY7As.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-D4lsf6Ob.js 4.21 kB 4.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-BJiJuR5i.js 518 B 518 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-CUtab2CB.js 4.71 kB 4.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-D79nBMxa.js 186 B 186 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-CiXfBVBH.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-BxNqMlFv.js 3.71 kB 3.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-DDD96zwa.js 4.57 kB 4.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-A6pZMGtc.js 3.79 kB 3.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-DSMUKRnt.js 2.58 kB 2.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-MDImyvc3.js 2.7 kB 2.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-a8bZhyc5.js 3.49 kB 3.49 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-ERx8czR8.js 1.31 kB 1.31 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-CV3BoahN.js 3.87 kB 3.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-ZdaYkxkD.js 3.26 kB 3.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-KPj-zM0O.js 573 B 573 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 34 added / 34 removed

…ache.test

Make the incomplete mock for ComfyWorkflowJSON explicit by using Partial<ComfyWorkflowJSON> in the declaration while preserving the expected full type when passing to extractWorkflow mock
Remove post-hoc type cast and redundant null fallback by calling extractJson with the correct generic type parameter. This makes the function's static type reflect the actual return type.
- Replace local MockWidget types with actual INumericWidget type in useIntWidget.test.ts and useFloatWidget.test.ts
- Use Partial<T> as T pattern for creating test fixtures with only required properties
- Make incomplete mock explicit using Partial in jobOutputCache.test.ts

These changes ensure test types stay in sync with real widget interfaces and make incomplete mocks explicit.
@Myestery Myestery marked this pull request as ready for review January 27, 2026 23:54
@Myestery Myestery requested a review from a team as a code owner January 27, 2026 23:54
@dosubot dosubot bot added the size:L This PR changes 100-499 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: 2

Caution

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

⚠️ Outside diff range comments (2)
src/renderer/extensions/vueNodes/widgets/components/form/FormSelectButton.test.ts (1)

9-28: Consider importing the options type from the component to avoid type duplication.

The change from any[] to unknown[] is a clear improvement for type safety. However, the inline union type on lines 20-24 duplicates what should be defined in FormSelectButton.vue. If the component's prop type changes, this cast could silently become out of sync.

Based on learnings, import real type definitions from the component module to maintain a single source of truth and prevent type drift.

♻️ Suggested approach
// If the component exports its option type:
import type { FormSelectButtonOption } from './FormSelectButton.vue'

const mountComponent = (
  modelValue: string | null | undefined = null,
  options: FormSelectButtonOption[] = [],
  props: Record<string, unknown> = {}
) => {
  return mount(FormSelectButton, {
    global: { plugins: [PrimeVue] },
    props: { modelValue, options, ...props }
  })
}

If the type isn't currently exported, consider exporting it from the component.

src/services/keybindingService.forwarding.test.ts (1)

129-142: Ensure mocked globals are restored even on test failure.

A failing assertion before the manual restore can leak mutated state into later tests. Wrap the body in try/finally.

♻️ Suggested refactor
 it('should not forward Delete key when canvas processKey is not available', async () => {
   // Temporarily replace processKey with undefined - testing edge case
   const originalProcessKey = vi.mocked(app.canvas).processKey
   vi.mocked(app.canvas).processKey = undefined!

   const event = createTestKeyboardEvent('Delete')

-  await keybindingService.keybindHandler(event)
-
-  expect(vi.mocked(useCommandStore().execute)).not.toHaveBeenCalled()
-
-  // Restore processKey for other tests
-  vi.mocked(app.canvas).processKey = originalProcessKey
+  try {
+    await keybindingService.keybindHandler(event)
+    expect(vi.mocked(useCommandStore().execute)).not.toHaveBeenCalled()
+  } finally {
+    // Restore processKey for other tests
+    vi.mocked(app.canvas).processKey = originalProcessKey
+  }
 })

 it('should not forward Delete key when canvas is not available', async () => {
   // Temporarily set canvas to null
   const originalCanvas = vi.mocked(app).canvas
   vi.mocked(app).canvas = null!

   const event = createTestKeyboardEvent('Delete')

-  await keybindingService.keybindHandler(event)
-
-  expect(vi.mocked(useCommandStore().execute)).not.toHaveBeenCalled()
-
-  // Restore canvas for other tests
-  vi.mocked(app).canvas = originalCanvas
+  try {
+    await keybindingService.keybindHandler(event)
+    expect(vi.mocked(useCommandStore().execute)).not.toHaveBeenCalled()
+  } finally {
+    // Restore canvas for other tests
+    vi.mocked(app).canvas = originalCanvas
+  }
 })

Also applies to: 145-157

🤖 Fix all issues with AI agents
In `@src/services/keybindingService.escape.test.ts`:
- Around line 185-188: The test currently hides missing DialogInstance fields by
casting the mock item to DialogInstance; change the item cast to
Partial<DialogInstance> (e.g., the object { key: 'test-dialog' } should be cast
as Partial<DialogInstance>) to make the incompleteness explicit, and adjust the
spreaded store mock cast to a Partial of the store return type (e.g.,
Partial<ReturnType<typeof useDialogStore>> or Partial<Omit<ReturnType<typeof
useDialogStore>, 'dialogStack'>>) so the test types reflect intentionally
incomplete mocks while still supplying dialogStack.

In `@src/services/newUserService.test.ts`:
- Around line 54-60: The mock construction for mockSettingStoreTyped is overly
verbose and should be simplified: in the initializer for mockSettingStoreTyped
replace the "({} as Omit<...>)" pattern with a Partial-based cast by casting the
assembled object to Partial<ReturnType<typeof useSettingStore>> and then to
ReturnType<typeof useSettingStore>; update the mock construction that spreads
mockSettingStore to use this Partial<T> as T pattern so the test clearly signals
an incomplete mock while preserving call-site types.

Comment on lines +185 to +188
dialogStack: [{ key: 'test-dialog' } as DialogInstance],
// Add other required properties as undefined/default values to satisfy the type
...({} as Omit<ReturnType<typeof useDialogStore>, 'dialogStack'>)
})
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

Make the incomplete DialogInstance mock explicit. The current cast hides missing required fields. Use a Partial<DialogInstance> cast to reflect the intentional incompleteness.

♻️ Proposed fix
-      dialogStack: [{ key: 'test-dialog' } as DialogInstance],
+      dialogStack: [
+        { key: 'test-dialog' } as Partial<DialogInstance> as DialogInstance
+      ],
Based on learnings, prefer Partial casts for incomplete interface mocks.
📝 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
dialogStack: [{ key: 'test-dialog' } as DialogInstance],
// Add other required properties as undefined/default values to satisfy the type
...({} as Omit<ReturnType<typeof useDialogStore>, 'dialogStack'>)
})
dialogStack: [
{ key: 'test-dialog' } as Partial<DialogInstance> as DialogInstance
],
// Add other required properties as undefined/default values to satisfy the type
...({} as Omit<ReturnType<typeof useDialogStore>, 'dialogStack'>)
})
🤖 Prompt for AI Agents
In `@src/services/keybindingService.escape.test.ts` around lines 185 - 188, The
test currently hides missing DialogInstance fields by casting the mock item to
DialogInstance; change the item cast to Partial<DialogInstance> (e.g., the
object { key: 'test-dialog' } should be cast as Partial<DialogInstance>) to make
the incompleteness explicit, and adjust the spreaded store mock cast to a
Partial of the store return type (e.g., Partial<ReturnType<typeof
useDialogStore>> or Partial<Omit<ReturnType<typeof useDialogStore>,
'dialogStack'>>) so the test types reflect intentionally incomplete mocks while
still supplying dialogStack.

AustinMroz
AustinMroz previously approved these changes Jan 28, 2026
- Merge main branch and resolve conflicts in three test files
- Keep api import from main in useRemoteWidget.test.ts
- Merge imports properly in jobOutputCache.test.ts
- Update useNewUserService.test.ts for renamed service
- Add try/finally blocks in keybindingService.forwarding.test.ts for proper cleanup
- Remove unused type imports and simplify mock setup
The app parameter was always undefined at runtime as it was never passed down
from the invokeExtensions methods. This change removes the parameter from all
10 affected methods in the ComfyExtension interface.

Codesearch analysis shows no external repositories actually use this parameter,
making this a non-breaking change despite the interface modification.

Also fixed TypeScript type helper to avoid ESLint Function type warning.
AustinMroz
AustinMroz previously approved these changes Jan 29, 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: 2

🤖 Fix all issues with AI agents
In `@src/scripts/app.ts`:
- Around line 920-924: The invokeExtensions call is passing app twice causing
extension hooks like beforeRegisterVueAppNodeDefs to receive (defs, app, app);
remove the explicit app argument so you call
useExtensionService().invokeExtensions('beforeRegisterVueAppNodeDefs',
nodeDefArray) (i.e., leave invokeExtensions to append app itself) and ensure you
keep nodeDefArray and the hook name unchanged.
- Line 1297: The call to
useExtensionService().invokeExtensions('loadedGraphNode', node, app) is passing
app twice to the loadedGraphNode hook; update the invocation to let
invokeExtensions append app itself by removing the explicit app argument so it
becomes invokeExtensions('loadedGraphNode', node). Locate the call site where
invokeExtensions is invoked with 'loadedGraphNode' (the line currently passing
node, app) and remove the extra app parameter to avoid calling
loadedGraphNode(node, app, app).

@Myestery
Copy link
Contributor Author

I will take one more look by morning before merging

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

Caution

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

⚠️ Outside diff range comments (2)
src/services/extensionService.ts (2)

176-189: Inconsistent typing between invokeExtensions and invokeExtensionsAsync.

invokeExtensions uses full generic typing with Parameters<ComfyExtension[T]>, while invokeExtensionsAsync still uses the looser keyof ComfyExtension and unknown[]. Both functions have the same app appending behavior (line 189), so they should have consistent type signatures.

Consider applying the same generic pattern to invokeExtensionsAsync for consistency, or document why the approaches differ.


144-155: Type signature mismatch: app parameter handling is inconsistent across method calls.

The invokeExtensions function unconditionally appends app at line 155 (ext[method](...args, app)), but callers sometimes already pass app in their arguments. For example:

  • invokeExtensions('loadedGraphNode', node, app) → becomes ext.loadedGraphNode(node, app, app) (app passed twice)
  • invokeExtensions('getCanvasMenuItems', canvas) → becomes ext.getCanvasMenuItems(canvas, app) (but signature expects only canvas)

The interface defines loadedGraphNode(node: LGraphNode, app: ComfyApp): void and beforeRegisterVueAppNodeDefs(defs: ComfyNodeDef[], app: ComfyApp): void with app as a parameter, yet getCanvasMenuItems(canvas: LGraphCanvas) and getNodeMenuItems(node: LGraphNode) do not include app. The automatic app injection violates the type signature at runtime.

Additionally, invokeExtensionsAsync (line 189) has the same unconditional app append, with inconsistent typing (unknown[] vs generics). Methods like init(), setup(), and registerCustomNodes() expect only app, while others expect different parameters in addition to app.

Add utility type to strip the app parameter from extension method signatures
since the extension service automatically provides it. This fixes TypeScript
errors when calling invokeExtensions and invokeExtensionsAsync.

- Create RemoveLastAppParam and ComfyExtensionParamsWithoutApp types
- Update invokeExtensions to use transformed parameter types
- Update invokeExtensionsAsync with the same fix
- Remove manual app parameter passing from call sites
const nodeDefArray: ComfyNodeDefV1[] = Object.values(allNodeDefs)
useExtensionService().invokeExtensions(
'beforeRegisterVueAppNodeDefs',
nodeDefArray,
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@AustinMroz I was able to ensure that this is the only runtime effect in this PR.
We initially passed app twice but now its passed only once

@Myestery Myestery enabled auto-merge (squash) January 29, 2026 18:09
@Myestery Myestery assigned AustinMroz and unassigned AustinMroz Jan 29, 2026
@Myestery Myestery merged commit cabd08f into main Jan 29, 2026
27 checks passed
@Myestery Myestery deleted the refactor/cleanup-any-part8-group6 branch January 29, 2026 19:03
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:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants