Add support for growable inputs
Also fixes connections to widget inputs created by a dynamic combo breaking on reload.
Performs some refactoring to group the prior dynamic inputs code.
See also, the overarching frontend PR: comfyanonymous/ComfyUI#10832
βIssue is synchronized with this Notion page by Unito
π Walkthrough
Walkthrough
Moves match-type and autogrow dynamic-input logic into a centralized dynamicWidgets module, adding applyDynamicInputs and handlers (match-type, autogrow), type-management helpers, schema changes for autogrow, service integration to skip default socket creation when handled, LGraphNode field addition, removal of spliceInputs, and updated tests for autogrow.
Changes
| Cohort / File(s) | Summary |
|---|---|
Core dynamic widgets enhancement src/core/graph/widgets/dynamicWidgets.ts |
Adds applyDynamicInputs dispatcher and dynamicInputs map; implements applyMatchType, applyAutogrow, changeOutputType, combineTypes, intersection, isStrings; rewrites dynamicComboWidget/autogrow behavior for inserting/removing/relinking inputs, preserving connections, and propagating types. |
Extension removal src/extensions/core/index.ts, src/extensions/core/matchType.ts |
Removes ./matchType import from index.ts and deletes matchType.ts (logic migrated into dynamicWidgets). |
Schema updates src/schemas/nodeDefSchema.ts |
Removes zWidgetTemplate and template from zBaseInputOptions; adds exported zAutogrowOptions (with nested template schema); updates zDynamicComboInputSpec to extend zBaseInputOptions. |
Service integration src/services/litegraphService.ts |
Imports applyDynamicInputs and short-circuits input socket creation when applyDynamicInputs(node, inputSpec) returns truthy. |
Node runtime shape changes src/lib/litegraph/src/LGraphNode.ts |
Adds public comfyMatchType?: Record<string, Record<string, string>> field; removes spliceInputs method; input slot rendering now considers slot.alwaysVisible. |
Interfaces / slots src/lib/litegraph/src/interfaces.ts, src/lib/litegraph/src/node/NodeInputSlot.ts |
Adds optional alwaysVisible?: boolean to INodeInputSlot and NodeInputSlot class. |
Type guard util src/utils/typeGuardUtil.ts |
Adds exported isStrings(types: unknown[]): types is string[] type guard. |
Tests updated tests-ui/tests/widgets/dynamicCombo.test.ts |
Adds LGraph import, test helper nextTick, helpers addAutogrow/connectInput, updates expected input naming, and introduces Autogrow tests for naming, min/max, growth, and shrink behavior. |
Sequence Diagram(s)
sequenceDiagram
autonumber
participant Service as litegraphService
participant Dynamic as dynamicWidgets
participant Node as LGraphNode
participant Handler as DynamicHandler
Service->>Dynamic: applyDynamicInputs(node, inputSpec)
alt inputSpec handled dynamically
Dynamic->>Handler: dispatch to specific handler (autogrow / matchType)
Handler->>Node: add/remove/reorder inputs, update comfyMatchType, adjust output types, relink/prune connections
Handler-->>Dynamic: handler complete
Dynamic-->>Service: return true (skip default socket creation)
else not dynamic
Dynamic-->>Service: return false (proceed with default socket creation)
end
Service->>Node: create input socket (if not skipped)
β¨ Finishing touches
- [ ] π Generate docstrings
π§ͺ Generate unit tests (beta)
- [ ] Create PR with unit tests
- [ ] Post copyable unit tests in a comment
- [ ] Commit unit tests in branch
austin/growable-inputs
π Recent review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
π₯ Commits
Reviewing files that changed from the base of the PR and between 88e5728a8346d5685d5d926c8201d1f026f09689 and 3baa747509ee76800be70fb290971663f040f6fc.
π Files selected for processing (6)
-
src/core/graph/widgets/dynamicWidgets.ts(5 hunks) -
src/lib/litegraph/src/LGraphNode.ts(2 hunks) -
src/lib/litegraph/src/interfaces.ts(1 hunks) -
src/lib/litegraph/src/node/NodeInputSlot.ts(1 hunks) -
src/schemas/nodeDefSchema.ts(1 hunks) -
tests-ui/tests/widgets/dynamicCombo.test.ts(4 hunks)
π§ Files skipped from review as they are similar to previous changes (2)
- src/lib/litegraph/src/LGraphNode.ts
- src/schemas/nodeDefSchema.ts
π§° Additional context used
π Path-based instructions (15)
**/*.{vue,ts,tsx}
π CodeRabbit inference engine (.cursorrules)
**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts -
src/core/graph/widgets/dynamicWidgets.ts -
tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.{ts,tsx,js}
π CodeRabbit inference engine (.cursorrules)
Use es-toolkit for utility functions
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts -
src/core/graph/widgets/dynamicWidgets.ts -
tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.{ts,tsx}
π CodeRabbit inference engine (.cursorrules)
Use TypeScript for type safety
**/*.{ts,tsx}: Never useanytype - use proper TypeScript types Never useas anytype assertions - fix the underlying type issue
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts -
src/core/graph/widgets/dynamicWidgets.ts -
tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.{ts,tsx,js,vue}
π CodeRabbit inference engine (.cursorrules)
Implement proper error handling in components and services
**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in.prettierrcOrganize imports by sorting and grouping by plugin, and runpnpm formatbefore committing
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts -
src/core/graph/widgets/dynamicWidgets.ts -
tests-ui/tests/widgets/dynamicCombo.test.ts
src/**/*.{vue,ts}
π CodeRabbit inference engine (.github/copilot-instructions.md)
src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles Implement proper error handling Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts -
src/core/graph/widgets/dynamicWidgets.ts
src/**/*.ts
π CodeRabbit inference engine (.github/copilot-instructions.md)
src/**/*.ts: Use es-toolkit for utility functions Use TypeScript for type safety
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts -
src/core/graph/widgets/dynamicWidgets.ts
**/*.{ts,tsx,js,jsx,vue}
π CodeRabbit inference engine (CLAUDE.md)
Use camelCase for variable and setting names in TypeScript/Vue files
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts -
src/core/graph/widgets/dynamicWidgets.ts -
tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.{ts,tsx,vue}
π CodeRabbit inference engine (CLAUDE.md)
**/*.{ts,tsx,vue}: Useconst settingStore = useSettingStore()andsettingStore.get('Comfy.SomeSetting')to retrieve settings in TypeScript/Vue files Useawait settingStore.set('Comfy.SomeSetting', newValue)to update settings in TypeScript/Vue files Check server capabilities usingapi.serverSupportsFeature('feature_name')before using enhanced features Useapi.getServerFeature('config_name', defaultValue)to retrieve server feature configurationEnforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts -
src/core/graph/widgets/dynamicWidgets.ts -
tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.ts
π CodeRabbit inference engine (CLAUDE.md)
**/*.ts: Define dynamic setting defaults using runtime context with functions in settings configuration UsedefaultsByInstallVersionproperty for gradual feature rollout based on version in settings configuration
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts -
src/core/graph/widgets/dynamicWidgets.ts -
tests-ui/tests/widgets/dynamicCombo.test.ts
src/**/*.{ts,tsx,vue}
π CodeRabbit inference engine (src/CLAUDE.md)
src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks Avoid using @ts-expect-error; use proper TypeScript types instead Use es-toolkit for utility functions instead of other utility libraries Implement proper TypeScript types throughout the codebase
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts -
src/core/graph/widgets/dynamicWidgets.ts
src/**/*.{vue,ts,tsx}
π CodeRabbit inference engine (src/CLAUDE.md)
Follow Vue 3 composition API style guide
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts -
src/core/graph/widgets/dynamicWidgets.ts
src/lib/litegraph/**/*.{js,ts,jsx,tsx}
π CodeRabbit inference engine (src/lib/litegraph/CLAUDE.md)
src/lib/litegraph/**/*.{js,ts,jsx,tsx}: Run ESLint instead of manually figuring out whitespace fixes or other trivial style concerns using thepnpm lint:fixcommand Take advantage ofTypedArraysubarraywhen appropriate Thesizeandposproperties ofRectangleshare the same array buffer (subarray); they may be used to set the rectangle's size and position Prefer single lineifsyntax over adding curly braces, when the statement has a very concise expression and concise, single line statement Do not replace&&=or||=with=when there is no reason to do so. If you do find a reason to remove either&&=or||=, leave a comment explaining why the removal occurred When writing methods, prefer returning idiomatic JavaScriptundefinedovernull
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts
src/lib/litegraph/**/*.{ts,tsx}
π CodeRabbit inference engine (src/lib/litegraph/CLAUDE.md)
Type assertions are an absolute last resort. In almost all cases, they are a crutch that leads to brittle code
Files:
-
src/lib/litegraph/src/node/NodeInputSlot.ts -
src/lib/litegraph/src/interfaces.ts
tests-ui/**/*.test.{js,ts,jsx,tsx}
π CodeRabbit inference engine (tests-ui/CLAUDE.md)
tests-ui/**/*.test.{js,ts,jsx,tsx}: Write tests for new features Follow existing test patterns in the codebase Use existing test utilities rather than writing custom utilities Mock external dependencies in tests Always prefer vitest mock functions over writing verbose manual mocks
Files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
**/*.{test,spec}.{ts,tsx,js}
π CodeRabbit inference engine (AGENTS.md)
Unit and component tests should be located in
tests-ui/or co-located with components assrc/components/**/*.{test,spec}.ts; E2E tests should be inbrowser_tests/
Files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
π§ Learnings (15)
π Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Do not replace `&&=` or `||=` with `=` when there is no reason to do so. If you do find a reason to remove either `&&=` or `||=`, leave a comment explaining why the removal occurred
Applied to files:
-
src/core/graph/widgets/dynamicWidgets.ts
π Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : When writing methods, prefer returning idiomatic JavaScript `undefined` over `null`
Applied to files:
-
src/core/graph/widgets/dynamicWidgets.ts
π Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Take advantage of `TypedArray` `subarray` when appropriate
Applied to files:
-
src/core/graph/widgets/dynamicWidgets.ts
π Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{ts,tsx} : Type assertions are an absolute last resort. In almost all cases, they are a crutch that leads to brittle code
Applied to files:
-
src/core/graph/widgets/dynamicWidgets.ts
π Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup
Applied to files:
-
src/core/graph/widgets/dynamicWidgets.ts -
tests-ui/tests/widgets/dynamicCombo.test.ts
π Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : When writing tests for subgraph-related code, always import from the barrel export at `@/lib/litegraph/src/litegraph` to avoid circular dependency issues
Applied to files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
π Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{js,ts,jsx,tsx} : When adding features, always write vitest unit tests using cursor rules in @.cursor
Applied to files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
π Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Write tests for new features
Applied to files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
π Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Use existing test utilities rather than writing custom utilities
Applied to files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
π Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Mock external dependencies in tests
Applied to files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
π Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Follow existing test patterns in the codebase
Applied to files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
π Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Prefer specific selectors in browser tests
Applied to files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
π Learning: 2025-11-24T19:48:23.088Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-11-24T19:48:23.088Z
Learning: Use Vitest (with happy-dom) for unit and component tests, and Playwright for E2E tests
Applied to files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
π Learning: 2025-11-24T19:48:09.318Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursor/rules/unit-test.mdc:0-0
Timestamp: 2025-11-24T19:48:09.318Z
Learning: Applies to test/**/*.{test,spec}.{js,ts,jsx,tsx} : Use `vitest` for unit testing in this project
Applied to files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
π Learning: 2025-11-24T19:48:09.318Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursor/rules/unit-test.mdc:0-0
Timestamp: 2025-11-24T19:48:09.318Z
Learning: Applies to test/**/*.{test,spec}.{js,ts,jsx,tsx} : Prefer the use of `test.extend` over loose variables; import `test as baseTest` from `vitest`
Applied to files:
-
tests-ui/tests/widgets/dynamicCombo.test.ts
𧬠Code graph analysis (1)
tests-ui/tests/widgets/dynamicCombo.test.ts (2)
src/lib/litegraph/src/LGraphNode.ts (4)
LGraphNode(209-211)LGraphNode(221-4156)LGraphNode(729-737)LGraphNode(739-745)src/schemas/nodeDef/migration.ts (1)
transformInputSpecV1ToV2(96-137)
πͺ ESLint
src/core/graph/widgets/dynamicWidgets.ts
[error] 1-1: Resolve error: EACCES: permission denied, open '/mkcuUAlogd'
at Object.writeFileSync (node:fs:2409:20)
at l (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:13670)
at createFilesMatcher (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:14422)
at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:70:65)
at Object.resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:147:20)
at file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:69
at setRuleContext (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint-import-context/lib/index.js:23:20)
at fullResolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:30)
at relative (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:215:12)
at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:220:16)
at ExportMap.get (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/export-map.js:88:22)
at processBodyStatement (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/rules/namespace.js:9:31)
at Program (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/rules/namespace.js:100:21)
at ruleErrorHandler (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1173:33)
at /home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-visitor.js:76:46
at Array.forEach (
(import-x/namespace)
[error] 1-1: Resolve error: EACCES: permission denied, open '/PyYSKgpRNr'
at Object.writeFileSync (node:fs:2409:20)
at l (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:13670)
at createFilesMatcher (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:14422)
at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:70:65)
at Object.resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:147:20)
at file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:69
at setRuleContext (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint-import-context/lib/index.js:23:20)
at fullResolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:30)
at relative (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:215:12)
at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:220:16)
at checkSourceValue (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/rules/no-unresolved.js:31:34)
at checkSourceValue (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:14:9)
at checkSource (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:17:9)
at ruleErrorHandler (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1173:33)
at /home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-visitor.js:76:46
at Array.forEach (
(import-x/no-unresolved)
[error] 1-1: Resolve error: EACCES: permission denied, open '/GWyqbUMALu'
at Object.writeFileSync (node:fs:2409:20)
at l (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:13670)
at createFilesMatcher (file:///home/jailuser/git/node_modules/.pnpm/[email protected]/node_modules/get-tsconfig/dist/index.mjs:7:14422)
at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:70:65)
at Object.resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected][email protected]_@typescript-eslin_da4796079dab5a32abf73f9910d12370/node_modules/eslint-import-resolver-typescript/lib/index.js:147:20)
at file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:69
at setRuleContext (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint-import-context/lib/index.js:23:20)
at fullResolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:170:30)
at relative (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:215:12)
at resolve (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/resolve.js:220:16)
at importType (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/import-type.js:126:63)
at checkImportForRelativePackage (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/rules/no-relative-packages.js:15:38)
at file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/rules/no-relative-packages.js:59:40
at checkSourceValue (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:14:9)
at checkSource (file:///home/jailuser/git/node_modules/.pnpm/[email protected]_@[email protected][email protected][email protected]__d4b6b79e6f12f59d34d55ebbf27dc73f/node_modules/eslint-plugin-import-x/lib/utils/module-visitor.js:17:9)
at ruleErrorHandler (/home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/linter.js:1173:33)
at /home/jailuser/git/node_modules/.pnpm/[email protected][email protected]/node_modules/eslint/lib/linter/source-code-visitor.js:76:46
at Array.forEach (
(import-x/no-relative-packages)
[error] 1-1: Unable to resolve path to module 'es-toolkit'.
(import-x/no-unresolved)
[error] 3-3: Unable to resolve path to module '@/composables/functional/useChainCallback'.
(import-x/no-unresolved)
[error] 4-4: Unable to resolve path to module '@/lib/litegraph/src/types/globalEnums'.
(import-x/no-unresolved)
[error] 11-11: Unable to resolve path to module '@/lib/litegraph/src/litegraph'.
(import-x/no-unresolved)
[error] 13-13: Unable to resolve path to module '@/schemas/nodeDef/migration'.
(import-x/no-unresolved)
[error] 19-19: Unable to resolve path to module '@/schemas/nodeDefSchema'.
(import-x/no-unresolved)
[error] 20-20: Unable to resolve path to module '@/services/litegraphService'.
(import-x/no-unresolved)
[error] 21-21: Unable to resolve path to module '@/scripts/app'.
(import-x/no-unresolved)
[error] 23-23: Unable to resolve path to module '@/utils/typeGuardUtil'.
(import-x/no-unresolved)
tests-ui/tests/widgets/dynamicCombo.test.ts
[error] 4-4: Unable to resolve path to module '@/lib/litegraph/src/litegraph'.
(import-x/no-unresolved)
β° Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
- GitHub Check: setup
- GitHub Check: test
- GitHub Check: lint-and-format
- GitHub Check: collect
π Additional comments (21)
src/lib/litegraph/src/node/NodeInputSlot.ts (1)
20-20: LGTM! Clean property addition.The optional
alwaysVisiblefield is properly typed and aligns with the interface definition.src/lib/litegraph/src/interfaces.ts (1)
346-346: LGTM! Interface augmentation matches implementation.The
alwaysVisibleproperty is consistently defined across the interface and class.tests-ui/tests/widgets/dynamicCombo.test.ts (4)
15-17: LGTM! Appropriate async helper for frame-based operations.The
nextTickhelper usingrequestAnimationFrameis suitable for awaiting visual updates and connection changes in autogrow tests.
47-55: LGTM! Clean test helper for autogrow scenarios.The
addAutogrowhelper properly constructs autogrow input specs using the migration utility.
56-61: LGTM! Well-structured connection helper.The
connectInputhelper creates a test node and establishes connections cleanly for autogrow tests.
110-178: LGTM! Comprehensive autogrow test coverage.The test suite thoroughly validates autogrow behavior including:
- Naming by prefix and explicit name lists
- Min/max constraint enforcement
- Dynamic growth and shrinkage on connection changes
src/core/graph/widgets/dynamicWidgets.ts (15)
1-1: LGTM! Appropriate utility import.Using
withoutfrom es-toolkit aligns with the coding guidelines for utility functions.
30-47: LGTM! Clean widget creation for inline inputs.The
ensureWidgetForInputfunction properly creates shim widgets and sets thealwaysVisibleflag for inputs that need persistent visibility.
75-94: LGTM! Improved input removal with deferred cleanup.The refactored logic correctly collects inputs to remove and defers their removal until after the new spec is processed, avoiding premature disconnections.
98-161: LGTM! Robust input reordering and re-linking.The updated logic properly:
- Tracks insertion points for widgets and inputs
- Reuses existing inputs when types are compatible
- Maintains connection integrity during restructuring
185-201: LGTM! Clean dynamic input registry and dispatcher.The
dynamicInputsregistry andapplyDynamicInputsfunction provide a clean extension point for dynamic input types.
217-245: LGTM! Proper type change propagation with cleanup.The
changeOutputTypefunction correctly validates connections after type changes and disconnects incompatible links while triggering appropriate callbacks.
247-269: LGTM! Solid type intersection logic.The
combineTypesandintersectionfunctions properly handle wildcard types and compute valid type intersections.
271-335: LGTM! Comprehensive match-type implementation.The
withComfyMatchTypefunction properly:
- Augments nodes with match-type state
- Chains connection change handlers
- Updates input/output types based on connected types
- Validates type compatibility
337-358: LGTM! Clean match-type application.The
applyMatchTypefunction correctly initializes match-type inputs and triggers the connection change logic.
360-412: LGTM! Well-structured autogrow initialization.The
applyAutogrowfunction properly:
- Validates autogrow specs
- Transforms input specs to v2 format
- Creates helper functions for input management
- Initializes minimum required input groups
413-431: LGTM! Clean input group removal.The
removeInputGroupfunction correctly removes inputs and associated widgets while maintaining tracked state.
433-448: LGTM! Proper growth logic with max constraint.The
inputConnectedfunction correctly adds new input groups when the last group is connected, respecting the maximum limit.
450-482: LGTM! Robust shrink logic with link migration.The
inputDisconnectedfunction properly:
- Preserves minimum groups
- Migrates links from removed groups to previous groups
- Removes trailing empty groups
484-516: LGTM! Clean connection lifecycle management.The autogrow connection handlers properly:
- Track pending connections to distinguish new connections from link swaps
- Chain with existing callbacks
- Trigger growth/shrinkage asynchronously
202-215: Now I have all the information needed. The review comment's concern is partially correct but misfocused. The real issue is about deprecated API usage, not just about access pattern consistency.Migrate to Map.get() for links access; indexed access is deprecated.
Lines 228, 304, and 471 use deprecated indexed access (
graph.links[id]) which is marked for removal. Line 211 correctly uses the recommended Map method.get(). The codebase has marked indexed property access as deprecated with a note that "backwards compatibility with a Proxy has been added, but will eventually be removed" (see LGraph.ts comment around line 161).Replace index-style access at lines 228, 304, and 471 with
.get()calls to be consistent with line 211 and forward-compatible:
- Line 228: Change
node.graph.links[link_id]tonode.graph.links.get(link_id)- Line 304: Change
this.graph!.links[inp.link]tothis.graph!.links.get(inp.link)- Line 471: Change
node.graph?.links?.[linkId]tonode.graph?.links?.get(linkId)β Skipped due to learnings
Learnt from: CR Repo: Comfy-Org/ComfyUI_frontend PR: 0 File: src/lib/litegraph/CLAUDE.md:0-0 Timestamp: 2025-11-24T19:47:56.371Z Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Do not replace `&&=` or `||=` with `=` when there is no reason to do so. If you do find a reason to remove either `&&=` or `||=`, leave a comment explaining why the removal occurredLearnt from: CR Repo: Comfy-Org/ComfyUI_frontend PR: 0 File: src/lib/litegraph/CLAUDE.md:0-0 Timestamp: 2025-11-24T19:47:56.371Z Learning: Applies to src/lib/litegraph/**/*.{js,ts,jsx,tsx} : Take advantage of `TypedArray` `subarray` when appropriate
Comment @coderabbitai help to get the list of available commands and usage tips.
π¨ Storybook Build Status
β Build completed successfully!
β° Completed at: 11/26/2025, 10:26:21 PM UTC
π Links
π Your Storybook is ready for review!
π Playwright Test Results
β οΈ Tests passed with flaky tests
β° Completed at: 11/26/2025, 10:35:00 PM UTC
π Summary
- Total Tests: 494
- Passed: 481 β
- Failed: 0
- Flaky: 4 β οΈ
- Skipped: 9 βοΈ
π Test Reports by Browser
- β chromium: View Report β’ β 472 / β 0 / β οΈ 4 / βοΈ 9
- β chromium-2x: View Report β’ β 2 / β 0 / β οΈ 0 / βοΈ 0
- β chromium-0.5x: View Report β’ β 1 / β 0 / β οΈ 0 / βοΈ 0
- β mobile-chrome: View Report β’ β 6 / β 0 / β οΈ 0 / βοΈ 0
π Click on the links above to view detailed test results for each browser configuration.
Bundle Size Report
Summary
- Raw size: 17 MB baseline 17 MB β :red_circle: +7.81 kB
- Gzip: 3.37 MB baseline 3.37 MB β :red_circle: +1.8 kB
- Brotli: 2.58 MB baseline 2.58 MB β :red_circle: +987 B
- Bundles: 93 current β’ 93 baseline β’ 52 added / 52 removed
Category Glance App Entry Points :red_circle: +7.81 kB (3.19 MB) Β· Vendor & Third-Party :white_circle: 0 B (8.56 MB) Β· Other :white_circle: 0 B (3.84 MB) Β· Graph Workspace :white_circle: 0 B (944 kB) Β· Panels & Settings :white_circle: 0 B (298 kB) Β· UI Components :white_circle: 0 B (138 kB) Β· + 3 more
Per-category breakdown
App Entry Points β 3.19 MB (baseline 3.18 MB) β’ :red_circle: +7.81 kB
Main entry bundles and manifests
| File | Before | After | Ξ Raw | Ξ Gzip | Ξ Brotli |
|---|---|---|---|---|---|
| assets/index-pY6eQLuB.js (new) | β | 2.96 MB | :red_circle: +2.96 MB | :red_circle: +618 kB | :red_circle: +469 kB |
| ~~assets/index-CM3wRx8R.js~~ (removed) | 2.95 MB | β | :green_circle: -2.95 MB | :green_circle: -615 kB | :green_circle: -467 kB |
| ~~assets/index-J6vsBKQ5.js~~ (removed) | 227 kB | β | :green_circle: -227 kB | :green_circle: -48.6 kB | :green_circle: -40 kB |
| assets/index-BGsBT3fc.js (new) | β | 222 kB | :red_circle: +222 kB | :red_circle: +47.3 kB | :red_circle: +39 kB |
| assets/index-C-c6Ni8H.js (new) | β | 345 B | :red_circle: +345 B | :red_circle: +244 B | :red_circle: +201 B |
| ~~assets/index-CrnSgeIi.js~~ (removed) | 345 B | β | :green_circle: -345 B | :green_circle: -243 B | :green_circle: -221 B |
Status: 3 added / 3 removed
Graph Workspace β 944 kB (baseline 944 kB) β’ :white_circle: 0 B
Graph editor runtime, canvas, workflow orchestration
| File | Before | After | Ξ Raw | Ξ Gzip | Ξ Brotli |
|---|---|---|---|---|---|
| assets/GraphView-BQq04Sh8.js (new) | β | 944 kB | :red_circle: +944 kB | :red_circle: +183 kB | :red_circle: +140 kB |
| ~~assets/GraphView-DkL6ca5A.js~~ (removed) | 944 kB | β | :green_circle: -944 kB | :green_circle: -183 kB | :green_circle: -140 kB |
Status: 1 added / 1 removed
Views & Navigation β 6.54 kB (baseline 6.54 kB) β’ :white_circle: 0 B
Top-level views, pages, and routed surfaces
| File | Before | After | Ξ Raw | Ξ Gzip | Ξ Brotli |
|---|---|---|---|---|---|
| assets/UserSelectView-DlGIRimQ.js (new) | β | 6.54 kB | :red_circle: +6.54 kB | :red_circle: +2.14 kB | :red_circle: +1.9 kB |
| ~~assets/UserSelectView-U64ogSAu.js~~ (removed) | 6.54 kB | β | :green_circle: -6.54 kB | :green_circle: -2.14 kB | :green_circle: -1.9 kB |
Status: 1 added / 1 removed
Panels & Settings β 298 kB (baseline 298 kB) β’ :white_circle: 0 B
Configuration panels, inspectors, and settings screens
| File | Before | After | Ξ Raw | Ξ Gzip | Ξ Brotli |
|---|---|---|---|---|---|
| ~~assets/CreditsPanel-BGjmaYft.js~~ (removed) | 21.4 kB | β | :green_circle: -21.4 kB | :green_circle: -5.15 kB | :green_circle: -4.5 kB |
| assets/CreditsPanel-DIqOMJEC.js (new) | β | 21.4 kB | :red_circle: +21.4 kB | :red_circle: +5.15 kB | :red_circle: +4.5 kB |
| ~~assets/KeybindingPanel-C5z17hHr.js~~ (removed) | 13.6 kB | β | :green_circle: -13.6 kB | :green_circle: -3.42 kB | :green_circle: -3.01 kB |
| assets/KeybindingPanel-xpP9m_7T.js (new) | β | 13.6 kB | :red_circle: +13.6 kB | :red_circle: +3.42 kB | :red_circle: +3.01 kB |
| ~~assets/ExtensionPanel-CG67aVES.js~~ (removed) | 10.4 kB | β | :green_circle: -10.4 kB | :green_circle: -2.48 kB | :green_circle: -2.16 kB |
| assets/ExtensionPanel-YAaIgdEO.js (new) | β | 10.4 kB | :red_circle: +10.4 kB | :red_circle: +2.48 kB | :red_circle: +2.17 kB |
| ~~assets/AboutPanel-BitHWgN7.js~~ (removed) | 9.16 kB | β | :green_circle: -9.16 kB | :green_circle: -2.46 kB | :green_circle: -2.21 kB |
| assets/AboutPanel-BRMIyQ1t.js (new) | β | 9.16 kB | :red_circle: +9.16 kB | :red_circle: +2.46 kB | :red_circle: +2.21 kB |
| ~~assets/ServerConfigPanel-BGnjagu2.js~~ (removed) | 6.56 kB | β | :green_circle: -6.56 kB | :green_circle: -1.83 kB | :green_circle: -1.62 kB |
| assets/ServerConfigPanel-Bn0nehbu.js (new) | β | 6.56 kB | :red_circle: +6.56 kB | :red_circle: +1.83 kB | :red_circle: +1.63 kB |
| assets/UserPanel-BcNp4iFL.js (new) | β | 6.23 kB | :red_circle: +6.23 kB | :red_circle: +1.72 kB | :red_circle: +1.51 kB |
| ~~assets/UserPanel-fVMFMLKQ.js~~ (removed) | 6.23 kB | β | :green_circle: -6.23 kB | :green_circle: -1.72 kB | :green_circle: -1.5 kB |
| assets/settings-BXTtSH4O.js | 33.3 kB | 33.3 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/settings-C9Pzn-NG.js | 25.2 kB | 25.2 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/settings-CCy2fA_h.js | 27.3 kB | 27.3 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/settings-CQpqEFfl.js | 26.6 kB | 26.6 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/settings-DHcnxypw.js | 21.7 kB | 21.7 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/settings-DhFTK9fY.js | 25.1 kB | 25.1 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/settings-DlT4t_ui.js | 25.9 kB | 25.9 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/settings-DRgSrIdD.js | 24.2 kB | 24.2 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/settings-tjkeqiZq.js | 21.1 kB | 21.1 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
Status: 6 added / 6 removed
UI Components β 138 kB (baseline 138 kB) β’ :white_circle: 0 B
Reusable component library chunks
| File | Before | After | Ξ Raw | Ξ Gzip | Ξ Brotli |
|---|---|---|---|---|---|
| assets/Load3D.vue_vue_type_script_setup_true_lang-Bh_6syjA.js (new) | β | 53.9 kB | :red_circle: +53.9 kB | :red_circle: +8.52 kB | :red_circle: +7.32 kB |
| ~~assets/Load3D.vue_vue_type_script_setup_true_lang-CLCSZwHY.js~~ (removed) | 53.9 kB | β | :green_circle: -53.9 kB | :green_circle: -8.52 kB | :green_circle: -7.32 kB |
| ~~assets/WidgetSelect.vue_vue_type_script_setup_true_lang-_TotIMTM.js~~ (removed) | 46.9 kB | β | :green_circle: -46.9 kB | :green_circle: -10.1 kB | :green_circle: -8.76 kB |
| assets/WidgetSelect.vue_vue_type_script_setup_true_lang-CtZzIXPM.js (new) | β | 46.9 kB | :red_circle: +46.9 kB | :red_circle: +10.1 kB | :red_circle: +8.77 kB |
| assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-BzJV5u-Q.js (new) | β | 12.8 kB | :red_circle: +12.8 kB | :red_circle: +3.35 kB | :red_circle: +2.96 kB |
| ~~assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-C2iS5a8x.js~~ (removed) | 12.8 kB | β | :green_circle: -12.8 kB | :green_circle: -3.35 kB | :green_circle: -2.96 kB |
| assets/LazyImage.vue_vue_type_script_setup_true_lang-BI4bUxBu.js (new) | β | 10.8 kB | :red_circle: +10.8 kB | :red_circle: +2.97 kB | :red_circle: +2.59 kB |
| ~~assets/LazyImage.vue_vue_type_script_setup_true_lang-DfYZUWfZ.js~~ (removed) | 10.8 kB | β | :green_circle: -10.8 kB | :green_circle: -2.98 kB | :green_circle: -2.6 kB |
| assets/ComfyQueueButton-9sEqsdwj.js (new) | β | 7.73 kB | :red_circle: +7.73 kB | :red_circle: +2.2 kB | :red_circle: +1.95 kB |
| ~~assets/ComfyQueueButton-CUDA53S9.js~~ (removed) | 7.73 kB | β | :green_circle: -7.73 kB | :green_circle: -2.2 kB | :green_circle: -1.95 kB |
| assets/WidgetButton-BJwMQUy4.js (new) | β | 2.04 kB | :red_circle: +2.04 kB | :red_circle: +929 B | :red_circle: +810 B |
| ~~assets/WidgetButton-D0RxLHdl.js~~ (removed) | 2.04 kB | β | :green_circle: -2.04 kB | :green_circle: -931 B | :green_circle: -811 B |
| ~~assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-BdcB0N2p.js~~ (removed) | 2 kB | β | :green_circle: -2 kB | :green_circle: -772 B | :green_circle: -673 B |
| assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-C2Oi90lY.js (new) | β | 2 kB | :red_circle: +2 kB | :red_circle: +773 B | :red_circle: +677 B |
| ~~assets/UserAvatar.vue_vue_type_script_setup_true_lang-lBvEY_Sb.js~~ (removed) | 1.34 kB | β | :green_circle: -1.34 kB | :green_circle: -688 B | :green_circle: -593 B |
| assets/UserAvatar.vue_vue_type_script_setup_true_lang-LGT2k2Kx.js (new) | β | 1.34 kB | :red_circle: +1.34 kB | :red_circle: +688 B | :red_circle: +591 B |
| ~~assets/MediaTitle.vue_vue_type_script_setup_true_lang-D2bKwiYb.js~~ (removed) | 897 B | β | :green_circle: -897 B | :green_circle: -505 B | :green_circle: -435 B |
| assets/MediaTitle.vue_vue_type_script_setup_true_lang-oao_lJd-.js (new) | β | 897 B | :red_circle: +897 B | :red_circle: +502 B | :red_circle: +443 B |
Status: 9 added / 9 removed
Data & Services β 12.5 kB (baseline 12.5 kB) β’ :white_circle: 0 B
Stores, services, APIs, and repositories
| File | Before | After | Ξ Raw | Ξ Gzip | Ξ Brotli |
|---|---|---|---|---|---|
| assets/keybindingService-D9jNSOpR.js (new) | β | 7.51 kB | :red_circle: +7.51 kB | :red_circle: +1.83 kB | :red_circle: +1.58 kB |
| ~~assets/keybindingService-iviyKE5-.js~~ (removed) | 7.51 kB | β | :green_circle: -7.51 kB | :green_circle: -1.84 kB | :green_circle: -1.58 kB |
| ~~assets/serverConfigStore-BHFq9bew.js~~ (removed) | 2.83 kB | β | :green_circle: -2.83 kB | :green_circle: -909 B | :green_circle: -789 B |
| assets/serverConfigStore-Dyl2H1OJ.js (new) | β | 2.83 kB | :red_circle: +2.83 kB | :red_circle: +910 B | :red_circle: +795 B |
| ~~assets/audioService-B-200UHc.js~~ (removed) | 2.2 kB | β | :green_circle: -2.2 kB | :green_circle: -962 B | :green_circle: -823 B |
| assets/audioService-B0H2J7PK.js (new) | β | 2.2 kB | :red_circle: +2.2 kB | :red_circle: +964 B | :red_circle: +834 B |
Status: 3 added / 3 removed
Utilities & Hooks β 2.94 kB (baseline 2.94 kB) β’ :white_circle: 0 B
Helpers, composables, and utility bundles
| File | Before | After | Ξ Raw | Ξ Gzip | Ξ Brotli |
|---|---|---|---|---|---|
| ~~assets/audioUtils-BYLEjmY_.js~~ (removed) | 1.41 kB | β | :green_circle: -1.41 kB | :green_circle: -652 B | :green_circle: -543 B |
| assets/audioUtils-t03MKoG5.js (new) | β | 1.41 kB | :red_circle: +1.41 kB | :red_circle: +651 B | :red_circle: +546 B |
| assets/mathUtil-CTARWQ-l.js | 1.07 kB | 1.07 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/nodeFilterUtil-CXKCRJ-m.js | 460 B | 460 B | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
Status: 1 added / 1 removed
Vendor & Third-Party β 8.56 MB (baseline 8.56 MB) β’ :white_circle: 0 B
External libraries and shared vendor chunks
| File | Before | After | Ξ Raw | Ξ Gzip | Ξ Brotli |
|---|---|---|---|---|---|
| assets/vendor-other-CHtYrYG4.js (new) | β | 3.98 MB | :red_circle: +3.98 MB | :red_circle: +842 kB | :red_circle: +673 kB |
| ~~assets/vendor-other-D3dKDPA9.js~~ (removed) | 3.98 MB | β | :green_circle: -3.98 MB | :green_circle: -842 kB | :green_circle: -673 kB |
| assets/vendor-primevue-BPFe4rxs.js (new) | β | 1.96 MB | :red_circle: +1.96 MB | :red_circle: +336 kB | :red_circle: +202 kB |
| ~~assets/vendor-primevue-oJ2MsX9s.js~~ (removed) | 1.96 MB | β | :green_circle: -1.96 MB | :green_circle: -336 kB | :green_circle: -202 kB |
| ~~assets/vendor-chart--ViqMbDH.js~~ (removed) | 452 kB | β | :green_circle: -452 kB | :green_circle: -99.1 kB | :green_circle: -81 kB |
| assets/vendor-chart-Uku4MoHb.js (new) | β | 452 kB | :red_circle: +452 kB | :red_circle: +99.1 kB | :red_circle: +81.1 kB |
| assets/vendor-tiptap-BJQ60VuL.js (new) | β | 232 kB | :red_circle: +232 kB | :red_circle: +45.7 kB | :red_circle: +37.7 kB |
| ~~assets/vendor-tiptap-DkSGWC41.js~~ (removed) | 232 kB | β | :green_circle: -232 kB | :green_circle: -45.7 kB | :green_circle: -37.7 kB |
| ~~assets/vendor-vue-Dcaw_-2x.js~~ (removed) | 160 kB | β | :green_circle: -160 kB | :green_circle: -37.3 kB | :green_circle: -31.6 kB |
| assets/vendor-vue-DZ-5RWG0.js (new) | β | 160 kB | :red_circle: +160 kB | :red_circle: +37.3 kB | :red_circle: +31.5 kB |
| assets/vendor-three-aR6ntw5X.js | 1.37 MB | 1.37 MB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/vendor-xterm-BZLod3g9.js | 407 kB | 407 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
Status: 5 added / 5 removed
Other β 3.84 MB (baseline 3.84 MB) β’ :white_circle: 0 B
Bundles that do not match a named category
| File | Before | After | Ξ Raw | Ξ Gzip | Ξ Brotli |
|---|---|---|---|---|---|
| assets/WidgetRecordAudio-Ch3Y0tKu.js (new) | β | 20.4 kB | :red_circle: +20.4 kB | :red_circle: +5.24 kB | :red_circle: +4.64 kB |
| ~~assets/WidgetRecordAudio-CHnrLOvr.js~~ (removed) | 20.4 kB | β | :green_circle: -20.4 kB | :green_circle: -5.24 kB | :green_circle: -4.63 kB |
| ~~assets/AudioPreviewPlayer-CrJbSc-N.js~~ (removed) | 13.5 kB | β | :green_circle: -13.5 kB | :green_circle: -3.4 kB | :green_circle: -3.04 kB |
| assets/AudioPreviewPlayer-o6SaBzVd.js (new) | β | 13.5 kB | :red_circle: +13.5 kB | :red_circle: +3.4 kB | :red_circle: +3.04 kB |
| ~~assets/WidgetGalleria-oHFNenAj.js~~ (removed) | 4.1 kB | β | :green_circle: -4.1 kB | :green_circle: -1.45 kB | :green_circle: -1.31 kB |
| assets/WidgetGalleria-w_r3nU-B.js (new) | β | 4.1 kB | :red_circle: +4.1 kB | :red_circle: +1.45 kB | :red_circle: +1.3 kB |
| assets/WidgetColorPicker-BQtQQUjb.js (new) | β | 3.41 kB | :red_circle: +3.41 kB | :red_circle: +1.38 kB | :red_circle: +1.23 kB |
| ~~assets/WidgetColorPicker-DuqwU0eC.js~~ (removed) | 3.41 kB | β | :green_circle: -3.41 kB | :green_circle: -1.38 kB | :green_circle: -1.22 kB |
| ~~assets/WidgetMarkdown-C5H0bcpb.js~~ (removed) | 3.1 kB | β | :green_circle: -3.1 kB | :green_circle: -1.29 kB | :green_circle: -1.13 kB |
| assets/WidgetMarkdown-EYPC1lpc.js (new) | β | 3.1 kB | :red_circle: +3.1 kB | :red_circle: +1.29 kB | :red_circle: +1.13 kB |
| assets/WidgetAudioUI-fbPSdJKB.js (new) | β | 2.82 kB | :red_circle: +2.82 kB | :red_circle: +1.12 kB | :red_circle: +1.04 kB |
| ~~assets/WidgetAudioUI-k78Iqydc.js~~ (removed) | 2.82 kB | β | :green_circle: -2.82 kB | :green_circle: -1.12 kB | :green_circle: -1.01 kB |
| ~~assets/MediaVideoTop-BFDrQq-5.js~~ (removed) | 2.76 kB | β | :green_circle: -2.76 kB | :green_circle: -1.05 kB | :green_circle: -904 B |
| assets/MediaVideoTop-kapao-Dp.js (new) | β | 2.76 kB | :red_circle: +2.76 kB | :red_circle: +1.05 kB | :red_circle: +896 B |
| ~~assets/WidgetChart-B2-gppzM.js~~ (removed) | 2.48 kB | β | :green_circle: -2.48 kB | :green_circle: -932 B | :green_circle: -818 B |
| assets/WidgetChart-KkWG7Z2c.js (new) | β | 2.48 kB | :red_circle: +2.48 kB | :red_circle: +933 B | :red_circle: +817 B |
| ~~assets/WidgetTextarea-B6Lp_mZj.js~~ (removed) | 2.48 kB | β | :green_circle: -2.48 kB | :green_circle: -1.01 kB | :green_circle: -888 B |
| assets/WidgetTextarea-BbYUzfqH.js (new) | β | 2.48 kB | :red_circle: +2.48 kB | :red_circle: +1.01 kB | :red_circle: +886 B |
| ~~assets/WidgetImageCompare-BOXn8KLW.js~~ (removed) | 2.21 kB | β | :green_circle: -2.21 kB | :green_circle: -749 B | :green_circle: -661 B |
| assets/WidgetImageCompare-DtuV4S4S.js (new) | β | 2.21 kB | :red_circle: +2.21 kB | :red_circle: +748 B | :red_circle: +661 B |
| ~~assets/WidgetInputText-BWSmCpjc.js~~ (removed) | 1.99 kB | β | :green_circle: -1.99 kB | :green_circle: -916 B | :green_circle: -851 B |
| assets/WidgetInputText-D0UsEdHU.js (new) | β | 1.99 kB | :red_circle: +1.99 kB | :red_circle: +917 B | :red_circle: +842 B |
| ~~assets/MediaImageTop-B_ZBEjC1.js~~ (removed) | 1.75 kB | β | :green_circle: -1.75 kB | :green_circle: -843 B | :green_circle: -718 B |
| assets/MediaImageTop-C3ZnArXi.js (new) | β | 1.75 kB | :red_circle: +1.75 kB | :red_circle: +843 B | :red_circle: +715 B |
| assets/WidgetToggleSwitch-BrfQeJTo.js (new) | β | 1.58 kB | :red_circle: +1.58 kB | :red_circle: +760 B | :red_circle: +668 B |
| ~~assets/WidgetToggleSwitch-C_oC_TUM.js~~ (removed) | 1.58 kB | β | :green_circle: -1.58 kB | :green_circle: -761 B | :green_circle: -666 B |
| ~~assets/MediaImageBottom--f740vVl.js~~ (removed) | 1.57 kB | β | :green_circle: -1.57 kB | :green_circle: -737 B | :green_circle: -649 B |
| assets/MediaImageBottom-B1zeKgAj.js (new) | β | 1.57 kB | :red_circle: +1.57 kB | :red_circle: +740 B | :red_circle: +644 B |
| assets/MediaAudioBottom-CfOFt7Gb.js (new) | β | 1.52 kB | :red_circle: +1.52 kB | :red_circle: +739 B | :red_circle: +660 B |
| ~~assets/MediaAudioBottom-DfzEzZ81.js~~ (removed) | 1.52 kB | β | :green_circle: -1.52 kB | :green_circle: -740 B | :green_circle: -656 B |
| ~~assets/MediaVideoBottom-B0L_gsnF.js~~ (removed) | 1.52 kB | β | :green_circle: -1.52 kB | :green_circle: -739 B | :green_circle: -653 B |
| assets/MediaVideoBottom-DeUsQ4Nd.js (new) | β | 1.52 kB | :red_circle: +1.52 kB | :red_circle: +737 B | :red_circle: +657 B |
| ~~assets/Media3DBottom-B1nNud0M.js~~ (removed) | 1.5 kB | β | :green_circle: -1.5 kB | :green_circle: -731 B | :green_circle: -652 B |
| assets/Media3DBottom-XRjfBAkh.js (new) | β | 1.5 kB | :red_circle: +1.5 kB | :red_circle: +730 B | :red_circle: +650 B |
| assets/Media3DTop-4fN38Efa.js (new) | β | 1.49 kB | :red_circle: +1.49 kB | :red_circle: +765 B | :red_circle: +653 B |
| ~~assets/Media3DTop-BYdNL2Ip.js~~ (removed) | 1.49 kB | β | :green_circle: -1.49 kB | :green_circle: -765 B | :green_circle: -653 B |
| assets/MediaAudioTop-C1R1QGPq.js (new) | β | 1.46 kB | :red_circle: +1.46 kB | :red_circle: +741 B | :red_circle: +617 B |
| ~~assets/MediaAudioTop-DqRKCSyG.js~~ (removed) | 1.46 kB | β | :green_circle: -1.46 kB | :green_circle: -740 B | :green_circle: -619 B |
| assets/WidgetSelect-92fxbMTD.js (new) | β | 655 B | :red_circle: +655 B | :red_circle: +343 B | :red_circle: +290 B |
| ~~assets/WidgetSelect-CADI8HK5.js~~ (removed) | 655 B | β | :green_circle: -655 B | :green_circle: -342 B | :green_circle: -289 B |
| ~~assets/WidgetInputNumber-CNM7KUHA.js~~ (removed) | 595 B | β | :green_circle: -595 B | :green_circle: -331 B | :green_circle: -278 B |
| assets/WidgetInputNumber-EN2-oKOE.js (new) | β | 595 B | :red_circle: +595 B | :red_circle: +330 B | :red_circle: +277 B |
| assets/Load3D-6DL1jAMU.js (new) | β | 424 B | :red_circle: +424 B | :red_circle: +267 B | :red_circle: +223 B |
| ~~assets/Load3D-BkzeEXGl.js~~ (removed) | 424 B | β | :green_circle: -424 B | :green_circle: -267 B | :green_circle: -223 B |
| assets/WidgetLegacy-BiuCNirm.js (new) | β | 364 B | :red_circle: +364 B | :red_circle: +235 B | :red_circle: +195 B |
| ~~assets/WidgetLegacy-DsepKb5m.js~~ (removed) | 364 B | β | :green_circle: -364 B | :green_circle: -236 B | :green_circle: -192 B |
| assets/commands-_s-RvhJR.js | 13.6 kB | 13.6 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/commands-BuUILW6P.js | 13 kB | 13 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/commands-BV4R6fLx.js | 14.9 kB | 14.9 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/commands-CLwPdnT6.js | 14.2 kB | 14.2 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/commands-CWMchBmd.js | 15.9 kB | 15.9 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/commands-DazTQhtc.js | 12.9 kB | 12.9 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/commands-DmWrOe93.js | 13.7 kB | 13.7 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/commands-DwiH7Kr6.js | 13.8 kB | 13.8 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/commands-mS3LCNPn.js | 14.5 kB | 14.5 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/main-5lOBdqcC.js | 84.5 kB | 84.5 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/main-BOCuaVpE.js | 73.4 kB | 73.4 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/main-ClrEFGUz.js | 72.4 kB | 72.4 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/main-CyNU0iQX.js | 99.3 kB | 99.3 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/main-D7gwLxft.js | 114 kB | 114 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/main-DC8o4BCt.js | 86.8 kB | 86.8 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/main-DKiesCV4.js | 94.3 kB | 94.3 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/main-Hq2q-OtB.js | 83.6 kB | 83.6 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/main-USAlAlnj.js | 82 kB | 82 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/nodeDefs-_Px5dSNW.js | 306 kB | 306 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/nodeDefs-7z21KPoS.js | 285 kB | 285 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/nodeDefs-BWKZzBPK.js | 346 kB | 346 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/nodeDefs-CGbgH4Yl.js | 320 kB | 320 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/nodeDefs-CjjjdWkV.js | 313 kB | 313 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/nodeDefs-CVrNtxvj.js | 288 kB | 288 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/nodeDefs-DLRSA0IK.js | 309 kB | 309 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/nodeDefs-DQV2gnwA.js | 372 kB | 372 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/nodeDefs-ofqLG5vz.js | 310 kB | 310 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
| assets/widgetPropFilter-BIbGSUAt.js | 1.28 kB | 1.28 kB | :white_circle: 0 B | :white_circle: 0 B | :white_circle: 0 B |
Status: 23 added / 23 removed
π§ Auto-fixes Applied
This PR has been automatically updated to fix linting and formatting issues.
β οΈ Important: Your local branch is now behind. Run git pull before making additional changes to avoid conflicts.
Changes made:
- ESLint auto-fixes
- Prettier formatting
Going to merge this as is and make a followup PR for additional changes.
This PR includes a change for how inputs added by dynamic combos are keyed. This change can cause workflows made with the current version of dynamic combos to break if loaded in the future. I want to push this change forward so that it isn't blocking any backend release of dynamic combos overlong.