Skip to content

Comments

feat: integrate nightly survey system into app#8480

Open
christian-byrne wants to merge 1 commit intomainfrom
feat/survey-integration
Open

feat: integrate nightly survey system into app#8480
christian-byrne wants to merge 1 commit intomainfrom
feat/survey-integration

Conversation

@christian-byrne
Copy link
Contributor

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

Summary

Wires the nightly survey system into the app by adding a controller component and a convenience composable for feature-site usage tracking.

Changes

  • What: NightlySurveyController iterates enabled surveys from the registry and renders a NightlySurveyPopover for each. useSurveyFeatureTracking wraps useFeatureUsageTracker with a config-enabled guard for use at feature call sites.
  • Tree-shaking: Controller is loaded via defineAsyncComponent behind a compile-time isNightly/isCloud/isDesktop guard in SideToolbar.vue, so the entire survey module subtree is eliminated from cloud/desktop/stable builds.

Review Focus

  • DCE pattern: controller imported conditionally via defineAsyncComponent + distribution guard (same pattern as ComfyRunButton/index.ts)
  • useSurveyFeatureTracking short-circuits early when config is absent/disabled (avoids initializing tracker storage)
  • No user-facing behavior change: FEATURE_SURVEYS registry is still empty

Part of Nightly Survey System

