refactor: centralize remaining ECS entity data - #15544
Conversation
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
🎭 Playwright: ❌ 1760 passed, 43 failed · 2 flaky❌ Failed Tests📊 Browser Reports
🎨 Storybook: ✅ Built — View Storybook📦 Bundle Size
⚡ Performance Report
Absolute values
Raw data{
"timestamp": "2026-08-21T09:08:54.847Z",
"gitSha": "b9cc3058c8b7cebe59b85ef3afbf6b3a3f7d2949",
"branch": "docs/ecs-component-entity-gap-audit",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2043.7469999999962,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.652000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 488.089,
"heapDeltaBytes": -15124652,
"heapUsedBytes": 55532716,
"domNodes": -279,
"jsHeapTotalBytes": 5234688,
"scriptDurationMs": 7.542999999999999,
"eventListeners": -155,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-idle",
"durationMs": 2038.157999999953,
"styleRecalcs": 8,
"styleRecalcDurationMs": 6.829,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 480.02,
"heapDeltaBytes": -11871368,
"heapUsedBytes": 58410932,
"domNodes": -280,
"jsHeapTotalBytes": 4972544,
"scriptDurationMs": 7.759,
"eventListeners": -155,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-mouse-sweep",
"durationMs": 2388.684000000012,
"styleRecalcs": 77,
"styleRecalcDurationMs": 42.077000000000005,
"layouts": 12,
"layoutDurationMs": 4.013,
"taskDurationMs": 1498.0430000000001,
"heapDeltaBytes": 4082556,
"heapUsedBytes": 74835504,
"domNodes": -281,
"jsHeapTotalBytes": 5758976,
"scriptDurationMs": 230.94500000000002,
"eventListeners": -155,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "canvas-mouse-sweep",
"durationMs": 2244.034000000056,
"styleRecalcs": 79,
"styleRecalcDurationMs": 43.12,
"layouts": 12,
"layoutDurationMs": 3.327,
"taskDurationMs": 1268.41,
"heapDeltaBytes": -9993016,
"heapUsedBytes": 59928876,
"domNodes": -282,
"jsHeapTotalBytes": 6545408,
"scriptDurationMs": 188.10200000000003,
"eventListeners": -185,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1739.734999999996,
"styleRecalcs": 32,
"styleRecalcDurationMs": 16.028000000000002,
"layouts": 6,
"layoutDurationMs": 0.605,
"taskDurationMs": 340.323,
"heapDeltaBytes": 4258176,
"heapUsedBytes": 74963208,
"domNodes": 77,
"jsHeapTotalBytes": 4980736,
"scriptDurationMs": 10.197000000000001,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1743.5460000000376,
"styleRecalcs": 31,
"styleRecalcDurationMs": 15.285,
"layouts": 6,
"layoutDurationMs": 0.5099999999999999,
"taskDurationMs": 345.773,
"heapDeltaBytes": 3966276,
"heapUsedBytes": 74586668,
"domNodes": 75,
"jsHeapTotalBytes": 5505024,
"scriptDurationMs": 11.588000000000001,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "dom-widget-clipping",
"durationMs": 706.6950000000247,
"styleRecalcs": 10,
"styleRecalcDurationMs": 6.156,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 435.046,
"heapDeltaBytes": -5909228,
"heapUsedBytes": 64704984,
"domNodes": 16,
"jsHeapTotalBytes": 6815744,
"scriptDurationMs": 38.627,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 720.890000000054,
"styleRecalcs": 10,
"styleRecalcDurationMs": 7.219000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 440.82200000000006,
"heapDeltaBytes": -5739444,
"heapUsedBytes": 64749832,
"domNodes": 16,
"jsHeapTotalBytes": 6553600,
"scriptDurationMs": 38.644999999999996,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2036.8040000000178,
"styleRecalcs": 1,
"styleRecalcDurationMs": 1.007000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 521.6629999999999,
"heapDeltaBytes": -10335376,
"heapUsedBytes": 73430576,
"domNodes": -275,
"jsHeapTotalBytes": -1908736,
"scriptDurationMs": 34.25,
"eventListeners": -183,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-idle",
"durationMs": 2037.9840000000513,
"styleRecalcs": 3,
"styleRecalcDurationMs": 3.1319999999999992,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 565.3969999999999,
"heapDeltaBytes": -12100744,
"heapUsedBytes": 72752336,
"domNodes": -275,
"jsHeapTotalBytes": -1384448,
"scriptDurationMs": 40.06,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 4240.336999999954,
"styleRecalcs": 63,
"styleRecalcDurationMs": 8.741,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3152.605,
"heapDeltaBytes": -18999668,
"heapUsedBytes": 66218828,
"domNodes": -276,
"jsHeapTotalBytes": 3072000,
"scriptDurationMs": 1238.875,
"eventListeners": -179,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 4200.380999999993,
"styleRecalcs": 62,
"styleRecalcDurationMs": 8.098999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3101.665,
"heapDeltaBytes": 1249488,
"heapUsedBytes": 65945736,
"domNodes": -275,
"jsHeapTotalBytes": 4980736,
"scriptDurationMs": 1237.832,
"eventListeners": -149,
"totalBlockingTimeMs": 7,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 4630.583999999999,
"styleRecalcs": 66,
"styleRecalcDurationMs": 11.130999999999998,
"layouts": 60,
"layoutDurationMs": 7.268999999999999,
"taskDurationMs": 2831.861,
"heapDeltaBytes": 24534204,
"heapUsedBytes": 91420088,
"domNodes": 24,
"jsHeapTotalBytes": 3407872,
"scriptDurationMs": 1058.388,
"eventListeners": 12,
"totalBlockingTimeMs": 5,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 4720.65299999997,
"styleRecalcs": 66,
"styleRecalcDurationMs": 11.380999999999998,
"layouts": 60,
"layoutDurationMs": 7.454999999999999,
"taskDurationMs": 2870.08,
"heapDeltaBytes": 19602308,
"heapUsedBytes": 90261696,
"domNodes": 24,
"jsHeapTotalBytes": 2883584,
"scriptDurationMs": 1080.349,
"eventListeners": 12,
"totalBlockingTimeMs": 4,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "legacy-node-drag",
"durationMs": 3291.7150000000106,
"styleRecalcs": 41,
"styleRecalcDurationMs": 5.368000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 2273.7180000000003,
"heapDeltaBytes": 24919552,
"heapUsedBytes": 93720640,
"domNodes": 0,
"jsHeapTotalBytes": 1634304,
"scriptDurationMs": 224.559,
"eventListeners": 188,
"totalBlockingTimeMs": 15,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "legacy-node-drag",
"durationMs": 3221.6640000000325,
"styleRecalcs": 41,
"styleRecalcDurationMs": 5.149999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 2263.68,
"heapDeltaBytes": 25503492,
"heapUsedBytes": 93820856,
"domNodes": 0,
"jsHeapTotalBytes": 2158592,
"scriptDurationMs": 211.94100000000003,
"eventListeners": 188,
"totalBlockingTimeMs": 13,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "minimap-idle",
"durationMs": 2051.50500000002,
"styleRecalcs": 2,
"styleRecalcDurationMs": 2.1280000000000014,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 545.6679999999999,
"heapDeltaBytes": -14333524,
"heapUsedBytes": 73171580,
"domNodes": -272,
"jsHeapTotalBytes": -73728,
"scriptDurationMs": 35.11800000000001,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "minimap-idle",
"durationMs": 2029.320000000098,
"styleRecalcs": 2,
"styleRecalcDurationMs": 1.8849999999999978,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 529.0780000000001,
"heapDeltaBytes": -14180792,
"heapUsedBytes": 73032732,
"domNodes": -274,
"jsHeapTotalBytes": -335872,
"scriptDurationMs": 35.87100000000001,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 753.3499999999549,
"styleRecalcs": 45,
"styleRecalcDurationMs": 9.684,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 533.9929999999999,
"heapDeltaBytes": -5854748,
"heapUsedBytes": 65408808,
"domNodes": 16,
"jsHeapTotalBytes": 6291456,
"scriptDurationMs": 149.945,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 692.9870000000165,
"styleRecalcs": 46,
"styleRecalcDurationMs": 9.318000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 501.132,
"heapDeltaBytes": -4967440,
"heapUsedBytes": 67218232,
"domNodes": 18,
"jsHeapTotalBytes": 6029312,
"scriptDurationMs": 144.21,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 2022.1450000000232,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.057,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 473.123,
"heapDeltaBytes": -9356940,
"heapUsedBytes": 62441176,
"domNodes": -296,
"jsHeapTotalBytes": 6021120,
"scriptDurationMs": 7.546,
"eventListeners": -199,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-idle",
"durationMs": 2014.4490000000133,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.832999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 468.082,
"heapDeltaBytes": -14348048,
"heapUsedBytes": 57726784,
"domNodes": -296,
"jsHeapTotalBytes": 5758976,
"scriptDurationMs": 6.993999999999999,
"eventListeners": -201,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1892.9029999999898,
"styleRecalcs": 77,
"styleRecalcDurationMs": 37.00000000000001,
"layouts": 16,
"layoutDurationMs": 3.9450000000000007,
"taskDurationMs": 1114.036,
"heapDeltaBytes": -11684436,
"heapUsedBytes": 60415672,
"domNodes": -295,
"jsHeapTotalBytes": 6021120,
"scriptDurationMs": 121.82,
"eventListeners": -201,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1842.9869999999937,
"styleRecalcs": 77,
"styleRecalcDurationMs": 35.824999999999996,
"layouts": 16,
"layoutDurationMs": 4.414,
"taskDurationMs": 1110.5819999999999,
"heapDeltaBytes": 8510980,
"heapUsedBytes": 80481896,
"domNodes": -295,
"jsHeapTotalBytes": 5758976,
"scriptDurationMs": 123.15899999999999,
"eventListeners": -233,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-transition-enter",
"durationMs": 1431.002000000035,
"styleRecalcs": 19,
"styleRecalcDurationMs": 31.912999999999997,
"layouts": 14,
"layoutDurationMs": 14.703,
"taskDurationMs": 899.1219999999997,
"heapDeltaBytes": 23575832,
"heapUsedBytes": 105652264,
"domNodes": 13671,
"jsHeapTotalBytes": 10747904,
"scriptDurationMs": 36.734,
"eventListeners": 2381,
"totalBlockingTimeMs": 150,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 14501.187000000073,
"styleRecalcs": 245,
"styleRecalcDurationMs": 34.919,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 10885.891,
"heapDeltaBytes": 6169200,
"heapUsedBytes": 89740344,
"domNodes": -271,
"jsHeapTotalBytes": 3477504,
"scriptDurationMs": 4128.916,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 14274.844999999914,
"styleRecalcs": 245,
"styleRecalcDurationMs": 33.951,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 10775,
"heapDeltaBytes": 7461612,
"heapUsedBytes": 91220704,
"domNodes": -272,
"jsHeapTotalBytes": 3477504,
"scriptDurationMs": 4063.9399999999996,
"eventListeners": -153,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333338,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 17332.41799999996,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 16628.094999999998,
"heapDeltaBytes": -31894896,
"heapUsedBytes": 178930720,
"domNodes": -6548,
"jsHeapTotalBytes": 6516736,
"scriptDurationMs": 321.998,
"eventListeners": -7473,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.779999999999927,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 17043.61599999993,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 16495.319000000003,
"heapDeltaBytes": -25727712,
"heapUsedBytes": 176072000,
"domNodes": -6548,
"jsHeapTotalBytes": 3895296,
"scriptDurationMs": 331.98499999999996,
"eventListeners": -7471,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.223333333333358,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-pan",
"durationMs": 21791.639000000032,
"styleRecalcs": 172,
"styleRecalcDurationMs": 18.539999999999974,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 21407.806999999997,
"heapDeltaBytes": -35455984,
"heapUsedBytes": 169292480,
"domNodes": -6548,
"jsHeapTotalBytes": 2322432,
"scriptDurationMs": 1050.4150000000002,
"eventListeners": -7465,
"totalBlockingTimeMs": 248,
"frameDurationMs": 17.776666666666642,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 20926.603,
"styleRecalcs": 178,
"styleRecalcDurationMs": 16.53299999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 20535.093999999997,
"heapDeltaBytes": -17359116,
"heapUsedBytes": 184102052,
"domNodes": -6548,
"jsHeapTotalBytes": 7303168,
"scriptDurationMs": 971.7139999999999,
"eventListeners": -7463,
"totalBlockingTimeMs": 44,
"frameDurationMs": 17.776666666666763,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "workflow-execution",
"durationMs": 467.91399999995065,
"styleRecalcs": 19,
"styleRecalcDurationMs": 25.324,
"layouts": 3,
"layoutDurationMs": 0.648,
"taskDurationMs": 133.625,
"heapDeltaBytes": 5874200,
"heapUsedBytes": 73203808,
"domNodes": 126,
"jsHeapTotalBytes": 0,
"scriptDurationMs": 7.399999999999999,
"eventListeners": 99,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "workflow-execution",
"durationMs": 523.4540000000152,
"styleRecalcs": 19,
"styleRecalcDurationMs": 24.301000000000002,
"layouts": 4,
"layoutDurationMs": 1.324,
"taskDurationMs": 150.38400000000001,
"heapDeltaBytes": 5986992,
"heapUsedBytes": 73471924,
"domNodes": 145,
"jsHeapTotalBytes": 262144,
"scriptDurationMs": 8.266000000000002,
"eventListeners": 97,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
}
]
} |
Codecov Report❌ Patch coverage is @@ Coverage Diff @@
## test/ecs-migration-behavior-coverage #15544 +/- ##
========================================================================
+ Coverage 82.49% 82.53% +0.03%
========================================================================
Files 1904 1911 +7
Lines 123436 123619 +183
Branches 39892 39884 -8
========================================================================
+ Hits 101831 102026 +195
+ Misses 21083 21072 -11
+ Partials 522 521 -1
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 1 file with indirect coverage changes 🚀 New features to boost your workflow:
|
Summary
Centralize the remaining component and entity data identified by the ECS audit while preserving legacy extension-facing projections.
Changes
Review Focus
Review the commits in sequence; each audit concern is isolated in its own commit. Pay particular attention to compatibility projections, cleanup boundaries, extension payload isolation, and differential serialization parity.
Verification: full Vitest suite (16,718 passed, 8 skipped);
! comfy(no-redundant-vitest-cleanup): vi.unstubAllGlobals() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/vitestSetup.test.ts:13:5]
12 | afterEach(() => {
13 | vi.unstubAllGlobals()
: ^^^^^^^^^^^^^^^^^^^^^
14 | })
`----
! comfy(no-redundant-vitest-cleanup): vi.resetAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/vueNodes/composables/useNodePointerInteractions.test.ts:120:5]
119 | beforeEach(async () => {
120 | vi.resetAllMocks()
: ^^^^^^^^^^^^^^^^^^
121 | setActivePinia(createTestingPinia())
`----
! comfy(no-module-scope-vitest-mocks): Install vi.spyOn() in beforeEach or a test because automatic Vitest cleanup removes earlier mock installations before assertions run.
,-[src/platform/workflow/core/services/workflowService.insertWorkflow.test.ts:143:3]
142 | } = HTMLCanvasElement.prototype
143 | vi.spyOn(canvasPrototype, 'getContext').mockReturnValue(
: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
144 | createMockCanvasRenderingContext2D()
`----
! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/platform/workflow/core/services/workflowService.insertWorkflow.test.ts:150:3]
149 | LiteGraph.unregisterNodeType(PROBE_NODE_TYPE)
150 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
151 | })
`----
! comfy(no-redundant-vitest-cleanup): vi.unstubAllGlobals() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/layerEditor/composables/useLayerEditorSession.test.ts:152:3]
151 | afterEach(() => {
152 | vi.unstubAllGlobals()
: ^^^^^^^^^^^^^^^^^^^^^
153 | })
`----
! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/vueNodes/components/LGraphNode.subgraph.test.ts:82:5]
81 | rootGraph = new LGraph()
82 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
83 | })
`----
! oxc(erasing-op): Unexpected erasing operation. This expression will always evaluate to zero.
,-[src/renderer/extensions/layerEditor/engine/editor/selectionMath.test.ts:222:19]
221 | expect(m.data[0]).toBe(1)
222 | expect(m.data[0 * 5 + 4]).toBe(1)
: ^^^^^
223 | expect(m.data[0 * 5 + 2]).toBe(0)
`----
help: This is most likely not the intended outcome. Consider removing the operation, or directly assigning zero to the variable
! oxc(erasing-op): Unexpected erasing operation. This expression will always evaluate to zero.
,-[src/renderer/extensions/layerEditor/engine/editor/selectionMath.test.ts:223:19]
222 | expect(m.data[0 * 5 + 4]).toBe(1)
223 | expect(m.data[0 * 5 + 2]).toBe(0)
: ^^^^^
224 | })
`----
help: This is most likely not the intended outcome. Consider removing the operation, or directly assigning zero to the variable
! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/vueNodes/layout/ensureCorrectLayoutScale.test.ts:74:5]
73 | beforeEach(() => {
74 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
75 | setActivePinia(createTestingPinia({ stubActions: false }))
`----
! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/stores/rerouteStore.test.ts:56:5]
55 | afterEach(() => {
56 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
57 | })
`----
! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/minimap/composables/useMinimap.test.ts:298:5]
297 | beforeEach(() => {
298 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
299 | setActivePinia(createTestingPinia({ stubActions: false }))
`----
! comfy(no-redundant-vitest-cleanup): vi.resetAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/components/rightSidePanel/parameters/WidgetActions.test.ts:93:5]
92 | setActivePinia(createTestingPinia({ stubActions: false }))
93 | vi.resetAllMocks()
: ^^^^^^^^^^^^^^^^^^
94 | mockIsFavorited.mockReturnValue(false)
`----
! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/vueNodes/layout/nodeSizeReflow.test.ts:38:5]
37 | afterEach(() => {
38 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
39 | })
`----
! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/renderer/extensions/minimap/minimapCanvasRenderer.test.ts:48:5]
47 | beforeEach(() => {
48 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
49 | setActivePinia(createTestingPinia({ stubActions: false }))
`----
! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/stores/linkStore.test.ts:51:5]
50 | afterEach(() => {
51 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
52 | })
`----
! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/lib/litegraph/src/LGraphCanvas.drawConnections.test.ts:79:5]
78 | beforeEach(() => {
79 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
80 | setActivePinia(createTestingPinia({ stubActions: false }))
`----
! comfy(no-module-scope-vitest-mocks): Install vi.spyOn() in beforeEach or a test because automatic Vitest cleanup removes earlier mock installations before assertions run.
,-[src/base/common/downloadUtil.test.ts:29:26]
28 | // Global stubs
29 | ,-> let createObjectURLSpy = vi
30 |
-> .spyOn(URL, 'createObjectURL') 31 | .mockReturnValue('blob:mock-url')----! comfy(no-module-scope-vitest-mocks): Install vi.spyOn() in beforeEach or a test because automatic Vitest cleanup removes earlier mock installations before assertions run.
,-[src/base/common/downloadUtil.test.ts:32:26]
31 | .mockReturnValue('blob:mock-url')
32 | ,-> let revokeObjectURLSpy = vi
33 |
-> .spyOn(URL, 'revokeObjectURL') 34 | .mockImplementation(() => {})----! comfy(no-redundant-vitest-cleanup): vi.unstubAllGlobals() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/platform/cloud/onboarding/CloudLoginView.test.ts:70:3]
69 | isEmbeddedWebView.value = false
70 | vi.unstubAllGlobals()
: ^^^^^^^^^^^^^^^^^^^^^
71 | })
`----
! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/components/rightSidePanel/RightSidePanel.test.ts:121:5]
120 | beforeEach(() => {
121 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
122 | mockApp.rootGraph = null
`----
! comfy(no-redundant-vitest-cleanup): vi.unstubAllGlobals() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/utils/videoMetadataUtil.test.ts:107:5]
106 | afterEach(() => {
107 | vi.unstubAllGlobals()
: ^^^^^^^^^^^^^^^^^^^^^
108 | })
`----
! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/platform/assets/utils/assetUrlUtil.test.ts:27:20]
26 | describe('getAssetSubfolder', () => {
27 | beforeEach(() => vi.clearAllMocks())
: ^^^^^^^^^^^^^^^^^^
28 |
`----
! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/platform/assets/utils/assetUrlUtil.test.ts:57:20]
56 | describe('getAssetUrl', () => {
57 | beforeEach(() => vi.clearAllMocks())
: ^^^^^^^^^^^^^^^^^^
58 |
`----
! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/utils/sessionFeatureFlagOverride.test.ts:34:5]
33 | afterEach(() => {
34 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
35 | })
`----
! comfy(no-redundant-vitest-cleanup): vi.resetAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/composables/useCopySystemInfo.test.ts:69:5]
68 | beforeEach(() => {
69 | vi.resetAllMocks()
: ^^^^^^^^^^^^^^^^^^
70 | distributionFlags.isCloud = false
`----
! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/lib/litegraph/src/LLink.store.test.ts:23:19]
22 | beforeEach(() => setActivePinia(createTestingPinia({ stubActions: false })))
23 | afterEach(() => vi.restoreAllMocks())
: ^^^^^^^^^^^^^^^^^^^^
24 |
`----
! comfy(no-redundant-vitest-cleanup): vi.unstubAllEnvs() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/schemas/nodeDef/inputSpecUtil.test.ts:9:5]
8 | afterEach(() => {
9 | vi.unstubAllEnvs()
: ^^^^^^^^^^^^^^^^^^
10 | })
`----
! comfy(no-redundant-vitest-cleanup): vi.clearAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/platform/telemetry/reportError.test.ts:31:5]
30 | beforeEach(() => {
31 | vi.clearAllMocks()
: ^^^^^^^^^^^^^^^^^^
32 | sentryLive(true)
`----
! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/lib/litegraph/src/LGraphNode.test.ts:802:5]
801 | afterEach(() => {
802 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
803 | })
`----
! typescript(no-array-delete): Using the
deleteoperator with an array expression is unsafe.,-[src/lib/litegraph/src/infrastructure/createMutationView.test.ts:77:5]
76 | expect(() => view.mutateThenThrow()).toThrow('failed mutation')
77 | delete view[1]
: ^^^^^^ ^^|^
: |
-- This expression evaluates to an array. 78 | Object.defineProperty(view, '0', { value: 4 })----Found 30 warnings and 0 errors.
Finished in 10.9s on 3471 files with 177 rules using 16 threads.
! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/scripts/changeTracker.test.ts:231:5]
230 | afterEach(() => {
231 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
232 | vi.clearAllTimers()
`----
! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/scripts/api.sessionOverride.test.ts:37:5]
36 | api.serverFeatureFlags.value = {}
37 | vi.restoreAllMocks()
: ^^^^^^^^^^^^^^^^^^^^
38 | })
`----
! comfy(no-module-scope-vitest-mocks): Install vi.stubGlobal() in beforeEach or a test because automatic Vitest cleanup removes earlier mock installations before assertions run.
,-[src/scripts/ui.storageResilience.test.ts:22:1]
21 | // so the module-scope
new ComfyApp()restores against it.22 | vi.stubGlobal('localStorage', {} as Storage)
: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
23 |
`----
! comfy(no-redundant-vitest-cleanup): vi.restoreAllMocks() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[src/scripts/metadata/readFile.test.ts:10:19]
9 | describe('readFileAsArrayBuffer', () => {
10 | afterEach(() => vi.restoreAllMocks())
: ^^^^^^^^^^^^^^^^^^^^
11 |
`----
! comfy(no-redundant-vitest-cleanup): vi.unstubAllGlobals() is redundant in a Vitest hook because Vitest performs this cleanup automatically.
,-[packages/shared-frontend-utils/src/networkUtil.test.ts:27:3]
26 | afterEach(() => {
27 | vi.unstubAllGlobals()
: ^^^^^^^^^^^^^^^^^^^^^
28 | vi.useRealTimers()
`----
Found 5 warnings and 0 errors.
Finished in 540ms on 4398 files with 2 rules using 16 threads.
/home/user/workspace/repo/src/components/breadcrumb/SubgraphBreadcrumb.vue
142:16 warning Do not inspect the DOM inside a computed. Derive from a store instead. See docs/guidance/state-and-effects.md no-restricted-syntax
/home/user/workspace/repo/src/components/maskeditor/BrushCursor.vue
60:22 warning Do not measure the DOM inside a computed - every recompute becomes a layout read. Derive from a store instead. See docs/guidance/state-and-effects.md no-restricted-syntax
71:22 warning Do not measure the DOM inside a computed - every recompute becomes a layout read. Derive from a store instead. See docs/guidance/state-and-effects.md no-restricted-syntax
/home/user/workspace/repo/src/components/topbar/WorkflowTabs.vue
218:6 warning Do not inspect the DOM inside a computed. Derive from a store instead. See docs/guidance/state-and-effects.md no-restricted-syntax
✖ 4 problems (0 errors, 4 warnings); ; Checking formatting...
All matched files use the correct format.
Finished in 2977ms on 4771 files using 16 threads.; .
Child of #15536.