This is part 5 of a stacked PR chain:

  1. feat/feature-usage-tracker - useFeatureUsageTracker (merged in feat: add composable to determine if user is eligible for nightly survey(s) #8189)
  2. feat/survey-eligibility - useSurveyEligibility (feat: add composable to determine if user is eligible for nightly survey(s) #8189, merged)
  3. feat/survey-config - surveyRegistry.ts (feat: add survey registry for feature survey configurations #8355, merged)
  4. feat/survey-popover - NightlySurveyPopover.vue (feat: add NightlySurveyPopover component for feature surveys #9083, merged)
  5. feat/survey-integration - NightlySurveyController.vue (this PR)

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 30, 2026

📝 Walkthrough

Walkthrough

Introduces a nightly survey feature consisting of a lazy-loaded controller component that renders survey popover components for enabled surveys, alongside a feature tracking composable that monitors survey feature usage with full test coverage.

Changes

Cohort / File(s) Summary
Survey Controller Integration
src/components/sidebar/SideToolbar.vue, src/platform/surveys/NightlySurveyController.vue
Conditionally lazy-loads and renders NightlySurveyController component based on environment feature flags (isNightly, isCloud, isDesktop). NightlySurveyController iterates enabled surveys and renders NightlySurveyPopover for each configuration.
Feature Tracking
src/platform/surveys/useSurveyFeatureTracking.ts, src/platform/surveys/useSurveyFeatureTracking.test.ts
Introduces a composable for tracking survey feature usage with defensive handling for disabled or missing configurations, delegating to useFeatureUsageTracker. Includes comprehensive unit tests validating enabled, disabled, and missing config scenarios.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 A survey hopping through the nightly sky,
Tracking features as users scurry by,
Popovers pop with questions so fine,
Feature flags guide where surveys align,
From sidebar to popover, a data-driven design! 📊

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and concisely describes the main change: integrating the nightly survey system into the application through the NightlySurveyController and related composable.
Description check ✅ Passed The description includes all required template sections: Summary, Changes with specific details, and Review Focus with important design patterns and edge cases documented.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/survey-integration

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

@github-actions
Copy link

github-actions bot commented Jan 30, 2026

🎭 Playwright: ✅ 533 passed, 0 failed · 1 flaky

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

@github-actions
Copy link

github-actions bot commented Jan 30, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 02/23/2026, 04:34:06 AM UTC

Links

@christian-byrne christian-byrne marked this pull request as ready for review February 22, 2026 06:40
@christian-byrne christian-byrne requested a review from a team as a code owner February 22, 2026 06:40
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Feb 22, 2026
@dosubot
Copy link

dosubot bot commented Feb 22, 2026

Related Documentation

Checked 0 published document(s) in 1 knowledge base(s). No updates required.

How did I do? Any feedback?  Join Discord

@christian-byrne christian-byrne requested a review from a team as a code owner February 22, 2026 06:45
christian-byrne added a commit that referenced this pull request Feb 23, 2026
## Summary

Adds NightlySurveyPopover component that displays a Typeform survey to
eligible nightly users after a configurable delay.

## Changes

- **What**: Vue component that uses `useSurveyEligibility` to show/hide
a survey popover with accept, dismiss, and opt-out actions. Loads
Typeform embed script dynamically with HTTPS and deduplication.

## Review Focus

- Typeform script injection security (HTTPS-only, load-once guard,
typeformId alphanumeric validation)
- Timeout lifecycle (clears pending timeout when eligibility changes)

## Part of Nightly Survey System

This is part 4 of a stacked PR chain:
1. ✅ feat/feature-usage-tracker - useFeatureUsageTracker (merged in
#8189)
2. ✅ feat/survey-eligibility - useSurveyEligibility (#8189, merged)
3. ✅ feat/survey-config - surveyRegistry.ts (#8355, merged)
4. **feat/survey-popover** - NightlySurveyPopover.vue (this PR)
5. feat/survey-integration - NightlySurveyController.vue (#8480)

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-9083-feat-add-NightlySurveyPopover-component-for-feature-surveys-30f6d73d365081d1beb2f92555a4b2f4)
by [Unito](https://www.unito.io)

Co-authored-by: Amp <amp@ampcode.com>
Base automatically changed from feat/survey-popover to main February 23, 2026 04:20
@dosubot dosubot bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Feb 23, 2026
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Feb 23, 2026
@github-actions
Copy link

📦 Bundle: 4.37 MB gzip 🔴 +3.02 kB

Details

Summary

  • Raw size: 20.5 MB baseline 20.5 MB — 🔴 +9.19 kB
  • Gzip: 4.37 MB baseline 4.37 MB — 🔴 +3.02 kB
  • Brotli: 3.38 MB baseline 3.38 MB — 🔴 +2.82 kB
  • Bundles: 225 current • 224 baseline • 120 added / 119 removed

Category Glance
Other 🔴 +8.92 kB (7.63 MB) · Graph Workspace 🔴 +271 B (916 kB) · Vendor & Third-Party ⚪ 0 B (8.83 MB) · Data & Services ⚪ 0 B (2.51 MB) · Panels & Settings ⚪ 0 B (436 kB) · Views & Navigation ⚪ 0 B (68.8 kB) · + 5 more

App Entry Points — 17.9 kB (baseline 17.9 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-BPXxHI42.js (removed) 17.9 kB 🟢 -17.9 kB 🟢 -6.35 kB 🟢 -5.48 kB
assets/index-Duko-hsJ.js (new) 17.9 kB 🔴 +17.9 kB 🔴 +6.36 kB 🔴 +5.48 kB

Status: 1 added / 1 removed

Graph Workspace — 916 kB (baseline 916 kB) • 🔴 +271 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-B3bhdY5O.js (new) 916 kB 🔴 +916 kB 🔴 +197 kB 🔴 +150 kB
assets/GraphView-dlPxGQ_n.js (removed) 916 kB 🟢 -916 kB 🟢 -197 kB 🟢 -150 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BntdbhB_.js (new) 15.5 kB 🔴 +15.5 kB 🔴 +3.32 kB 🔴 +2.82 kB
assets/CloudSurveyView-zjn0Bw32.js (removed) 15.5 kB 🟢 -15.5 kB 🟢 -3.32 kB 🟢 -2.82 kB
assets/CloudLoginView-BPATMuDJ.js (new) 10 kB 🔴 +10 kB 🔴 +2.93 kB 🔴 +2.58 kB
assets/CloudLoginView-DUpqlSqa.js (removed) 10 kB 🟢 -10 kB 🟢 -2.93 kB 🟢 -2.57 kB
assets/UserCheckView-b0GPLBXd.js (removed) 8.41 kB 🟢 -8.41 kB 🟢 -2.23 kB 🟢 -1.94 kB
assets/UserCheckView-BZv-w_SE.js (new) 8.41 kB 🔴 +8.41 kB 🔴 +2.23 kB 🔴 +1.94 kB
assets/CloudSignupView-B-WNTdhO.js (removed) 7.41 kB 🟢 -7.41 kB 🟢 -2.32 kB 🟢 -2.03 kB
assets/CloudSignupView-DFiQ8m1V.js (new) 7.41 kB 🔴 +7.41 kB 🔴 +2.32 kB 🔴 +2.04 kB
assets/CloudLayoutView-DpiDq_gD.js (removed) 6.43 kB 🟢 -6.43 kB 🟢 -2.1 kB 🟢 -1.83 kB
assets/CloudLayoutView-DxecOJR3.js (new) 6.43 kB 🔴 +6.43 kB 🔴 +2.1 kB 🔴 +1.83 kB
assets/CloudForgotPasswordView-C1Jjam-l.js (new) 5.56 kB 🔴 +5.56 kB 🔴 +1.94 kB 🔴 +1.71 kB
assets/CloudForgotPasswordView-Dv1BLgvx.js (removed) 5.56 kB 🟢 -5.56 kB 🟢 -1.94 kB 🟢 -1.71 kB
assets/CloudAuthTimeoutView-CzeouHK-.js (new) 4.91 kB 🔴 +4.91 kB 🔴 +1.77 kB 🔴 +1.55 kB
assets/CloudAuthTimeoutView-Dn4sd4bj.js (removed) 4.91 kB 🟢 -4.91 kB 🟢 -1.77 kB 🟢 -1.56 kB
assets/CloudSubscriptionRedirectView-DPkjp8WI.js (removed) 4.71 kB 🟢 -4.71 kB 🟢 -1.78 kB 🟢 -1.57 kB
assets/CloudSubscriptionRedirectView-GEu_gLz6.js (new) 4.71 kB 🔴 +4.71 kB 🔴 +1.78 kB 🔴 +1.58 kB
assets/UserSelectView-CVXz1l9m.js (new) 4.5 kB 🔴 +4.5 kB 🔴 +1.64 kB 🔴 +1.47 kB
assets/UserSelectView-CWFhbsU-.js (removed) 4.5 kB 🟢 -4.5 kB 🟢 -1.64 kB 🟢 -1.47 kB
assets/layout-BtLMXQGd.js (new) 296 B 🔴 +296 B 🔴 +224 B 🔴 +187 B
assets/layout-CmHcUwxS.js (removed) 296 B 🟢 -296 B 🟢 -223 B 🟢 -192 B
assets/CloudSorryContactSupportView-Bi8IsTTh.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SecretsPanel-BdjbGuuj.js (new) 21.5 kB 🔴 +21.5 kB 🔴 +5.3 kB 🔴 +4.65 kB
assets/SecretsPanel-D_extUyY.js (removed) 21.5 kB 🟢 -21.5 kB 🟢 -5.3 kB 🟢 -4.65 kB
assets/LegacyCreditsPanel-CVX5wYLD.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5.57 kB 🔴 +4.9 kB
assets/LegacyCreditsPanel-CWEQv86j.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -5.57 kB 🟢 -4.89 kB
assets/SubscriptionPanel-CQB3ZqkU.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.73 kB 🔴 +4.17 kB
assets/SubscriptionPanel-DFMHTrtL.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.73 kB 🟢 -4.17 kB
assets/KeybindingPanel-2IbyLQeZ.js (new) 12.3 kB 🔴 +12.3 kB 🔴 +3.57 kB 🔴 +3.18 kB
assets/KeybindingPanel-BqDT_H84.js (removed) 12.3 kB 🟢 -12.3 kB 🟢 -3.57 kB 🟢 -3.17 kB
assets/AboutPanel-BuvoW1YV.js (removed) 9.79 kB 🟢 -9.79 kB 🟢 -2.73 kB 🟢 -2.45 kB
assets/AboutPanel-CXs0LN5H.js (new) 9.79 kB 🔴 +9.79 kB 🔴 +2.74 kB 🔴 +2.47 kB
assets/ExtensionPanel-BFd9z9GV.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.65 kB 🔴 +2.35 kB
assets/ExtensionPanel-BlRo3ojs.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.65 kB 🟢 -2.35 kB
assets/ServerConfigPanel-CwmhSSHj.js (new) 6.44 kB 🔴 +6.44 kB 🔴 +2.13 kB 🔴 +1.93 kB
assets/ServerConfigPanel-CxLHbk5r.js (removed) 6.44 kB 🟢 -6.44 kB 🟢 -2.12 kB 🟢 -1.91 kB
assets/UserPanel-BTv89R78.js (new) 6.16 kB 🔴 +6.16 kB 🔴 +1.99 kB 🔴 +1.75 kB
assets/UserPanel-E116CHV7.js (removed) 6.16 kB 🟢 -6.16 kB 🟢 -1.99 kB 🟢 -1.75 kB
assets/cloudRemoteConfig-CNsmNafH.js (new) 1.44 kB 🔴 +1.44 kB 🔴 +709 B 🔴 +613 B
assets/cloudRemoteConfig-FRNh3oWz.js (removed) 1.44 kB 🟢 -1.44 kB 🟢 -711 B 🟢 -613 B
assets/refreshRemoteConfig-CDPkJxui.js (new) 1.14 kB 🔴 +1.14 kB 🔴 +516 B 🔴 +457 B
assets/refreshRemoteConfig-upXTJN5g.js (removed) 1.14 kB 🟢 -1.14 kB 🟢 -519 B 🟢 -446 B
assets/config-QxkqTZy6.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-3cK4vYSX.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-AqJa7Oe1.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BOcWl0Qp.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BodhSOuG.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCD8qxmc.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CVDNuOXV.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DLodCRRz.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DLqeCT09.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DP-OgTXN.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRIXyZ_Z.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-IRk9rDbu.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 10 added / 10 removed

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

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-BWxySx4w.js (removed) 3.4 kB 🟢 -3.4 kB 🟢 -1.18 kB 🟢 -992 B
assets/auth-D8uOO5D3.js (new) 3.4 kB 🔴 +3.4 kB 🔴 +1.18 kB 🔴 +992 B
assets/SignUpForm-C_S4mbW7.js (removed) 3.01 kB 🟢 -3.01 kB 🟢 -1.23 kB 🟢 -1.1 kB
assets/SignUpForm-CA_ALXTu.js (new) 3.01 kB 🔴 +3.01 kB 🔴 +1.23 kB 🔴 +1.11 kB
assets/UpdatePasswordContent-Dm2yArqo.js (removed) 2.37 kB 🟢 -2.37 kB 🟢 -1.07 kB 🟢 -943 B
assets/UpdatePasswordContent-DnQCgOSr.js (new) 2.37 kB 🔴 +2.37 kB 🔴 +1.07 kB 🔴 +950 B
assets/WorkspaceProfilePic-ClXtwRB6.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -822 B 🟢 -742 B
assets/WorkspaceProfilePic-ETOTD112.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +822 B 🔴 +741 B
assets/firebaseAuthStore-3BmqiIFP.js (removed) 790 B 🟢 -790 B 🟢 -389 B 🟢 -347 B
assets/firebaseAuthStore-i0Fi2Xsw.js (new) 790 B 🔴 +790 B 🔴 +389 B 🔴 +347 B
assets/auth-BvPNSoa3.js (new) 357 B 🔴 +357 B 🔴 +225 B 🔴 +194 B
assets/auth-Cmbtw7ww.js (removed) 357 B 🟢 -357 B 🟢 -226 B 🟢 -193 B
assets/PasswordFields-koUYSkkX.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

Editors & Dialogs — 738 B (baseline 738 B) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-C1Abs7Fg.js (removed) 738 B 🟢 -738 B 🟢 -380 B 🟢 -331 B
assets/useSubscriptionDialog-D2sFBJgY.js (new) 738 B 🔴 +738 B 🔴 +382 B 🔴 +330 B

Status: 1 added / 1 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useTerminalTabs-AlwkM9Yi.js (removed) 9.85 kB 🟢 -9.85 kB 🟢 -3.4 kB 🟢 -2.99 kB
assets/useTerminalTabs-prM-8Nby.js (new) 9.85 kB 🔴 +9.85 kB 🔴 +3.4 kB 🔴 +2.99 kB
assets/ComfyQueueButton-C0d3Fj5Q.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.49 kB 🔴 +2.22 kB
assets/ComfyQueueButton-CehDkj1Q.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.49 kB 🟢 -2.22 kB
assets/FormSearchInput-D31qG9G5.js (removed) 3.73 kB 🟢 -3.73 kB 🟢 -1.55 kB 🟢 -1.36 kB
assets/FormSearchInput-DUGGZDu-.js (new) 3.73 kB 🔴 +3.73 kB 🔴 +1.54 kB 🔴 +1.36 kB
assets/SubscribeButton-D3FP-6ES.js (removed) 2.35 kB 🟢 -2.35 kB 🟢 -1.02 kB 🟢 -888 B
assets/SubscribeButton-DxMLcLhn.js (new) 2.35 kB 🔴 +2.35 kB 🔴 +1.02 kB 🔴 +888 B
assets/WidgetButton-CnS1-WPe.js (new) 1.84 kB 🔴 +1.84 kB 🔴 +875 B 🔴 +769 B
assets/WidgetButton-Db8QZdD0.js (removed) 1.84 kB 🟢 -1.84 kB 🟢 -877 B 🟢 -772 B
assets/cloudFeedbackTopbarButton-Bfsi50hk.js (removed) 1.6 kB 🟢 -1.6 kB 🟢 -856 B 🟢 -764 B
assets/cloudFeedbackTopbarButton-DvXrwZKC.js (new) 1.6 kB 🔴 +1.6 kB 🔴 +857 B 🔴 +769 B
assets/ComfyQueueButton-1vXxMmZJ.js (new) 795 B 🔴 +795 B 🔴 +396 B 🔴 +353 B
assets/ComfyQueueButton-eGKF1FXm.js (removed) 795 B 🟢 -795 B 🟢 -394 B 🟢 -353 B
assets/Button-DcjgQBBu.js 2.98 kB 2.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-CKN9xgaL.js 1.24 kB 1.24 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-D7H0v_Kw.js 5.94 kB 5.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-YGzOQBJD.js 7.45 kB 7.45 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-DkTACzmk.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 7 added / 7 removed

Data & Services — 2.51 MB (baseline 2.51 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-BYNMsSqY.js (removed) 1.73 MB 🟢 -1.73 MB 🟢 -387 kB 🟢 -293 kB
assets/dialogService-KSyZ_KM-.js (new) 1.73 MB 🔴 +1.73 MB 🔴 +387 kB 🔴 +294 kB
assets/api-CJI4gbda.js (new) 653 kB 🔴 +653 kB 🔴 +147 kB 🔴 +118 kB
assets/api-Dp8xChTR.js (removed) 653 kB 🟢 -653 kB 🟢 -147 kB 🟢 -118 kB
assets/load3dService-BzcjNGgU.js (new) 91 kB 🔴 +91 kB 🔴 +19.1 kB 🔴 +16.4 kB
assets/load3dService-ClLewHb3.js (removed) 91 kB 🟢 -91 kB 🟢 -19.1 kB 🟢 -16.4 kB
assets/systemStatsStore-ComICInw.js (removed) 12.7 kB 🟢 -12.7 kB 🟢 -4.42 kB 🟢 -3.88 kB
assets/systemStatsStore-SdQUZut_.js (new) 12.7 kB 🔴 +12.7 kB 🔴 +4.42 kB 🔴 +3.88 kB
assets/releaseStore-0BkARNxn.js (removed) 7.96 kB 🟢 -7.96 kB 🟢 -2.22 kB 🟢 -1.96 kB
assets/releaseStore-DtiTN708.js (new) 7.96 kB 🔴 +7.96 kB 🔴 +2.22 kB 🔴 +1.95 kB
assets/keybindingService-B8Frqxwr.js (new) 6.52 kB 🔴 +6.52 kB 🔴 +1.71 kB 🔴 +1.47 kB
assets/keybindingService-kHWtC5rr.js (removed) 6.52 kB 🟢 -6.52 kB 🟢 -1.71 kB 🟢 -1.47 kB
assets/bootstrapStore-BjGIFyTK.js (removed) 2.08 kB 🟢 -2.08 kB 🟢 -872 B 🟢 -790 B
assets/bootstrapStore-BWeM1GXG.js (new) 2.08 kB 🔴 +2.08 kB 🔴 +873 B 🔴 +798 B
assets/userStore-B5MkRdzp.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -719 B 🟢 -669 B
assets/userStore-B9O6873G.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +721 B 🔴 +637 B
assets/audioService-DVSXQCn2.js (new) 1.73 kB 🔴 +1.73 kB 🔴 +849 B 🔴 +725 B
assets/audioService-KRCsje8Q.js (removed) 1.73 kB 🟢 -1.73 kB 🟢 -849 B 🟢 -728 B
assets/releaseStore-BP2Sa1SC.js (removed) 762 B 🟢 -762 B 🟢 -387 B 🟢 -342 B
assets/releaseStore-CqrTlOkB.js (new) 762 B 🔴 +762 B 🔴 +387 B 🔴 +346 B
assets/settingStore-DMmo0wxd.js (new) 746 B 🔴 +746 B 🔴 +390 B 🔴 +345 B
assets/settingStore-dtrnJGZd.js (removed) 746 B 🟢 -746 B 🟢 -389 B 🟢 -342 B
assets/workflowDraftStore-B2WmQK3e.js (removed) 738 B 🟢 -738 B 🟢 -380 B 🟢 -336 B
assets/workflowDraftStore-BNLZM_Uv.js (new) 738 B 🔴 +738 B 🔴 +382 B 🔴 +335 B
assets/dialogService-afsDoBBh.js (new) 727 B 🔴 +727 B 🔴 +370 B 🔴 +330 B
assets/dialogService-BHHAcg_X.js (removed) 727 B 🟢 -727 B 🟢 -371 B 🟢 -331 B
assets/serverConfigStore-Bv99woE0.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 13 added / 13 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useLoad3d-CCZ8mtBv.js (new) 14.6 kB 🔴 +14.6 kB 🔴 +3.63 kB 🔴 +3.21 kB
assets/useLoad3d-D9Aql1q6.js (removed) 14.6 kB 🟢 -14.6 kB 🟢 -3.63 kB 🟢 -3.23 kB
assets/useLoad3dViewer-B5Ei2koc.js (removed) 14.1 kB 🟢 -14.1 kB 🟢 -3.15 kB 🟢 -2.8 kB
assets/useLoad3dViewer-CdZUhv6Q.js (new) 14.1 kB 🔴 +14.1 kB 🔴 +3.15 kB 🔴 +2.8 kB
assets/useFeatureFlags-C3rLAuBl.js (new) 4.14 kB 🔴 +4.14 kB 🔴 +1.24 kB 🔴 +1.05 kB
assets/useFeatureFlags-T84yi1_L.js (removed) 4.14 kB 🟢 -4.14 kB 🟢 -1.24 kB 🟢 -1.05 kB
assets/useWorkspaceUI-DIxHnhs1.js (removed) 3 kB 🟢 -3 kB 🟢 -823 B 🟢 -705 B
assets/useWorkspaceUI-euY0svKd.js (new) 3 kB 🔴 +3 kB 🔴 +822 B 🔴 +703 B
assets/useSubscriptionCredits-BjXhW1vH.js (removed) 2.75 kB 🟢 -2.75 kB 🟢 -1.04 kB 🟢 -905 B
assets/useSubscriptionCredits-CO4rprPV.js (new) 2.75 kB 🔴 +2.75 kB 🔴 +1.04 kB 🔴 +908 B
assets/subscriptionCheckoutUtil-CWwfA9oO.js (new) 2.53 kB 🔴 +2.53 kB 🔴 +1.06 kB 🔴 +959 B
assets/subscriptionCheckoutUtil-oSvLH_U-.js (removed) 2.53 kB 🟢 -2.53 kB 🟢 -1.06 kB 🟢 -964 B
assets/useErrorHandling-CkJ5_t13.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -630 B 🟢 -533 B
assets/useErrorHandling-ZGu9smRp.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +630 B 🔴 +534 B
assets/useWorkspaceSwitch-breRYbAB.js (new) 1.25 kB 🔴 +1.25 kB 🔴 +543 B 🔴 +479 B
assets/useWorkspaceSwitch-DgcjdT22.js (removed) 1.25 kB 🟢 -1.25 kB 🟢 -544 B 🟢 -480 B
assets/useLoad3d-BhdAzwuQ.js (new) 861 B 🔴 +861 B 🔴 +427 B 🔴 +384 B
assets/useLoad3d-DZP6PUb1.js (removed) 861 B 🟢 -861 B 🟢 -425 B 🟢 -385 B
assets/audioUtils-ByOkUUYh.js (new) 858 B 🔴 +858 B 🔴 +501 B 🔴 +401 B
assets/audioUtils-DVNppm0h.js (removed) 858 B 🟢 -858 B 🟢 -500 B 🟢 -427 B
assets/useLoad3dViewer-CfkeZrno.js (removed) 840 B 🟢 -840 B 🟢 -410 B 🟢 -374 B
assets/useLoad3dViewer-Dh9pImSi.js (new) 840 B 🔴 +840 B 🔴 +412 B 🔴 +376 B
assets/useCurrentUser-DD3TqMR6.js (removed) 724 B 🟢 -724 B 🟢 -371 B 🟢 -331 B
assets/useCurrentUser-k5KS_mQ2.js (new) 724 B 🔴 +724 B 🔴 +373 B 🔴 +331 B
assets/_plugin-vue_export-helper-CY4XIWDa.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-m-0Os8lq.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-BQSmRN2Q.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DOdPeMQc.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-BputJAFn.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-HtIMq0zk.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 12 added / 12 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-BxkFiWzp.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DccD0mxo.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-BzNZEmD_.js 1.52 MB 1.52 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-Ca9moc73.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-CWMIYdD2.js 379 kB 379 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-LBLOE6BD.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-CHaNo_rA.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-CmHHRvL9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-B4hGe0IQ.js 113 kB 113 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-vkxZGffR.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.63 MB (baseline 7.62 MB) • 🔴 +8.92 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-CP0Mv8ue.js (removed) 72.8 kB 🟢 -72.8 kB 🟢 -18.8 kB 🟢 -16.1 kB
assets/core-D0RTT_o_.js (new) 72.8 kB 🔴 +72.8 kB 🔴 +18.8 kB 🔴 +16.1 kB
assets/groupNode-BG4o0dre.js (removed) 71.8 kB 🟢 -71.8 kB 🟢 -17.7 kB 🟢 -15.5 kB
assets/groupNode-CEKzCmHt.js (new) 71.8 kB 🔴 +71.8 kB 🔴 +17.7 kB 🔴 +15.5 kB
assets/WidgetSelect-CLTaSPee.js (new) 58.1 kB 🔴 +58.1 kB 🔴 +12.4 kB 🔴 +10.7 kB
assets/WidgetSelect-CVFNsDuW.js (removed) 58.1 kB 🟢 -58.1 kB 🟢 -12.4 kB 🟢 -10.7 kB
assets/SubscriptionRequiredDialogContentWorkspace-CbDtiIGF.js (new) 45.8 kB 🔴 +45.8 kB 🔴 +8.56 kB 🔴 +7.4 kB
assets/SubscriptionRequiredDialogContentWorkspace-CMscGerM.js (removed) 45.8 kB 🟢 -45.8 kB 🟢 -8.56 kB 🟢 -7.41 kB
assets/Load3DControls-Bwtj2PSJ.js (new) 30.9 kB 🔴 +30.9 kB 🔴 +5.34 kB 🔴 +4.65 kB
assets/Load3DControls-CvZBKduM.js (removed) 30.9 kB 🟢 -30.9 kB 🟢 -5.34 kB 🟢 -4.64 kB
assets/WorkspacePanelContent-DO9DyrJC.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.14 kB 🔴 +5.4 kB
assets/WorkspacePanelContent-wnWsjObX.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.14 kB 🟢 -5.39 kB
assets/SubscriptionRequiredDialogContent-CsFExX5U.js (new) 26.2 kB 🔴 +26.2 kB 🔴 +6.57 kB 🔴 +5.77 kB
assets/SubscriptionRequiredDialogContent-D2iHYJP_.js (removed) 26.2 kB 🟢 -26.2 kB 🟢 -6.57 kB 🟢 -5.78 kB
assets/Load3dViewerContent-BjV5atDz.js (new) 23 kB 🔴 +23 kB 🔴 +5.18 kB 🔴 +4.5 kB
assets/Load3dViewerContent-Dc2-h8VG.js (removed) 23 kB 🟢 -23 kB 🟢 -5.18 kB 🟢 -4.49 kB
assets/WidgetImageCrop-Cc_lghtK.js (removed) 22.1 kB 🟢 -22.1 kB 🟢 -5.5 kB 🟢 -4.84 kB
assets/WidgetImageCrop-Cj1DrLW9.js (new) 22.1 kB 🔴 +22.1 kB 🔴 +5.51 kB 🔴 +4.85 kB
assets/SubscriptionPanelContentWorkspace-CMeTPUtr.js (removed) 21.6 kB 🟢 -21.6 kB 🟢 -5.02 kB 🟢 -4.43 kB
assets/SubscriptionPanelContentWorkspace-DlND0_Ir.js (new) 21.6 kB 🔴 +21.6 kB 🔴 +5.02 kB 🔴 +4.43 kB
assets/CurrentUserPopoverWorkspace-C2KehJix.js (removed) 19.8 kB 🟢 -19.8 kB 🟢 -4.86 kB 🟢 -4.33 kB
assets/CurrentUserPopoverWorkspace-CfOPtPUA.js (new) 19.8 kB 🔴 +19.8 kB 🔴 +4.86 kB 🔴 +4.34 kB
assets/SignInContent-CO1l2RjQ.js (new) 18.9 kB 🔴 +18.9 kB 🔴 +4.79 kB 🔴 +4.19 kB
assets/SignInContent-DYY8QCb9.js (removed) 18.9 kB 🟢 -18.9 kB 🟢 -4.79 kB 🟢 -4.19 kB
assets/WidgetInputNumber-BJUcxaqM.js (new) 18.6 kB 🔴 +18.6 kB 🔴 +4.71 kB 🔴 +4.18 kB
assets/WidgetInputNumber-DZJqx48x.js (removed) 18.6 kB 🟢 -18.6 kB 🟢 -4.71 kB 🟢 -4.19 kB
assets/WidgetRecordAudio-C_Ha36lt.js (new) 17.3 kB 🔴 +17.3 kB 🔴 +4.94 kB 🔴 +4.42 kB
assets/WidgetRecordAudio-Db03ZyFi.js (removed) 17.3 kB 🟢 -17.3 kB 🟢 -4.94 kB 🟢 -4.43 kB
assets/Load3D-CjkRAP8P.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +4.03 kB 🔴 +3.52 kB
assets/Load3D-DctxymrT.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -4.03 kB 🟢 -3.52 kB
assets/load3d-CMEkbRik.js (new) 14.7 kB 🔴 +14.7 kB 🔴 +4.2 kB 🔴 +3.64 kB
assets/load3d-DOhfg7JS.js (removed) 14.7 kB 🟢 -14.7 kB 🟢 -4.2 kB 🟢 -3.64 kB
assets/AudioPreviewPlayer-Cubt8fVU.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -3.19 kB 🟢 -2.87 kB
assets/AudioPreviewPlayer-DA86knkV.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +3.2 kB 🔴 +2.86 kB
assets/changeTracker-aKejtcCA.js (new) 9.38 kB 🔴 +9.38 kB 🔴 +2.89 kB 🔴 +2.54 kB
assets/changeTracker-B25EpQz7.js (removed) 9.38 kB 🟢 -9.38 kB 🟢 -2.9 kB 🟢 -2.55 kB
assets/nodeTemplates-DAaeIaHw.js (removed) 9.3 kB 🟢 -9.3 kB 🟢 -3.26 kB 🟢 -2.86 kB
assets/nodeTemplates-DWq6Uf7i.js (new) 9.3 kB 🔴 +9.3 kB 🔴 +3.26 kB 🔴 +2.86 kB
assets/NightlySurveyController-DLZQ16f7.js (new) 8.92 kB 🔴 +8.92 kB 🔴 +2.9 kB 🔴 +2.52 kB
assets/InviteMemberDialogContent-BT03w-eR.js (new) 7.38 kB 🔴 +7.38 kB 🔴 +2.3 kB 🔴 +2 kB
assets/InviteMemberDialogContent-T0HkKVYN.js (removed) 7.38 kB 🟢 -7.38 kB 🟢 -2.29 kB 🟢 -2 kB
assets/WidgetToggleSwitch-CTmleHMw.js (new) 6.8 kB 🔴 +6.8 kB 🔴 +2.19 kB 🔴 +1.94 kB
assets/WidgetToggleSwitch-DC0xon5p.js (removed) 6.8 kB 🟢 -6.8 kB 🟢 -2.19 kB 🟢 -1.94 kB
assets/Load3DConfiguration-BETV35gD.js (new) 6.27 kB 🔴 +6.27 kB 🔴 +1.92 kB 🔴 +1.68 kB
assets/Load3DConfiguration-CR_VMjeE.js (removed) 6.27 kB 🟢 -6.27 kB 🟢 -1.91 kB 🟢 -1.68 kB
assets/CreateWorkspaceDialogContent-8BBdrtkR.js (removed) 5.53 kB 🟢 -5.53 kB 🟢 -1.99 kB 🟢 -1.73 kB
assets/CreateWorkspaceDialogContent-Bf4FikIt.js (new) 5.53 kB 🔴 +5.53 kB 🔴 +1.99 kB 🔴 +1.74 kB
assets/onboardingCloudRoutes-B76_ceZi.js (new) 5.41 kB 🔴 +5.41 kB 🔴 +1.84 kB 🔴 +1.6 kB
assets/onboardingCloudRoutes-BF_FgmDk.js (removed) 5.41 kB 🟢 -5.41 kB 🟢 -1.84 kB 🟢 -1.62 kB
assets/EditWorkspaceDialogContent-CaybNTaV.js (removed) 5.33 kB 🟢 -5.33 kB 🟢 -1.95 kB 🟢 -1.7 kB
assets/EditWorkspaceDialogContent-DQkLKSme.js (new) 5.33 kB 🔴 +5.33 kB 🔴 +1.95 kB 🔴 +1.7 kB
assets/ValueControlPopover-p3psJw6O.js (removed) 4.92 kB 🟢 -4.92 kB 🟢 -1.77 kB 🟢 -1.58 kB
assets/ValueControlPopover-tQhNBZ9m.js (new) 4.92 kB 🔴 +4.92 kB 🔴 +1.77 kB 🔴 +1.58 kB
assets/Preview3d-3qlFLifd.js (removed) 4.82 kB 🟢 -4.82 kB 🟢 -1.56 kB 🟢 -1.37 kB
assets/Preview3d-DMvUMqVa.js (new) 4.82 kB 🔴 +4.82 kB 🔴 +1.57 kB 🔴 +1.37 kB
assets/CancelSubscriptionDialogContent-CA_lG5J8.js (new) 4.79 kB 🔴 +4.79 kB 🔴 +1.78 kB 🔴 +1.56 kB
assets/CancelSubscriptionDialogContent-DjVFjjo_.js (removed) 4.79 kB 🟢 -4.79 kB 🟢 -1.78 kB 🟢 -1.56 kB
assets/DeleteWorkspaceDialogContent-Cl34EEpm.js (removed) 4.23 kB 🟢 -4.23 kB 🟢 -1.63 kB 🟢 -1.42 kB
assets/DeleteWorkspaceDialogContent-D5GYAif3.js (new) 4.23 kB 🔴 +4.23 kB 🔴 +1.64 kB 🔴 +1.42 kB
assets/WidgetWithControl-Ccz7P7XX.js (removed) 4.11 kB 🟢 -4.11 kB 🟢 -1.78 kB 🟢 -1.61 kB
assets/WidgetWithControl-CJadVGHj.js (new) 4.11 kB 🔴 +4.11 kB 🔴 +1.78 kB 🔴 +1.6 kB
assets/LeaveWorkspaceDialogContent-CPH3kysW.js (new) 4.06 kB 🔴 +4.06 kB 🔴 +1.58 kB 🔴 +1.38 kB
assets/LeaveWorkspaceDialogContent-elSM3vwH.js (removed) 4.06 kB 🟢 -4.06 kB 🟢 -1.58 kB 🟢 -1.38 kB
assets/RemoveMemberDialogContent-B1hq_S4j.js (new) 4.04 kB 🔴 +4.04 kB 🔴 +1.53 kB 🔴 +1.34 kB
assets/RemoveMemberDialogContent-Bbi4UhZg.js (removed) 4.04 kB 🟢 -4.04 kB 🟢 -1.53 kB 🟢 -1.34 kB
assets/WidgetTextarea-BF39Y5Iz.js (removed) 3.96 kB 🟢 -3.96 kB 🟢 -1.49 kB 🟢 -1.3 kB
assets/WidgetTextarea-BOUX5oZ5.js (new) 3.96 kB 🔴 +3.96 kB 🔴 +1.49 kB 🔴 +1.3 kB
assets/RevokeInviteDialogContent-DfmX_NmR.js (new) 3.96 kB 🔴 +3.96 kB 🔴 +1.54 kB 🔴 +1.36 kB
assets/RevokeInviteDialogContent-pGmo9nHV.js (removed) 3.96 kB 🟢 -3.96 kB 🟢 -1.54 kB 🟢 -1.36 kB
assets/InviteMemberUpsellDialogContent-BUwsjnJa.js (new) 3.83 kB 🔴 +3.83 kB 🔴 +1.4 kB 🔴 +1.23 kB
assets/InviteMemberUpsellDialogContent-DXkx2Oba.js (removed) 3.83 kB 🟢 -3.83 kB 🟢 -1.4 kB 🟢 -1.24 kB
assets/WidgetGalleria-Bb1DZ9I_.js (removed) 3.61 kB 🟢 -3.61 kB 🟢 -1.39 kB 🟢 -1.25 kB
assets/WidgetGalleria-DXi9ClNp.js (new) 3.61 kB 🔴 +3.61 kB 🔴 +1.39 kB 🔴 +1.25 kB
assets/saveMesh-BBL2yiO8.js (new) 3.38 kB 🔴 +3.38 kB 🔴 +1.46 kB 🔴 +1.3 kB
assets/saveMesh-BZXSjaII.js (removed) 3.38 kB 🟢 -3.38 kB 🟢 -1.46 kB 🟢 -1.29 kB
assets/cloudSessionCookie-B_Vy6kFI.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.09 kB 🟢 -969 B
assets/cloudSessionCookie-lo68FZES.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.09 kB 🔴 +990 B
assets/WidgetImageCompare-BCg8qEyc.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.15 kB 🔴 +1.02 kB
assets/WidgetImageCompare-DpWt7SLo.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.15 kB 🟢 -994 B
assets/WidgetMarkdown-BWfbyiOu.js (new) 2.93 kB 🔴 +2.93 kB 🔴 +1.23 kB 🔴 +1.08 kB
assets/WidgetMarkdown-Vq4skE3X.js (removed) 2.93 kB 🟢 -2.93 kB 🟢 -1.23 kB 🟢 -1.08 kB
assets/GlobalToast-DcnD4Cdp.js (new) 2.91 kB 🔴 +2.91 kB 🔴 +1.21 kB 🔴 +1.06 kB
assets/GlobalToast-GqL8X8ML.js (removed) 2.91 kB 🟢 -2.91 kB 🟢 -1.21 kB 🟢 -1.06 kB
assets/WidgetColorPicker-B4mml5Z1.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -1.23 kB 🟢 -1.1 kB
assets/WidgetColorPicker-rnMzaIlI.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +1.23 kB 🔴 +1.1 kB
assets/WidgetChart-B2_xk5Fz.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +954 B 🔴 +825 B
assets/WidgetChart-BPLD0Sx8.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -953 B 🟢 -825 B
assets/SubscribeToRun-5FOMltGt.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -1.01 kB 🟢 -893 B
assets/SubscribeToRun-D_LHBRdx.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +1.01 kB 🔴 +875 B
assets/WidgetLayoutField-C8naPR0c.js (new) 1.95 kB 🔴 +1.95 kB 🔴 +877 B 🔴 +763 B
assets/WidgetLayoutField-hmcBQt7E.js (removed) 1.95 kB 🟢 -1.95 kB 🟢 -877 B 🟢 -763 B
assets/WidgetInputText-Bkj-AL52.js (removed) 1.86 kB 🟢 -1.86 kB 🟢 -873 B 🟢 -790 B
assets/WidgetInputText-C421Mu9I.js (new) 1.86 kB 🔴 +1.86 kB 🔴 +873 B 🔴 +802 B
assets/CloudRunButtonWrapper-BdHlnXAx.js (new) 1.68 kB 🔴 +1.68 kB 🔴 +786 B 🔴 +718 B
assets/CloudRunButtonWrapper-DlrNlLyF.js (removed) 1.68 kB 🟢 -1.68 kB 🟢 -784 B 🟢 -720 B
assets/cloudBadges-BUPqg5D9.js (new) 1.37 kB 🔴 +1.37 kB 🔴 +708 B 🔴 +612 B
assets/cloudBadges-DRJQODRv.js (removed) 1.37 kB 🟢 -1.37 kB 🟢 -707 B 🟢 -612 B
assets/cloudSubscription-0QF6kyuO.js (new) 1.33 kB 🔴 +1.33 kB 🔴 +659 B 🔴 +572 B
assets/cloudSubscription-ugIqONw9.js (removed) 1.33 kB 🟢 -1.33 kB 🟢 -658 B 🟢 -570 B
assets/widgetPropFilter-C9FcIgiN.js (new) 1.1 kB 🔴 +1.1 kB 🔴 +509 B 🔴 +431 B
assets/widgetPropFilter-Cd0O5LPR.js (removed) 1.1 kB 🟢 -1.1 kB 🟢 -510 B 🟢 -431 B
assets/Load3D-Bbcn_R1B.js (removed) 1.07 kB 🟢 -1.07 kB 🟢 -501 B 🟢 -445 B
assets/Load3D-BJWqeZV-.js (new) 1.07 kB 🔴 +1.07 kB 🔴 +499 B 🔴 +445 B
assets/nightlyBadges-BZkQkZ-N.js (removed) 1 kB 🟢 -1 kB 🟢 -536 B 🟢 -470 B
assets/nightlyBadges-DLav5KL2.js (new) 1 kB 🔴 +1 kB 🔴 +537 B 🔴 +470 B
assets/Load3dViewerContent-DsZl3X97.js (removed) 995 B 🟢 -995 B 🟢 -469 B 🟢 -416 B
assets/Load3dViewerContent-DZfXd9Nd.js (new) 995 B 🔴 +995 B 🔴 +470 B 🔴 +420 B
assets/SubscriptionPanelContentWorkspace-CuiQLt_c.js (new) 932 B 🔴 +932 B 🔴 +439 B 🔴 +386 B
assets/SubscriptionPanelContentWorkspace-DeNXQrH_.js (removed) 932 B 🟢 -932 B 🟢 -437 B 🟢 -384 B
assets/graphHasMissingNodes-K557LkiG.js (new) 761 B 🔴 +761 B 🔴 +374 B 🔴 +329 B
assets/graphHasMissingNodes-ld_0WQOY.js (removed) 761 B 🟢 -761 B 🟢 -374 B 🟢 -325 B
assets/changeTracker-By3edKJ1.js (removed) 759 B 🟢 -759 B 🟢 -385 B 🟢 -341 B
assets/changeTracker-Ca2AXglC.js (new) 759 B 🔴 +759 B 🔴 +387 B 🔴 +341 B
assets/WidgetLegacy-D6SZXyI4.js (removed) 747 B 🟢 -747 B 🟢 -386 B 🟢 -338 B
assets/WidgetLegacy-kGgfpE07.js (new) 747 B 🔴 +747 B 🔴 +387 B 🔴 +339 B
assets/WidgetInputNumber-B9-M24Ii.js (removed) 469 B 🟢 -469 B 🟢 -266 B 🟢 -229 B
assets/WidgetInputNumber-BcIsseVW.js (new) 469 B 🔴 +469 B 🔴 +264 B 🔴 +227 B
assets/AnimationControls-BuN89WBW.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-dDy93gGQ.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-BTnZwrs2.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-sbUO3_hD.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-DhnNuB-i.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-CKD9vwNi.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BIWmUVEc.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BOt38VCw.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C0NcxRH3.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-C2xuXGb5.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CmiKIQwc.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DMwP8S5e.js 16.7 kB 16.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwBt3HhT.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-JX559A2n.js 15.1 kB 15.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-n_2KJWcD.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-OO-8nFm9.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-wq2Y-YKn.js 17.5 kB 17.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-BIWjk1ar.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-D7LhNF7N.js 519 kB 519 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-DeRrz3-g.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BgWDQhKn.js 145 kB 145 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BH99zfen.js 148 kB 148 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cl0TDHs-.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CTgQOf6T.js 196 kB 196 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CTIe-PdP.js 140 kB 140 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CxmFjxCA.js 176 kB 176 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D_siPGTl.js 162 kB 162 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D-U7Lzb5.js 170 kB 170 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-d6c2x81N.js 123 kB 123 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DN0hguJt.js 141 kB 141 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DzJxAN6l.js 124 kB 124 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-D3QRJ6eZ.js 1.82 kB 1.82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-vXuump5i.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-XsW6Reb5.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-Crhpst_D.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-DLkC3BlW.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-Dxvkupp8.js 2.77 kB 2.77 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-2U4KtUml.js 360 kB 360 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-5rcOJVex.js 391 kB 391 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BTBSP0IQ.js 480 kB 480 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BZEpP7w6.js 383 kB 383 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C-Tw-7I_.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-C76rbmLh.js 441 kB 441 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CxxD1ymF.js 395 kB 395 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DciNsuYe.js 392 kB 392 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-G7wcMpUD.js 356 kB 356 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-nGdg-hIO.js 388 kB 388 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-xiPSrG6S.js 440 kB 440 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-BFioAN8e.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DeIFnh1k.js 665 B 665 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-bibvA8E3.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-DTgoM4OT.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-DdhXSGsd.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-1EXhnvTZ.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-vVfixIxQ.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DTUjK0ZE.js 445 B 445 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BPh1lTyF.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-xcXafMSV.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-BtuQMzwn.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 59 added / 58 removed

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/components/sidebar/SideToolbar.vue`:
- Line 54: The async component NightlySurveyController is being rendered
directly; wrap its usage in a Vue <Suspense> so the defineAsyncComponent
resolves correctly — replace the direct <component :is="NightlySurveyController"
v-if="NightlySurveyController" /> with a <Suspense> that conditionally renders
the async component in the default slot (and provide a simple fallback in the
fallback slot or via template `#fallback`) to satisfy async-component guidelines;
ensure you still check NightlySurveyController (or guard in setup) so the
Suspense only mounts when the async is available.

In `@src/platform/surveys/useSurveyFeatureTracking.test.ts`:
- Around line 3-15: The tests use a module-level mutable object
mockSurveyConfigs and a vi.mock that reads it; replace this pattern by hoisting
a mock function with vi.hoisted and using that in the mock implementation for
getSurveyConfig, then reset/configure that hoisted mock per test instead of
mutating mockSurveyConfigs. Concretely, create a hoisted const (e.g., const
hoistedGetSurveyConfig = vi.hoisted(() => vi.fn())) and have
vi.mock('./surveyRegistry', () => ({ getSurveyConfig: hoistedGetSurveyConfig }))
so the mock is created before module init; in beforeEach call
hoistedGetSurveyConfig.mockReset() and set
hoistedGetSurveyConfig.mockImplementationOnce(...) or mockReturnValue(...) for
each test to control returned { enabled } values rather than clearing a shared
object.

</div>
</div>
<HelpCenterPopups :is-small="isSmall" />
<component :is="NightlySurveyController" v-if="NightlySurveyController" />
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:

cat -n src/components/sidebar/SideToolbar.vue | head -110

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 4978


Wrap the async controller in <Suspense>.

The component is lazy-loaded via defineAsyncComponent, so it must be rendered within <Suspense> to comply with the repository guideline for async components.

Suggested update
-    <component :is="NightlySurveyController" v-if="NightlySurveyController" />
+    <Suspense v-if="NightlySurveyController">
+      <component :is="NightlySurveyController" />
+    </Suspense>
📝 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
<component :is="NightlySurveyController" v-if="NightlySurveyController" />
<Suspense v-if="NightlySurveyController">
<component :is="NightlySurveyController" />
</Suspense>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/components/sidebar/SideToolbar.vue` at line 54, The async component
NightlySurveyController is being rendered directly; wrap its usage in a Vue
<Suspense> so the defineAsyncComponent resolves correctly — replace the direct
<component :is="NightlySurveyController" v-if="NightlySurveyController" /> with
a <Suspense> that conditionally renders the async component in the default slot
(and provide a simple fallback in the fallback slot or via template `#fallback`)
to satisfy async-component guidelines; ensure you still check
NightlySurveyController (or guard in setup) so the Suspense only mounts when the
async is available.

Comment on lines +3 to +15
const mockSurveyConfigs: Record<string, { enabled: boolean }> = {}

vi.mock('./surveyRegistry', () => ({
getSurveyConfig: (featureId: string) => mockSurveyConfigs[featureId]
}))

describe('useSurveyFeatureTracking', () => {
beforeEach(() => {
localStorage.clear()
vi.resetModules()
Object.keys(mockSurveyConfigs).forEach(
(key) => delete mockSurveyConfigs[key]
)
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:

cat -n src/platform/surveys/useSurveyFeatureTracking.test.ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2115


Avoid module-level mutable mock state; use a hoisted mock function instead.

The current pattern uses a module-level mockSurveyConfigs object that is mutated across tests and manually cleaned up. This violates the principle of keeping mocks contained within their test scope. Use vi.hoisted() to create the mock function before module initialization, then reset and configure it per test with Vitest's mock utilities.

♻️ Suggested refactor
-import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
-
-const mockSurveyConfigs: Record<string, { enabled: boolean }> = {}
-
-vi.mock('./surveyRegistry', () => ({
-  getSurveyConfig: (featureId: string) => mockSurveyConfigs[featureId]
-}))
+import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
+
+const getSurveyConfig = vi.hoisted(() =>
+  vi.fn<(featureId: string) => { enabled: boolean } | undefined>()
+)
+
+vi.mock('./surveyRegistry', () => ({
+  getSurveyConfig
+}))
-    Object.keys(mockSurveyConfigs).forEach(
-      (key) => delete mockSurveyConfigs[key]
-    )
+    getSurveyConfig.mockReset()
-    mockSurveyConfigs['test-feature'] = { enabled: true }
+    getSurveyConfig.mockReturnValue({ enabled: true })
-    mockSurveyConfigs['disabled-feature'] = { enabled: false }
+    getSurveyConfig.mockReturnValue({ enabled: false })
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/platform/surveys/useSurveyFeatureTracking.test.ts` around lines 3 - 15,
The tests use a module-level mutable object mockSurveyConfigs and a vi.mock that
reads it; replace this pattern by hoisting a mock function with vi.hoisted and
using that in the mock implementation for getSurveyConfig, then reset/configure
that hoisted mock per test instead of mutating mockSurveyConfigs. Concretely,
create a hoisted const (e.g., const hoistedGetSurveyConfig = vi.hoisted(() =>
vi.fn())) and have vi.mock('./surveyRegistry', () => ({ getSurveyConfig:
hoistedGetSurveyConfig })) so the mock is created before module init; in
beforeEach call hoistedGetSurveyConfig.mockReset() and set
hoistedGetSurveyConfig.mockImplementationOnce(...) or mockReturnValue(...) for
each test to control returned { enabled } values rather than clearing a shared
object.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant