From 557b2fdb0ef7ae91b242091452115f7016e5f78e Mon Sep 17 00:00:00 2001 From: Comfy Org PR Bot Date: Wed, 1 Oct 2025 12:40:53 +0800 Subject: [PATCH 01/12] 1.28.4 (#5875) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Patch version increment to 1.28.4 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5875-1-28-4-27f6d73d3650819f984ac83c971197b0) by [Unito](https://www.unito.io) Co-authored-by: AustinMroz <4284322+AustinMroz@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bdfdc0378..ee0f556cf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@comfyorg/comfyui-frontend", "private": true, - "version": "1.28.3", + "version": "1.28.4", "type": "module", "repository": "https://github.com/Comfy-Org/ComfyUI_frontend", "homepage": "https://comfy.org", From 1efc2233c52393691959e8f35d773cfc8a8a5110 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Wed, 1 Oct 2025 12:52:03 -0700 Subject: [PATCH 02/12] Fix Claude review workflow checkout ref (#5874) By default, in this case the checkout action will checkout to github's temporary merge base ref, which may include changes from the base branch when the base branch moves. This happened in this review: https://github.com/Comfy-Org/ComfyUI_frontend/pull/5866#pullrequestreview-3287366541 To prevent this, the PR's HEAD SHA was specified to be used specifically, keeping claude's reviews only looking at that PR's branch. --- .github/workflows/claude-pr-review.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/claude-pr-review.yml b/.github/workflows/claude-pr-review.yml index cf5439590..b85b5c771 100644 --- a/.github/workflows/claude-pr-review.yml +++ b/.github/workflows/claude-pr-review.yml @@ -53,6 +53,7 @@ jobs: uses: actions/checkout@v5 with: fetch-depth: 0 + ref: refs/pull/${{ github.event.pull_request.number }}/head - name: Install pnpm uses: pnpm/action-setup@v4 @@ -86,4 +87,4 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} COMMIT_SHA: ${{ github.event.pull_request.head.sha }} BASE_SHA: ${{ github.event.pull_request.base.sha }} - REPOSITORY: ${{ github.repository }} \ No newline at end of file + REPOSITORY: ${{ github.repository }} From fd757027a9d0d46ea572f74e8173ec5503aaea22 Mon Sep 17 00:00:00 2001 From: Christian Byrne Date: Wed, 1 Oct 2025 13:16:14 -0700 Subject: [PATCH 03/12] [ci] allow Claude review even when Playwright and Vitest checks have failed (#5882) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently the claude review action will be skipped if any tests have failed. This is not really necessary, it will be more efficient to allow claude to review while still waiting for tests. This accounts for scenario where there is an expected visual baseline change, but the PR author doesn't want to regenerate baselines until everything is approved and ready to merge (as generating right away before you know whether changes will be requested can be a hassle). ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5882-ci-allow-Claude-review-even-when-Playwright-and-Vitest-checks-have-failed-27f6d73d365081ccbcdaff7104edc2fd) by [Unito](https://www.unito.io) --- .github/workflows/claude-pr-review.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/claude-pr-review.yml b/.github/workflows/claude-pr-review.yml index b85b5c771..08ad70727 100644 --- a/.github/workflows/claude-pr-review.yml +++ b/.github/workflows/claude-pr-review.yml @@ -29,11 +29,9 @@ jobs: - name: Check if we should proceed id: check-status run: | - # Get all check runs for this commit - CHECK_RUNS=$(gh api repos/${{ github.repository }}/commits/${{ github.event.pull_request.head.sha }}/check-runs --jq '.check_runs[] | select(.name | test("lint-and-format|test|playwright-tests")) | {name, conclusion}') - - # Check if any required checks failed - if echo "$CHECK_RUNS" | grep -q '"conclusion": "failure"'; then + CHECK_RUNS=$(gh api repos/${{ github.repository }}/commits/${{ github.event.pull_request.head.sha }}/check-runs --jq '.check_runs[] | select(.name | test("lint-and-format")) | {name, conclusion}') + + if echo "$CHECK_RUNS" | grep -Eq '"conclusion": "(failure|cancelled|timed_out|action_required)"'; then echo "Some CI checks failed - skipping Claude review" echo "proceed=false" >> $GITHUB_OUTPUT else From d76b1abc46f1d9b38053af09591d8620484666a8 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Wed, 1 Oct 2025 13:27:14 -0700 Subject: [PATCH 04/12] Rename workflows to match workflow names (#5866) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary - rename each GitHub Actions workflow file so its filename matches the workflow `name` value for easier discovery ------ https://chatgpt.com/codex/tasks/task_e_68dc213f0a808330869ed73c27858eb9 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5866-Rename-workflows-to-match-workflow-names-27e6d73d36508103bca7ea2746f73a3b) by [Unito](https://www.unito.io) --- .github/workflows/{backport.yaml => auto-backport.yaml} | 0 .../workflows/{dev-release.yaml => create-dev-pypi-package.yaml} | 0 ...e-release-candidate-branch.yaml => create-release-branch.yaml} | 0 .github/workflows/{release.yaml => create-release-draft.yaml} | 0 .../{devtools-python.yaml => devtools-python-check.yaml} | 0 ...{pr-playwright-deploy.yaml => pr-playwright-deploy-forks.yaml} | 0 .../{pr-storybook-deploy.yaml => pr-storybook-deploy-forks.yaml} | 0 .../workflows/{chromatic.yaml => storybook-and-chromatic-ci.yaml} | 0 .github/workflows/{test-ui.yaml => tests-ci.yaml} | 0 ...e-registry-types.yaml => update-comfy-registry-api-types.yaml} | 0 ...e-manager-types.yaml => update-comfyui-manager-api-types.yaml} | 0 ....yaml => update-locales-for-given-custom-node-repository.yaml} | 0 .github/workflows/{i18n.yaml => update-locales.yaml} | 0 .../{i18n-node-defs.yaml => update-node-definitions-locales.yaml} | 0 ...{test-browser-exp.yaml => update-playwright-expectations.yaml} | 0 .github/workflows/{json-validate.yaml => validate-json.yaml} | 0 .github/workflows/{vitest.yaml => vitest-tests.yaml} | 0 17 files changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{backport.yaml => auto-backport.yaml} (100%) rename .github/workflows/{dev-release.yaml => create-dev-pypi-package.yaml} (100%) rename .github/workflows/{create-release-candidate-branch.yaml => create-release-branch.yaml} (100%) rename .github/workflows/{release.yaml => create-release-draft.yaml} (100%) rename .github/workflows/{devtools-python.yaml => devtools-python-check.yaml} (100%) rename .github/workflows/{pr-playwright-deploy.yaml => pr-playwright-deploy-forks.yaml} (100%) rename .github/workflows/{pr-storybook-deploy.yaml => pr-storybook-deploy-forks.yaml} (100%) rename .github/workflows/{chromatic.yaml => storybook-and-chromatic-ci.yaml} (100%) rename .github/workflows/{test-ui.yaml => tests-ci.yaml} (100%) rename .github/workflows/{update-registry-types.yaml => update-comfy-registry-api-types.yaml} (100%) rename .github/workflows/{update-manager-types.yaml => update-comfyui-manager-api-types.yaml} (100%) rename .github/workflows/{i18n-custom-nodes.yaml => update-locales-for-given-custom-node-repository.yaml} (100%) rename .github/workflows/{i18n.yaml => update-locales.yaml} (100%) rename .github/workflows/{i18n-node-defs.yaml => update-node-definitions-locales.yaml} (100%) rename .github/workflows/{test-browser-exp.yaml => update-playwright-expectations.yaml} (100%) rename .github/workflows/{json-validate.yaml => validate-json.yaml} (100%) rename .github/workflows/{vitest.yaml => vitest-tests.yaml} (100%) diff --git a/.github/workflows/backport.yaml b/.github/workflows/auto-backport.yaml similarity index 100% rename from .github/workflows/backport.yaml rename to .github/workflows/auto-backport.yaml diff --git a/.github/workflows/dev-release.yaml b/.github/workflows/create-dev-pypi-package.yaml similarity index 100% rename from .github/workflows/dev-release.yaml rename to .github/workflows/create-dev-pypi-package.yaml diff --git a/.github/workflows/create-release-candidate-branch.yaml b/.github/workflows/create-release-branch.yaml similarity index 100% rename from .github/workflows/create-release-candidate-branch.yaml rename to .github/workflows/create-release-branch.yaml diff --git a/.github/workflows/release.yaml b/.github/workflows/create-release-draft.yaml similarity index 100% rename from .github/workflows/release.yaml rename to .github/workflows/create-release-draft.yaml diff --git a/.github/workflows/devtools-python.yaml b/.github/workflows/devtools-python-check.yaml similarity index 100% rename from .github/workflows/devtools-python.yaml rename to .github/workflows/devtools-python-check.yaml diff --git a/.github/workflows/pr-playwright-deploy.yaml b/.github/workflows/pr-playwright-deploy-forks.yaml similarity index 100% rename from .github/workflows/pr-playwright-deploy.yaml rename to .github/workflows/pr-playwright-deploy-forks.yaml diff --git a/.github/workflows/pr-storybook-deploy.yaml b/.github/workflows/pr-storybook-deploy-forks.yaml similarity index 100% rename from .github/workflows/pr-storybook-deploy.yaml rename to .github/workflows/pr-storybook-deploy-forks.yaml diff --git a/.github/workflows/chromatic.yaml b/.github/workflows/storybook-and-chromatic-ci.yaml similarity index 100% rename from .github/workflows/chromatic.yaml rename to .github/workflows/storybook-and-chromatic-ci.yaml diff --git a/.github/workflows/test-ui.yaml b/.github/workflows/tests-ci.yaml similarity index 100% rename from .github/workflows/test-ui.yaml rename to .github/workflows/tests-ci.yaml diff --git a/.github/workflows/update-registry-types.yaml b/.github/workflows/update-comfy-registry-api-types.yaml similarity index 100% rename from .github/workflows/update-registry-types.yaml rename to .github/workflows/update-comfy-registry-api-types.yaml diff --git a/.github/workflows/update-manager-types.yaml b/.github/workflows/update-comfyui-manager-api-types.yaml similarity index 100% rename from .github/workflows/update-manager-types.yaml rename to .github/workflows/update-comfyui-manager-api-types.yaml diff --git a/.github/workflows/i18n-custom-nodes.yaml b/.github/workflows/update-locales-for-given-custom-node-repository.yaml similarity index 100% rename from .github/workflows/i18n-custom-nodes.yaml rename to .github/workflows/update-locales-for-given-custom-node-repository.yaml diff --git a/.github/workflows/i18n.yaml b/.github/workflows/update-locales.yaml similarity index 100% rename from .github/workflows/i18n.yaml rename to .github/workflows/update-locales.yaml diff --git a/.github/workflows/i18n-node-defs.yaml b/.github/workflows/update-node-definitions-locales.yaml similarity index 100% rename from .github/workflows/i18n-node-defs.yaml rename to .github/workflows/update-node-definitions-locales.yaml diff --git a/.github/workflows/test-browser-exp.yaml b/.github/workflows/update-playwright-expectations.yaml similarity index 100% rename from .github/workflows/test-browser-exp.yaml rename to .github/workflows/update-playwright-expectations.yaml diff --git a/.github/workflows/json-validate.yaml b/.github/workflows/validate-json.yaml similarity index 100% rename from .github/workflows/json-validate.yaml rename to .github/workflows/validate-json.yaml diff --git a/.github/workflows/vitest.yaml b/.github/workflows/vitest-tests.yaml similarity index 100% rename from .github/workflows/vitest.yaml rename to .github/workflows/vitest-tests.yaml From e9352f613e624bd261447ca64d47a28f75f340a7 Mon Sep 17 00:00:00 2001 From: Alexander Brown Date: Wed, 1 Oct 2025 16:47:34 -0700 Subject: [PATCH 05/12] fix: Remove extra arguments to checkout in favor of the GitHub defaults (#5883) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Should allow this action to run on fork PRs. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5883-fix-Remove-extra-arguments-to-checkout-in-favor-of-the-GitHub-defaults-27f6d73d365081a780f7cf4a5a62c368) by [Unito](https://www.unito.io) --------- Co-authored-by: GitHub Action --- .github/workflows/lint-and-format.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/lint-and-format.yaml b/.github/workflows/lint-and-format.yaml index d9904b0e0..8b63fe0fc 100644 --- a/.github/workflows/lint-and-format.yaml +++ b/.github/workflows/lint-and-format.yaml @@ -15,9 +15,7 @@ jobs: - name: Checkout PR uses: actions/checkout@v5 with: - token: ${{ secrets.GITHUB_TOKEN }} - ref: ${{ github.event.pull_request.head.ref }} - fetch-depth: 0 + ref: ${{ github.head_ref }} - name: Install pnpm uses: pnpm/action-setup@v4 From bf9659fb2c42a8cb8be6e21575998fb300fd70d6 Mon Sep 17 00:00:00 2001 From: Benjamin Lu Date: Wed, 1 Oct 2025 17:26:21 -0700 Subject: [PATCH 06/12] ci: fork-safe checkout for lint workflow (#5887) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use conditional ref to support forks and avoid checkout failures. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5887-ci-fork-safe-checkout-for-lint-workflow-2806d73d36508139b9effa6d18e1cadb) by [Unito](https://www.unito.io) --- .github/workflows/lint-and-format.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint-and-format.yaml b/.github/workflows/lint-and-format.yaml index 8b63fe0fc..abf90053c 100644 --- a/.github/workflows/lint-and-format.yaml +++ b/.github/workflows/lint-and-format.yaml @@ -15,7 +15,7 @@ jobs: - name: Checkout PR uses: actions/checkout@v5 with: - ref: ${{ github.head_ref }} + ref: ${{ !github.event.pull_request.head.repo.fork && github.head_ref || github.ref }} - name: Install pnpm uses: pnpm/action-setup@v4 @@ -100,4 +100,4 @@ jobs: owner: context.repo.owner, repo: context.repo.repo, body: '## ⚠️ Linting/Formatting Issues Found\n\nThis PR has linting or formatting issues that need to be fixed.\n\n**Since this PR is from a fork, auto-fix cannot be applied automatically.**\n\n### Option 1: Set up pre-commit hooks (recommended)\nRun this once to automatically format code on every commit:\n```bash\npnpm prepare\n```\n\n### Option 2: Fix manually\nRun these commands and push the changes:\n```bash\npnpm lint:fix\npnpm format\n```\n\nSee [CONTRIBUTING.md](https://github.com/Comfy-Org/ComfyUI_frontend/blob/main/CONTRIBUTING.md#git-pre-commit-hooks) for more details.' - }) \ No newline at end of file + }) From 20731fe3f0a3b986524485893b8f70ead7539c2b Mon Sep 17 00:00:00 2001 From: Terry Jia Date: Wed, 1 Oct 2025 21:31:49 -0400 Subject: [PATCH 07/12] pass nodeId to widget component (#5853) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary pass nodeId to widget component, which is a prerequirist for https://github.com/Comfy-Org/ComfyUI_frontend/pull/5765 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5853-pass-nodeData-to-widget-component-27e6d73d3650811e9e48ceb7c3a00545) by [Unito](https://www.unito.io) --- src/renderer/extensions/vueNodes/components/NodeWidgets.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/extensions/vueNodes/components/NodeWidgets.vue b/src/renderer/extensions/vueNodes/components/NodeWidgets.vue index 59f4fe3bf..a1a8bf3fa 100644 --- a/src/renderer/extensions/vueNodes/components/NodeWidgets.vue +++ b/src/renderer/extensions/vueNodes/components/NodeWidgets.vue @@ -45,6 +45,7 @@ :widget="widget.simplified" :model-value="widget.value" :readonly="readonly" + :node-id="nodeData?.id != null ? String(nodeData.id) : ''" class="flex-1" @update:model-value="widget.updateHandler" /> From 01b3aeae68093ce6e63d31b362aeea076cb0a90d Mon Sep 17 00:00:00 2001 From: Johnpaul Chiwetelu <49923152+Myestery@users.noreply.github.com> Date: Thu, 2 Oct 2025 02:34:58 +0100 Subject: [PATCH 08/12] Prune console.log() (#5867) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduce a no-console rule in ESLint configuration and remove existing console log statements throughout the codebase, replacing some with warnings or comments. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5867-Prune-console-log-27e6d73d365081bcbad8c36cfb5b258c) by [Unito](https://www.unito.io) --- eslint.config.ts | 7 +++ src/App.vue | 1 - src/components/widget/SampleModelSelector.vue | 10 +---- .../widget/layout/BaseModalLayout.stories.ts | 2 +- src/composables/node/useNodePricing.ts | 9 ---- src/lib/litegraph/src/LGraph.ts | 17 ++----- src/lib/litegraph/src/LGraphCanvas.ts | 2 +- src/lib/litegraph/src/LGraphNode.ts | 45 +++++++++---------- src/lib/litegraph/src/LiteGraphGlobal.ts | 15 +++---- src/lib/litegraph/src/canvas/LinkConnector.ts | 2 - .../src/subgraph/ExecutableNodeDTO.ts | 4 +- .../litegraph/src/subgraph/SubgraphInput.ts | 2 - .../src/subgraph/SubgraphInputNode.ts | 4 +- .../litegraph/src/subgraph/SubgraphNode.ts | 9 ++-- .../litegraph/src/subgraph/subgraphUtils.ts | 2 +- .../test/subgraph/ExecutableNodeDTO.test.ts | 6 --- .../components/AssetBrowserModal.stories.ts | 20 ++++----- .../assets/composables/useAssetBrowser.ts | 4 -- .../useAssetBrowserDialog.stories.ts | 1 - .../management/stores/workflowStore.ts | 4 -- .../WidgetInputNumberSlider.test.ts | 1 - src/services/gateway/registrySearchGateway.ts | 3 -- src/stores/executionStore.ts | 4 -- src/stores/extensionStore.ts | 2 +- src/stores/maintenanceTaskStore.ts | 1 - src/views/InstallView.stories.ts | 12 ++--- .../manager/button/PackUpdateButton.vue | 3 -- .../composables/useConflictDetection.ts | 9 ---- 28 files changed, 61 insertions(+), 140 deletions(-) diff --git a/eslint.config.ts b/eslint.config.ts index 899852248..359102bbc 100644 --- a/eslint.config.ts +++ b/eslint.config.ts @@ -90,6 +90,7 @@ export default defineConfig([ } ], 'unused-imports/no-unused-imports': 'error', + 'no-console': ['error', { allow: ['warn', 'error'] }], 'vue/no-v-html': 'off', // Enforce dark-theme: instead of dark: prefix 'vue/no-restricted-class': ['error', '/^dark:/'], @@ -207,5 +208,11 @@ export default defineConfig([ } ] } + }, + { + files: ['**/*.{test,spec,stories}.ts', '**/*.stories.vue'], + rules: { + 'no-console': 'off' + } } ]) diff --git a/src/App.vue b/src/App.vue index 0a8ec51c3..6f6f10a1e 100644 --- a/src/App.vue +++ b/src/App.vue @@ -44,7 +44,6 @@ const showContextMenu = (event: MouseEvent) => { onMounted(() => { // @ts-expect-error fixme ts strict error window['__COMFYUI_FRONTEND_VERSION__'] = config.app_version - console.log('ComfyUI Front-end version:', config.app_version) if (isElectron()) { document.addEventListener('contextmenu', showContextMenu) diff --git a/src/components/widget/SampleModelSelector.vue b/src/components/widget/SampleModelSelector.vue index e33f87ace..a9d9f35bb 100644 --- a/src/components/widget/SampleModelSelector.vue +++ b/src/components/widget/SampleModelSelector.vue @@ -127,7 +127,7 @@ diff --git a/src/components/widget/layout/BaseModalLayout.stories.ts b/src/components/widget/layout/BaseModalLayout.stories.ts index 5b012326d..26479aaba 100644 --- a/src/components/widget/layout/BaseModalLayout.stories.ts +++ b/src/components/widget/layout/BaseModalLayout.stories.ts @@ -86,7 +86,7 @@ const createStoryTemplate = (args: StoryArgs) => ({ const t = (k: string) => k const onClose = () => { - console.log('OnClose invoked') + // OnClose handler for story } provide(OnCloseKey, onClose) diff --git a/src/composables/node/useNodePricing.ts b/src/composables/node/useNodePricing.ts index 28cfeec78..82a66abc7 100644 --- a/src/composables/node/useNodePricing.ts +++ b/src/composables/node/useNodePricing.ts @@ -300,9 +300,6 @@ const apiNodeCosts: Record = const modeValue = String(modeWidget.value) const durationValue = String(durationWidget.value) const modelValue = String(modelWidget.value) - console.log('modelValue', modelValue) - console.log('modeValue', modeValue) - console.log('durationValue', durationValue) // Same pricing matrix as KlingTextToVideoNode if (modelValue.includes('v1-6') || modelValue.includes('v1-5')) { @@ -356,9 +353,6 @@ const apiNodeCosts: Record = const modeValue = String(modeWidget.value) const durationValue = String(durationWidget.value) const modelValue = String(modelWidget.value) - console.log('modelValue', modelValue) - console.log('modeValue', modeValue) - console.log('durationValue', durationValue) // Same pricing matrix as KlingTextToVideoNode if ( @@ -564,9 +558,6 @@ const apiNodeCosts: Record = const model = String(modelWidget.value) const resolution = String(resolutionWidget.value).toLowerCase() const duration = String(durationWidget.value) - console.log('model', model) - console.log('resolution', resolution) - console.log('duration', duration) if (model.includes('ray-flash-2')) { if (duration.includes('5s')) { diff --git a/src/lib/litegraph/src/LGraph.ts b/src/lib/litegraph/src/LGraph.ts index 139919c60..a1e84d60f 100644 --- a/src/lib/litegraph/src/LGraph.ts +++ b/src/lib/litegraph/src/LGraph.ts @@ -274,8 +274,6 @@ export class LGraph * @param o data from previous serialization [optional] */ constructor(o?: ISerialisedGraph | SerialisableGraph) { - if (LiteGraph.debug) console.log('Graph created') - /** @see MapProxyHandler */ const links = this._links MapProxyHandler.bindAllMethods(links) @@ -532,7 +530,7 @@ export class LGraph this.errors_in_execution = true if (LiteGraph.throw_errors) throw error - if (LiteGraph.debug) console.log('Error during execution:', error) + if (LiteGraph.debug) console.error('Error during execution:', error) this.stop() } } @@ -1167,7 +1165,7 @@ export class LGraph const ctor = LiteGraph.registered_node_types[node.type] if (node.constructor == ctor) continue - console.log('node being replaced by newer version:', node.type) + console.warn('node being replaced by newer version:', node.type) const newnode = LiteGraph.createNode(node.type) if (!newnode) continue _nodes[i] = newnode @@ -1229,9 +1227,6 @@ export class LGraph /* Called when something visually changed (not the graph!) */ change(): void { - if (LiteGraph.debug) { - console.log('Graph changed') - } this.canvasAction((c) => c.setDirty(true, true)) this.on_change?.(this) } @@ -1626,12 +1621,6 @@ export class LGraph } else { throw new TypeError('Subgraph input node is not a SubgraphInput') } - console.debug( - 'Reconnect input links in parent graph', - { ...link }, - this.links.get(link.id), - this.links.get(link.id) === link - ) for (const resolved of others) { resolved.link.disconnect(this) @@ -2233,7 +2222,7 @@ export class LGraph let node = LiteGraph.createNode(String(n_info.type), n_info.title) if (!node) { if (LiteGraph.debug) - console.log('Node not found or has errors:', n_info.type) + console.warn('Node not found or has errors:', n_info.type) // in case of error we create a replacement node to avoid losing info node = new LGraphNode('') diff --git a/src/lib/litegraph/src/LGraphCanvas.ts b/src/lib/litegraph/src/LGraphCanvas.ts index 22b71c66a..dab92a270 100644 --- a/src/lib/litegraph/src/LGraphCanvas.ts +++ b/src/lib/litegraph/src/LGraphCanvas.ts @@ -6406,7 +6406,7 @@ export class LGraphCanvas return true } - console.log(`failed creating ${nodeNewType}`) + console.error(`failed creating ${nodeNewType}`) } } return false diff --git a/src/lib/litegraph/src/LGraphNode.ts b/src/lib/litegraph/src/LGraphNode.ts index a1eeb8ae2..c657526a9 100644 --- a/src/lib/litegraph/src/LGraphNode.ts +++ b/src/lib/litegraph/src/LGraphNode.ts @@ -1950,7 +1950,7 @@ export class LGraphNode try { this.removeWidget(widget) } catch (error) { - console.debug('Failed to remove widget', error) + console.error('Failed to remove widget', error) } } @@ -2583,12 +2583,7 @@ export class LGraphNode if (slotIndex !== undefined) return this.connect(slot, target_node, slotIndex, optsIn?.afterRerouteId) - console.debug( - '[connectByType]: no way to connect type:', - target_slotType, - 'to node:', - target_node - ) + // No compatible slot found - connection not possible return null } @@ -2621,7 +2616,7 @@ export class LGraphNode if (slotIndex !== undefined) return source_node.connect(slotIndex, this, slot, optsIn?.afterRerouteId) - console.debug( + console.error( '[connectByType]: no way to connect type:', source_slotType, 'to node:', @@ -2661,7 +2656,7 @@ export class LGraphNode if (!graph) { // could be connected before adding it to a graph // due to link ids being associated with graphs - console.log( + console.error( "Connect: Error, node doesn't belong to any graph. Nodes must be added first to a graph before connecting them." ) return null @@ -2672,11 +2667,12 @@ export class LGraphNode slot = this.findOutputSlot(slot) if (slot == -1) { if (LiteGraph.debug) - console.log(`Connect: Error, no slot of name ${slot}`) + console.error(`Connect: Error, no slot of name ${slot}`) return null } } else if (!outputs || slot >= outputs.length) { - if (LiteGraph.debug) console.log('Connect: Error, slot number not found') + if (LiteGraph.debug) + console.error('Connect: Error, slot number not found') return null } @@ -2696,7 +2692,7 @@ export class LGraphNode targetIndex = target_node.findInputSlot(target_slot) if (targetIndex == -1) { if (LiteGraph.debug) - console.log(`Connect: Error, no slot of name ${targetIndex}`) + console.error(`Connect: Error, no slot of name ${targetIndex}`) return null } } else if (target_slot === LiteGraph.EVENT) { @@ -2728,7 +2724,8 @@ export class LGraphNode !target_node.inputs || targetIndex >= target_node.inputs.length ) { - if (LiteGraph.debug) console.log('Connect: Error, slot number not found') + if (LiteGraph.debug) + console.error('Connect: Error, slot number not found') return null } @@ -2955,11 +2952,12 @@ export class LGraphNode slot = this.findOutputSlot(slot) if (slot == -1) { if (LiteGraph.debug) - console.log(`Connect: Error, no slot of name ${slot}`) + console.error(`Connect: Error, no slot of name ${slot}`) return false } } else if (!this.outputs || slot >= this.outputs.length) { - if (LiteGraph.debug) console.log('Connect: Error, slot number not found') + if (LiteGraph.debug) + console.error('Connect: Error, slot number not found') return false } @@ -3075,19 +3073,19 @@ export class LGraphNode slot = this.findInputSlot(slot) if (slot == -1) { if (LiteGraph.debug) - console.log(`Connect: Error, no slot of name ${slot}`) + console.error(`Connect: Error, no slot of name ${slot}`) return false } } else if (!this.inputs || slot >= this.inputs.length) { if (LiteGraph.debug) { - console.log('Connect: Error, slot number not found') + console.error('Connect: Error, slot number not found') } return false } const input = this.inputs[slot] if (!input) { - console.debug('disconnectInput: input not found', slot, this.inputs) + console.error('disconnectInput: input not found', slot, this.inputs) return false } @@ -3116,19 +3114,16 @@ export class LGraphNode const target_node = graph.getNodeById(link_info.origin_id) if (!target_node) { - console.debug( - 'disconnectInput: target node not found', - link_info.origin_id + console.error( + 'disconnectInput: output not found', + link_info.origin_slot ) return false } const output = target_node.outputs[link_info.origin_slot] if (!output?.links?.length) { - console.debug( - 'disconnectInput: output not found', - link_info.origin_slot - ) + // Output not found - may have been removed return false } diff --git a/src/lib/litegraph/src/LiteGraphGlobal.ts b/src/lib/litegraph/src/LiteGraphGlobal.ts index 5d762799a..31ea68ed4 100644 --- a/src/lib/litegraph/src/LiteGraphGlobal.ts +++ b/src/lib/litegraph/src/LiteGraphGlobal.ts @@ -398,8 +398,6 @@ export class LiteGraphGlobal { throw 'Cannot register a simple object, it must be a class with a prototype' base_class.type = type - if (this.debug) console.log('Node registered:', type) - const classname = base_class.name const pos = type.lastIndexOf('/') @@ -415,7 +413,7 @@ export class LiteGraphGlobal { const prev = this.registered_node_types[type] if (prev && this.debug) { - console.log('replacing node type:', type) + console.warn('replacing node type:', type) } this.registered_node_types[type] = base_class @@ -524,7 +522,7 @@ export class LiteGraphGlobal { ): LGraphNode | null { const base_class = this.registered_node_types[type] if (!base_class) { - if (this.debug) console.log(`GraphNode type "${type}" not registered.`) + if (this.debug) console.warn(`GraphNode type "${type}" not registered.`) return null } @@ -637,7 +635,6 @@ export class LiteGraphGlobal { continue try { - if (this.debug) console.log('Reloading:', src) const dynamicScript = document.createElement('script') dynamicScript.type = 'text/javascript' dynamicScript.src = src @@ -645,11 +642,9 @@ export class LiteGraphGlobal { script_file.remove() } catch (error) { if (this.throw_errors) throw error - if (this.debug) console.log('Error while reloading', src) + if (this.debug) console.error('Error while reloading', src) } } - - if (this.debug) console.log('Nodes reloaded') } // separated just to improve if it doesn't work @@ -749,7 +744,7 @@ export class LiteGraphGlobal { // convert pointerevents to touch event when not available if (sMethod == 'pointer' && !window.PointerEvent) { console.warn("sMethod=='pointer' && !window.PointerEvent") - console.log( + console.warn( `Converting pointer[${sEvent}] : down move up cancel enter TO touchstart touchmove touchend, etc ..` ) switch (sEvent) { @@ -774,7 +769,7 @@ export class LiteGraphGlobal { break } case 'enter': { - console.log('debug: Should I send a move event?') // ??? + // TODO: Determine if a move event should be sent break } // case "over": case "out": not used at now diff --git a/src/lib/litegraph/src/canvas/LinkConnector.ts b/src/lib/litegraph/src/canvas/LinkConnector.ts index a70fd8752..50bf9a34f 100644 --- a/src/lib/litegraph/src/canvas/LinkConnector.ts +++ b/src/lib/litegraph/src/canvas/LinkConnector.ts @@ -906,7 +906,6 @@ export class LinkConnector { if (connectingTo === 'output') { // Dropping new output link const output = node.findOutputByType(firstLink.fromSlot.type)?.slot - console.debug('out', node, output, firstLink.fromSlot) if (output === undefined) { console.warn( `Could not find slot for link type: [${firstLink.fromSlot.type}].` @@ -918,7 +917,6 @@ export class LinkConnector { } else if (connectingTo === 'input') { // Dropping new input link const input = node.findInputByType(firstLink.fromSlot.type)?.slot - console.debug('in', node, input, firstLink.fromSlot) if (input === undefined) { console.warn( `Could not find slot for link type: [${firstLink.fromSlot.type}].` diff --git a/src/lib/litegraph/src/subgraph/ExecutableNodeDTO.ts b/src/lib/litegraph/src/subgraph/ExecutableNodeDTO.ts index 06da1a8d9..07f4d4cec 100644 --- a/src/lib/litegraph/src/subgraph/ExecutableNodeDTO.ts +++ b/src/lib/litegraph/src/subgraph/ExecutableNodeDTO.ts @@ -271,9 +271,9 @@ export class ExecutableNodeDTO implements ExecutableLGraphNode { // Bypass nodes by finding first input with matching type const matchingIndex = this.#getBypassSlotIndex(slot, type) - // No input types match + // No input types match - bypass not possible if (matchingIndex === -1) { - console.debug( + console.warn( `[ExecutableNodeDTO.resolveOutput] No input types match type [${type}] for id [${this.id}] slot [${slot}]`, this ) diff --git a/src/lib/litegraph/src/subgraph/SubgraphInput.ts b/src/lib/litegraph/src/subgraph/SubgraphInput.ts index 63465d2b5..939115513 100644 --- a/src/lib/litegraph/src/subgraph/SubgraphInput.ts +++ b/src/lib/litegraph/src/subgraph/SubgraphInput.ts @@ -175,8 +175,6 @@ export class SubgraphInput extends SubgraphSlot { } widgets.push(widget) - } else { - console.debug('No input found on link id', linkId, link) } } return widgets diff --git a/src/lib/litegraph/src/subgraph/SubgraphInputNode.ts b/src/lib/litegraph/src/subgraph/SubgraphInputNode.ts index d46e94654..6cc465ddf 100644 --- a/src/lib/litegraph/src/subgraph/SubgraphInputNode.ts +++ b/src/lib/litegraph/src/subgraph/SubgraphInputNode.ts @@ -188,7 +188,7 @@ export class SubgraphInputNode const subgraphInput = this.slots.at(subgraphInputIndex) if (!subgraphInput) { - console.debug( + console.warn( 'disconnectNodeInput: subgraphInput not found', this, subgraphInputIndex @@ -201,7 +201,7 @@ export class SubgraphInputNode if (index !== -1) { subgraphInput.linkIds.splice(index, 1) } else { - console.debug( + console.warn( 'disconnectNodeInput: link ID not found in subgraphInput linkIds', link.id ) diff --git a/src/lib/litegraph/src/subgraph/SubgraphNode.ts b/src/lib/litegraph/src/subgraph/SubgraphNode.ts index c10a343ad..f6d738d1e 100644 --- a/src/lib/litegraph/src/subgraph/SubgraphNode.ts +++ b/src/lib/litegraph/src/subgraph/SubgraphNode.ts @@ -430,7 +430,7 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph { const inputSlot = this.subgraph.inputNode.slots[slot] const innerLinks = inputSlot.getLinks() if (innerLinks.length === 0) { - console.debug( + console.warn( `[SubgraphNode.resolveSubgraphInputLinks] No inner links found for input slot [${slot}] ${inputSlot.name}`, this ) @@ -447,9 +447,10 @@ export class SubgraphNode extends LGraphNode implements BaseLGraph { resolveSubgraphOutputLink(slot: number): ResolvedConnection | undefined { const outputSlot = this.subgraph.outputNode.slots[slot] const innerLink = outputSlot.getLinks().at(0) - if (innerLink) return innerLink.resolve(this.subgraph) - - console.debug( + if (innerLink) { + return innerLink.resolve(this.subgraph) + } + console.warn( `[SubgraphNode.resolveSubgraphOutputLink] No inner link found for output slot [${slot}] ${outputSlot.name}`, this ) diff --git a/src/lib/litegraph/src/subgraph/subgraphUtils.ts b/src/lib/litegraph/src/subgraph/subgraphUtils.ts index c225dd7b8..ad957a048 100644 --- a/src/lib/litegraph/src/subgraph/subgraphUtils.ts +++ b/src/lib/litegraph/src/subgraph/subgraphUtils.ts @@ -116,7 +116,7 @@ export function getBoundaryLinks( const resolved = LLink.resolve(input.link, graph) if (!resolved) { - console.debug(`Failed to resolve link ID [${input.link}]`) + console.warn(`Failed to resolve link ID [${input.link}]`) continue } diff --git a/src/lib/litegraph/test/subgraph/ExecutableNodeDTO.test.ts b/src/lib/litegraph/test/subgraph/ExecutableNodeDTO.test.ts index 3f62ba991..acadc2580 100644 --- a/src/lib/litegraph/test/subgraph/ExecutableNodeDTO.test.ts +++ b/src/lib/litegraph/test/subgraph/ExecutableNodeDTO.test.ts @@ -426,7 +426,6 @@ describe('ExecutableNodeDTO Integration', () => { describe('ExecutableNodeDTO Scale Testing', () => { it('should create DTOs at scale', () => { const graph = new LGraph() - const startTime = performance.now() const dtos: ExecutableNodeDTO[] = [] // Create DTOs to test performance @@ -440,16 +439,11 @@ describe('ExecutableNodeDTO Scale Testing', () => { dtos.push(dto) } - const endTime = performance.now() - const duration = endTime - startTime - expect(dtos).toHaveLength(1000) // Test deterministic properties instead of flaky timing expect(dtos[0].id).toBe('parent:0') expect(dtos[999].id).toBe('parent:999') expect(dtos.every((dto, i) => dto.id === `parent:${i}`)).toBe(true) - - console.log(`Created 1000 DTOs in ${duration.toFixed(2)}ms`) }) it('should handle complex path generation correctly', () => { diff --git a/src/platform/assets/components/AssetBrowserModal.stories.ts b/src/platform/assets/components/AssetBrowserModal.stories.ts index f062fe71f..cad836ae3 100644 --- a/src/platform/assets/components/AssetBrowserModal.stories.ts +++ b/src/platform/assets/components/AssetBrowserModal.stories.ts @@ -57,12 +57,10 @@ export const Default: Story = { render: (args) => ({ components: { AssetBrowserModal }, setup() { - const onAssetSelect = (asset: AssetDisplayItem) => { - console.log('Selected asset:', asset) - } - const onClose = () => { - console.log('Modal closed') + const onAssetSelect = (_asset: AssetDisplayItem) => { + // Asset selection handler for story } + const onClose = () => {} return { ...args, @@ -97,11 +95,11 @@ export const SingleAssetType: Story = { render: (args) => ({ components: { AssetBrowserModal }, setup() { - const onAssetSelect = (asset: AssetDisplayItem) => { - console.log('Selected asset:', asset) + const onAssetSelect = (_asset: AssetDisplayItem) => { + // Asset selection handler for story } const onClose = () => { - console.log('Modal closed') + // Modal close handler for story } // Create assets with only one type (checkpoints) @@ -146,11 +144,11 @@ export const NoLeftPanel: Story = { render: (args) => ({ components: { AssetBrowserModal }, setup() { - const onAssetSelect = (asset: AssetDisplayItem) => { - console.log('Selected asset:', asset) + const onAssetSelect = (_asset: AssetDisplayItem) => { + // Asset selection handler for story } const onClose = () => { - console.log('Modal closed') + // Modal close handler for story } return { ...args, onAssetSelect, onClose, assets: mockAssets } diff --git a/src/platform/assets/composables/useAssetBrowser.ts b/src/platform/assets/composables/useAssetBrowser.ts index 831b6c9ac..a567f75cb 100644 --- a/src/platform/assets/composables/useAssetBrowser.ts +++ b/src/platform/assets/composables/useAssetBrowser.ts @@ -198,10 +198,6 @@ export function useAssetBrowser(assets: AssetItem[] = []) { assetId: string, onSelect?: (filename: string) => void ): Promise { - if (import.meta.env.DEV) { - console.debug('Asset selected:', assetId) - } - if (!onSelect) { return } diff --git a/src/platform/assets/composables/useAssetBrowserDialog.stories.ts b/src/platform/assets/composables/useAssetBrowserDialog.stories.ts index e0095b619..c72cbccc8 100644 --- a/src/platform/assets/composables/useAssetBrowserDialog.stories.ts +++ b/src/platform/assets/composables/useAssetBrowserDialog.stories.ts @@ -29,7 +29,6 @@ const DialogDemoComponent = { } const handleAssetSelected = (assetPath: string) => { - console.log('Asset selected:', assetPath) alert(`Selected asset: ${assetPath}`) isDialogOpen.value = false // Auto-close like the real composable } diff --git a/src/platform/workflow/management/stores/workflowStore.ts b/src/platform/workflow/management/stores/workflowStore.ts index 02b48c55b..dc9cd07c0 100644 --- a/src/platform/workflow/management/stores/workflowStore.ts +++ b/src/platform/workflow/management/stores/workflowStore.ts @@ -87,7 +87,6 @@ export class ComfyWorkflow extends UserFile { } // Note: originalContent is populated by super.load() - console.debug('load and start tracking of workflow', this.path) this.changeTracker = markRaw( new ChangeTracker( this, @@ -98,7 +97,6 @@ export class ComfyWorkflow extends UserFile { } override unload(): void { - console.debug('unload workflow', this.path) this.changeTracker = null super.unload() } @@ -302,7 +300,6 @@ export const useWorkflowStore = defineStore('workflow', () => { const loadedWorkflow = await workflow.load() activeWorkflow.value = loadedWorkflow comfyApp.canvas.bg_tint = loadedWorkflow.tintCanvasBg - console.debug('[workflowStore] open workflow', workflow.path) return loadedWorkflow } @@ -379,7 +376,6 @@ export const useWorkflowStore = defineStore('workflow', () => { } else { workflow.unload() } - console.debug('[workflowStore] close workflow', workflow.path) } /** diff --git a/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.test.ts b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.test.ts index 828029e89..bd9ada8af 100644 --- a/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.test.ts +++ b/src/renderer/extensions/vueNodes/widgets/components/WidgetInputNumberSlider.test.ts @@ -86,7 +86,6 @@ describe('WidgetInputNumberSlider Value Binding', () => { it('renders input field', () => { const widget = createMockWidget(5) const wrapper = mountComponent(widget, 5) - console.log(wrapper.html()) expect(wrapper.find('input[inputmode="numeric"]').exists()).toBe(true) }) diff --git a/src/services/gateway/registrySearchGateway.ts b/src/services/gateway/registrySearchGateway.ts index 834e730a8..5714d661e 100644 --- a/src/services/gateway/registrySearchGateway.ts +++ b/src/services/gateway/registrySearchGateway.ts @@ -69,9 +69,6 @@ export const useRegistrySearchGateway = (): NodePackSearchProvider => { const timeSinceLastAttempt = Date.now() - providerState.lastAttempt.getTime() if (timeSinceLastAttempt > CIRCUIT_BREAKER_TIMEOUT) { - console.info( - `Retrying ${providerState.name} provider after circuit breaker timeout` - ) return true } } diff --git a/src/stores/executionStore.ts b/src/stores/executionStore.ts index 8791ab4e1..af482cc8a 100644 --- a/src/stores/executionStore.ts +++ b/src/stores/executionStore.ts @@ -404,10 +404,6 @@ export const useExecutionStore = defineStore('execution', () => { ...queuedPrompt.nodes } queuedPrompt.workflow = workflow - - console.debug( - `queued task ${id} with ${Object.values(queuedPrompt.nodes).length} nodes` - ) } /** diff --git a/src/stores/extensionStore.ts b/src/stores/extensionStore.ts index 3c1abde8e..b09b3b72f 100644 --- a/src/stores/extensionStore.ts +++ b/src/stores/extensionStore.ts @@ -65,7 +65,7 @@ export const useExtensionStore = defineStore('extension', () => { } if (disabledExtensionNames.value.has(extension.name)) { - console.log(`Extension ${extension.name} is disabled.`) + console.warn(`Extension ${extension.name} is disabled.`) } extensionByName.value[extension.name] = markRaw(extension) diff --git a/src/stores/maintenanceTaskStore.ts b/src/stores/maintenanceTaskStore.ts index b7d19f6c7..7ce4811cf 100644 --- a/src/stores/maintenanceTaskStore.ts +++ b/src/stores/maintenanceTaskStore.ts @@ -151,7 +151,6 @@ export const useMaintenanceTaskStore = defineStore('maintenanceTask', () => { /** @todo Refreshes Electron tasks only. */ const refreshDesktopTasks = async () => { isRefreshing.value = true - console.log('Refreshing desktop tasks') await electron.Validation.validateInstallation(processUpdate) } diff --git a/src/views/InstallView.stories.ts b/src/views/InstallView.stories.ts index 9a5c65e79..d66003831 100644 --- a/src/views/InstallView.stories.ts +++ b/src/views/InstallView.stories.ts @@ -48,16 +48,10 @@ const meta: Meta = { getDetectedGpu: () => Promise.resolve('mps') }, Events: { - trackEvent: (eventName: string, data?: any) => { - console.log('Track event:', eventName, data) - } - }, - installComfyUI: (options: any) => { - console.log('Install ComfyUI with options:', options) - }, - changeTheme: (theme: any) => { - console.log('Change theme:', theme) + trackEvent: (_eventName: string, _data?: any) => {} }, + installComfyUI: (_options: any) => {}, + changeTheme: (_theme: any) => {}, getSystemPaths: () => Promise.resolve({ defaultInstallPath: '/Users/username/ComfyUI' diff --git a/src/workbench/extensions/manager/components/manager/button/PackUpdateButton.vue b/src/workbench/extensions/manager/components/manager/button/PackUpdateButton.vue index f62efd7a3..abe55e087 100644 --- a/src/workbench/extensions/manager/components/manager/button/PackUpdateButton.vue +++ b/src/workbench/extensions/manager/components/manager/button/PackUpdateButton.vue @@ -61,15 +61,12 @@ const updateAllPacks = async () => { managerStore.isPackInstalled(pack.id) ) if (!updatablePacks.length) { - console.info('No installed packs available for update') isUpdating.value = false return } - console.info(`Starting update of ${updatablePacks.length} packs`) try { await Promise.all(updatablePacks.map(updatePack)) managerStore.updatePack.clear() - console.info('All packs updated successfully') } catch (error) { console.error('Pack update failed:', error) console.error( diff --git a/src/workbench/extensions/manager/composables/useConflictDetection.ts b/src/workbench/extensions/manager/composables/useConflictDetection.ts index af8e35e12..46eb4e7a2 100644 --- a/src/workbench/extensions/manager/composables/useConflictDetection.ts +++ b/src/workbench/extensions/manager/composables/useConflictDetection.ts @@ -364,10 +364,6 @@ export function useConflictDetection() { Object.entries(bulkResult).forEach(([packageId, failInfo]) => { if (failInfo !== null) { importFailures[packageId] = failInfo - console.debug( - `[ConflictDetection] Import failure found for ${packageId}:`, - failInfo - ) } }) @@ -496,11 +492,6 @@ export function useConflictDetection() { // Merge conflicts for packages with the same name const mergedConflicts = consolidateConflictsByPackage(conflictedResults) - console.debug( - '[ConflictDetection] Conflicts detected (stored for UI):', - mergedConflicts - ) - // Store merged conflicts in Pinia store for UI usage conflictStore.setConflictedPackages(mergedConflicts) From d0e81cdd3373e11c19432b003127f064768e7dfa Mon Sep 17 00:00:00 2001 From: Marcel Petrick Date: Thu, 2 Oct 2025 03:35:38 +0200 Subject: [PATCH 09/12] fix(docs): correct typos in comments and strings found during code view (#5880) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Non-functional changes only: - Fixed minor spelling mistakes in comments - Corrected typos in user-facing strings - No variables, logic, or functional code was modified. Signed-off-by: Marcel Petrick ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5880-fix-docs-correct-typos-in-comments-and-strings-found-during-code-view-27f6d73d3650815db62af6115991304a) by [Unito](https://www.unito.io) --------- Signed-off-by: Marcel Petrick Co-authored-by: Alexander Brown Co-authored-by: Benjamin Lu --- packages/design-system/src/css/style.css | 2 +- .../registry-types/src/comfyRegistryTypes.ts | 4 ++-- .../bottomPanel/tabs/terminal/LogsTerminal.vue | 2 +- src/constants/serverConfig.ts | 2 +- src/core/graph/subgraph/proxyWidget.ts | 2 +- src/extensions/core/webcamCapture.ts | 2 +- src/extensions/core/widgetInputs.ts | 6 +++--- src/lib/litegraph/README.md | 4 ++-- src/lib/litegraph/src/LGraph.ts | 2 +- src/lib/litegraph/src/LGraphCanvas.ts | 16 ++++++++-------- src/lib/litegraph/src/LGraphNode.ts | 10 +++++----- src/lib/litegraph/src/LiteGraphGlobal.ts | 6 +++--- .../litegraph/src/subgraph/ExecutableNodeDTO.ts | 4 ++-- src/lib/litegraph/src/types/serialisation.ts | 2 +- .../test/subgraph/SubgraphConversion.test.ts | 2 +- .../subgraph/SubgraphSlotVisualFeedback.test.ts | 2 +- src/platform/settings/constants/coreSettings.ts | 2 +- .../updates/components/WhatsNewPopup.vue | 2 +- .../validation/schemas/workflowSchema.ts | 2 +- .../vueNodes/composables/useNodeTooltips.ts | 4 ++-- .../widgets/composables/useImageUploadWidget.ts | 2 +- src/scripts/api.ts | 2 +- src/stores/electronDownloadStore.ts | 2 +- src/utils/executableGroupNodeChildDTO.ts | 2 +- src/utils/linkFixer.ts | 2 +- src/utils/searchAndReplace.ts | 2 +- .../subgraph/SubgraphConversion.test.ts | 2 +- .../subgraph/SubgraphSlotVisualFeedback.test.ts | 2 +- tests-ui/tests/widgets/proxyWidget.test.ts | 2 +- 29 files changed, 48 insertions(+), 48 deletions(-) diff --git a/packages/design-system/src/css/style.css b/packages/design-system/src/css/style.css index 0f2bca812..c2023633a 100644 --- a/packages/design-system/src/css/style.css +++ b/packages/design-system/src/css/style.css @@ -152,7 +152,7 @@ } } -/* Everthing below here to be cleaned up over time. */ +/* Everything below here to be cleaned up over time. */ body { width: 100vw; diff --git a/packages/registry-types/src/comfyRegistryTypes.ts b/packages/registry-types/src/comfyRegistryTypes.ts index 94c434ebd..32dc4f675 100644 --- a/packages/registry-types/src/comfyRegistryTypes.ts +++ b/packages/registry-types/src/comfyRegistryTypes.ts @@ -1125,7 +1125,7 @@ export interface paths { } get?: never put?: never - /** Create a new custom node using admin priviledge */ + /** Create a new custom node using admin privilege */ post: operations['adminCreateNode'] delete?: never options?: never @@ -16383,7 +16383,7 @@ export interface operations { } } responses: { - /** @description Webhook processed succesfully */ + /** @description Webhook processed successfully */ 200: { headers: { [name: string]: unknown diff --git a/src/components/bottomPanel/tabs/terminal/LogsTerminal.vue b/src/components/bottomPanel/tabs/terminal/LogsTerminal.vue index 68f643218..19b2fd6cc 100644 --- a/src/components/bottomPanel/tabs/terminal/LogsTerminal.vue +++ b/src/components/bottomPanel/tabs/terminal/LogsTerminal.vue @@ -69,7 +69,7 @@ const terminalCreated = ( await loadLogEntries() } catch (err) { console.error('Error loading logs', err) - // On older backends the endpoints wont exist + // On older backends the endpoints won't exist errorMessage.value = 'Unable to load logs, please ensure you have updated your ComfyUI backend.' return diff --git a/src/constants/serverConfig.ts b/src/constants/serverConfig.ts index 2ec27d180..64e655e3d 100644 --- a/src/constants/serverConfig.ts +++ b/src/constants/serverConfig.ts @@ -344,7 +344,7 @@ export const SERVER_CONFIG_ITEMS: ServerConfig[] = [ type: 'number', defaultValue: null, tooltip: - 'Set the amount of vram in GB you want to reserve for use by your OS/other software. By default some amount is reverved depending on your OS.' + 'Set the amount of vram in GB you want to reserve for use by your OS/other software. By default some amount is reserved depending on your OS.' }, // Misc settings diff --git a/src/core/graph/subgraph/proxyWidget.ts b/src/core/graph/subgraph/proxyWidget.ts index 8992995b2..c59fd203a 100644 --- a/src/core/graph/subgraph/proxyWidget.ts +++ b/src/core/graph/subgraph/proxyWidget.ts @@ -135,7 +135,7 @@ function addProxyFromOverlay(subgraphNode: SubgraphNode, overlay: Overlay) { * @param {string} property - The name of the accessed value. * Checked for conditional logic, but never changed * @param {object} receiver - The object the result is set to - * and the vlaue used as 'this' if property is a get/set method + * and the value used as 'this' if property is a get/set method * @param {unknown} value - only used on set calls. The thing being assigned */ const handler = { diff --git a/src/extensions/core/webcamCapture.ts b/src/extensions/core/webcamCapture.ts index 723b1098d..f429ddda4 100644 --- a/src/extensions/core/webcamCapture.ts +++ b/src/extensions/core/webcamCapture.ts @@ -147,7 +147,7 @@ app.registerExtension({ // @ts-expect-error fixme ts strict error node[WEBCAM_READY].then((v) => { video = v - // If width isnt specified then use video output resolution + // If width isn't specified then use video output resolution // @ts-expect-error fixme ts strict error if (!w.value) { // @ts-expect-error fixme ts strict error diff --git a/src/extensions/core/widgetInputs.ts b/src/extensions/core/widgetInputs.ts index fdd7146a1..90fafea95 100644 --- a/src/extensions/core/widgetInputs.ts +++ b/src/extensions/core/widgetInputs.ts @@ -149,7 +149,7 @@ export class PrimitiveNode extends LGraphNode { target_slot: number ) { // Fires before the link is made allowing us to reject it if it isn't valid - // No widget, we cant connect + // No widget, we can't connect if (!input.widget && !(input.type in ComfyWidgets)) { return false } @@ -388,7 +388,7 @@ export class PrimitiveNode extends LGraphNode { } onLastDisconnect() { - // We cant remove + re-add the output here as if you drag a link over the same link + // We can't remove + re-add the output here as if you drag a link over the same link // it removes, then re-adds, causing it to break this.outputs[0].type = '*' this.outputs[0].name = 'connect to widget input' @@ -595,7 +595,7 @@ app.registerExtension({ this.graph?.add(node) - // Calculate a position that wont directly overlap another node + // Calculate a position that won't directly overlap another node const pos: [number, number] = [ this.pos[0] - node.size[0] - 30, this.pos[1] diff --git a/src/lib/litegraph/README.md b/src/lib/litegraph/README.md index 1d7c6490b..998532a82 100755 --- a/src/lib/litegraph/README.md +++ b/src/lib/litegraph/README.md @@ -146,8 +146,8 @@ Litegraph has no runtime dependencies. The build tooling has been tested on Node Use GitHub actions to release normal versions. -1. Run the `Release a New Version` action, selecting the version incrment type -1. Merge the resultion PR +1. Run the `Release a New Version` action, selecting the version increment type +1. Merge the resolution PR 1. A GitHub release is automatically published on merge ### Pre-release diff --git a/src/lib/litegraph/src/LGraph.ts b/src/lib/litegraph/src/LGraph.ts index a1e84d60f..bb629f628 100644 --- a/src/lib/litegraph/src/LGraph.ts +++ b/src/lib/litegraph/src/LGraph.ts @@ -1126,7 +1126,7 @@ export class LGraph /** * Snaps the provided items to a grid. * - * Item positions are reounded to the nearest multiple of {@link LiteGraph.CANVAS_GRID_SIZE}. + * Item positions are rounded to the nearest multiple of {@link LiteGraph.CANVAS_GRID_SIZE}. * * When {@link LiteGraph.alwaysSnapToGrid} is enabled * and the grid size is falsy, a default of 1 is used. diff --git a/src/lib/litegraph/src/LGraphCanvas.ts b/src/lib/litegraph/src/LGraphCanvas.ts index dab92a270..f33b0df04 100644 --- a/src/lib/litegraph/src/LGraphCanvas.ts +++ b/src/lib/litegraph/src/LGraphCanvas.ts @@ -461,7 +461,7 @@ export class LGraphCanvas } const baseFontSize = LiteGraph.NODE_TEXT_SIZE // 14px - const dprAdjustment = Math.sqrt(window.devicePixelRatio || 1) //Using sqrt here because higher DPR monitors do not linearily scale the readability of the font, instead they increase the font by some heurisitc, and to approximate we use sqrt to say bascially a DPR of 2 increases the readibility by 40%, 3 by 70% + const dprAdjustment = Math.sqrt(window.devicePixelRatio || 1) //Using sqrt here because higher DPR monitors do not linearily scale the readability of the font, instead they increase the font by some heurisitc, and to approximate we use sqrt to say basically a DPR of 2 increases the readability by 40%, 3 by 70% // Calculate the zoom level where text becomes unreadable this._lowQualityZoomThreshold = @@ -547,7 +547,7 @@ export class LGraphCanvas linkMarkerShape: LinkMarkerShape = LinkMarkerShape.Circle links_render_mode: number /** Minimum font size in pixels before switching to low quality rendering. - * This intializes first and if we cant get the value from the settings we default to 8px + * This initializes first and if we can't get the value from the settings we default to 8px */ private _min_font_size_for_lod: number = 8 @@ -1228,7 +1228,7 @@ export class LGraphCanvas className: 'event' }) } - // add callback for modifing the menu elements onMenuNodeOutputs + // add callback for modifying the menu elements onMenuNodeOutputs const retEntries = node.onMenuNodeOutputs?.(entries) if (retEntries) entries = retEntries @@ -3902,7 +3902,7 @@ export class LGraphCanvas for (const item of [...parsed.nodes, ...parsed.reroutes]) { if (item.pos == null) throw new TypeError( - 'Invalid node encounterd on paste. `pos` was null.' + 'Invalid node encountered on paste. `pos` was null.' ) if (item.pos[0] < offsetX) offsetX = item.pos[0] @@ -6818,7 +6818,7 @@ export class LGraphCanvas canvas.focus() root_document.body.style.overflow = '' - // important, if canvas loses focus keys wont be captured + // important, if canvas loses focus keys won't be captured setTimeout(() => canvas.focus(), 20) dialog.remove() } @@ -7095,7 +7095,7 @@ export class LGraphCanvas ) } } else { - // console.warn("cant find slot " + options.slot_from); + // console.warn("can't find slot " + options.slot_from); } } if (options.node_to) { @@ -7140,7 +7140,7 @@ export class LGraphCanvas ) } } else { - // console.warn("cant find slot_nodeTO " + options.slot_from); + // console.warn("can't find slot_nodeTO " + options.slot_from); } } @@ -7478,7 +7478,7 @@ export class LGraphCanvas return dialog } - // TODO refactor, theer are different dialog, some uses createDialog, some dont + // TODO refactor, there are different dialog, some uses createDialog, some dont createDialog(html: string, options: IDialogOptions): IDialog { const def_options = { checkForInput: false, diff --git a/src/lib/litegraph/src/LGraphNode.ts b/src/lib/litegraph/src/LGraphNode.ts index c657526a9..52586e445 100644 --- a/src/lib/litegraph/src/LGraphNode.ts +++ b/src/lib/litegraph/src/LGraphNode.ts @@ -167,8 +167,8 @@ input|output: every connection general properties: + clip_area: if you render outside the node, it will be clipped + unsafe_execution: not allowed for safe execution - + skip_repeated_outputs: when adding new outputs, it wont show if there is one already connected - + resizable: if set to false it wont be resizable with the mouse + + skip_repeated_outputs: when adding new outputs, it won't show if there is one already connected + + resizable: if set to false it won't be resizable with the mouse + widgets_start_y: widgets start at y distance from the top of the node flags object: @@ -902,7 +902,7 @@ export class LGraphNode if (this.onSerialize?.(o)) console.warn( - 'node onSerialize shouldnt return anything, data should be stored in the object pass in the first parameter' + 'node onSerialize shouldn\'t return anything, data should be stored in the object pass in the first parameter' ) return o @@ -2351,7 +2351,7 @@ export class LGraphNode /** * returns the output (or input) slot with a given type, -1 if not found - * @param input uise inputs instead of outputs + * @param input use inputs instead of outputs * @param type the type of the slot to find * @param returnObj if the obj itself wanted * @param preferFreeSlot if we want a free slot (if not found, will return the first of the type anyway) @@ -2911,7 +2911,7 @@ export class LGraphNode const fromLastFloatingReroute = parentReroute?.floating?.slotType === 'output' - // Adding from an ouput, or a floating reroute that is NOT the tip of an existing floating chain + // Adding from an output, or a floating reroute that is NOT the tip of an existing floating chain if (afterRerouteId == null || !fromLastFloatingReroute) { const link = new LLink( -1, diff --git a/src/lib/litegraph/src/LiteGraphGlobal.ts b/src/lib/litegraph/src/LiteGraphGlobal.ts index 31ea68ed4..c2c97f555 100644 --- a/src/lib/litegraph/src/LiteGraphGlobal.ts +++ b/src/lib/litegraph/src/LiteGraphGlobal.ts @@ -241,10 +241,10 @@ export class LiteGraphGlobal { */ do_add_triggers_slots = false - /** [false!] being events, it is strongly reccomended to use them sequentially, one by one */ + /** [false!] being events, it is strongly recommended to use them sequentially, one by one */ allow_multi_output_for_events = true - /** [true!] allows to create and connect a ndoe clicking with the third button (wheel) */ + /** [true!] allows to create and connect a node clicking with the third button (wheel) */ middle_click_slot_add_default_node = false /** [true!] dragging a link to empty space will open a menu, add from list, search or defaults */ @@ -428,7 +428,7 @@ export class LiteGraphGlobal { `LiteGraph node class ${type} has onPropertyChange method, it must be called onPropertyChanged with d at the end` ) - // TODO one would want to know input and ouput :: this would allow through registerNodeAndSlotType to get all the slots types + // TODO one would want to know input and output :: this would allow through registerNodeAndSlotType to get all the slots types if (this.auto_load_slot_types) new base_class(base_class.title || 'tmpnode') } diff --git a/src/lib/litegraph/src/subgraph/ExecutableNodeDTO.ts b/src/lib/litegraph/src/subgraph/ExecutableNodeDTO.ts index 07f4d4cec..f041376f6 100644 --- a/src/lib/litegraph/src/subgraph/ExecutableNodeDTO.ts +++ b/src/lib/litegraph/src/subgraph/ExecutableNodeDTO.ts @@ -57,7 +57,7 @@ export class ExecutableNodeDTO implements ExecutableLGraphNode { #id: ExecutionId /** - * The path to the acutal node through subgraph instances, represented as a list of all subgraph node IDs (instances), + * The path to the actual node through subgraph instances, represented as a list of all subgraph node IDs (instances), * followed by the actual original node ID within the subgraph. Each segment is separated by `:`. * * e.g. `1:2:3`: @@ -104,7 +104,7 @@ export class ExecutableNodeDTO implements ExecutableLGraphNode { readonly subgraphNodePath: readonly NodeId[], /** A flattened map of all DTOs in this node network. Subgraph instances have been expanded into their inner nodes. */ readonly nodesByExecutionId: Map, - /** The actual subgraph instance that contains this node, otherise undefined. */ + /** The actual subgraph instance that contains this node, otherwise undefined. */ readonly subgraphNode?: SubgraphNode ) { if (!node.graph) throw new NullGraphError() diff --git a/src/lib/litegraph/src/types/serialisation.ts b/src/lib/litegraph/src/types/serialisation.ts index 8ab446594..df75c5e72 100644 --- a/src/lib/litegraph/src/types/serialisation.ts +++ b/src/lib/litegraph/src/types/serialisation.ts @@ -157,7 +157,7 @@ export interface SubgraphIO extends SubgraphIOShared { id: UUID /** The data type this slot uses. Unlike nodes, this does not support legacy numeric types. */ type: string - /** Links connected to this slot, or `undefined` if not connected. An ouptut slot should only ever have one link. */ + /** Links connected to this slot, or `undefined` if not connected. An output slot should only ever have one link. */ linkIds?: LinkId[] } diff --git a/src/lib/litegraph/test/subgraph/SubgraphConversion.test.ts b/src/lib/litegraph/test/subgraph/SubgraphConversion.test.ts index 16cf40a55..a1d79389c 100644 --- a/src/lib/litegraph/test/subgraph/SubgraphConversion.test.ts +++ b/src/lib/litegraph/test/subgraph/SubgraphConversion.test.ts @@ -56,7 +56,7 @@ describe('SubgraphConversion', () => { expect(graph.nodes.length).toBe(2) expect(graph.links.size).toBe(1) }) - it('Should merge boundry links', () => { + it('Should merge boundary links', () => { const subgraph = createTestSubgraph({ inputs: [{ name: 'value', type: 'number' }], outputs: [{ name: 'value', type: 'number' }] diff --git a/src/lib/litegraph/test/subgraph/SubgraphSlotVisualFeedback.test.ts b/src/lib/litegraph/test/subgraph/SubgraphSlotVisualFeedback.test.ts index fe4644850..e37a91293 100644 --- a/src/lib/litegraph/test/subgraph/SubgraphSlotVisualFeedback.test.ts +++ b/src/lib/litegraph/test/subgraph/SubgraphSlotVisualFeedback.test.ts @@ -134,7 +134,7 @@ describe('SubgraphSlot visual feedback', () => { expect(globalAlphaValues).toContain(0.4) }) - // "not implmeneted yet" + // "not implemented yet" // it("should render slots with full opacity when dragging between compatible SubgraphInput and SubgraphOutput", () => { // const subgraph = createTestSubgraph() diff --git a/src/platform/settings/constants/coreSettings.ts b/src/platform/settings/constants/coreSettings.ts index 63c4e7c8d..e0ae27d4b 100644 --- a/src/platform/settings/constants/coreSettings.ts +++ b/src/platform/settings/constants/coreSettings.ts @@ -986,7 +986,7 @@ export const CORE_SETTINGS: SettingParams[] = [ name: 'Auto Save', type: 'combo', options: ['off', 'after delay'], // Room for other options like on focus change, tab change, window change - defaultValue: 'off', // Popular requst by users (https://github.com/Comfy-Org/ComfyUI_frontend/issues/1584#issuecomment-2536610154) + defaultValue: 'off', // Popular request by users (https://github.com/Comfy-Org/ComfyUI_frontend/issues/1584#issuecomment-2536610154) versionAdded: '1.16.0' }, { diff --git a/src/platform/updates/components/WhatsNewPopup.vue b/src/platform/updates/components/WhatsNewPopup.vue index d0049d873..7349d89ef 100644 --- a/src/platform/updates/components/WhatsNewPopup.vue +++ b/src/platform/updates/components/WhatsNewPopup.vue @@ -195,7 +195,7 @@ defineExpose({ bottom: calc( var(--sidebar-width) * 2 + var(--sidebar-icon-size) / 2 - var(--whats-new-popup-bottom) - ); /* Position to center of help center icon (2 icons below + half icon height for center - whats new popup bottom position ) */ + ); /* Position to center of help center icon (2 icons below + half icon height for center - what's new popup bottom position ) */ } /* Sidebar positioning classes applied by parent */ diff --git a/src/platform/workflow/validation/schemas/workflowSchema.ts b/src/platform/workflow/validation/schemas/workflowSchema.ts index a07ebc018..155c60fdb 100644 --- a/src/platform/workflow/validation/schemas/workflowSchema.ts +++ b/src/platform/workflow/validation/schemas/workflowSchema.ts @@ -219,7 +219,7 @@ const zSubgraphIO = zNodeInput.extend({ id: z.string().uuid(), /** The data type this slot uses. Unlike nodes, this does not support legacy numeric types. */ type: z.string(), - /** Links connected to this slot, or `undefined` if not connected. An ouptut slot should only ever have one link. */ + /** Links connected to this slot, or `undefined` if not connected. An output slot should only ever have one link. */ linkIds: z.array(z.number()).optional() }) diff --git a/src/renderer/extensions/vueNodes/composables/useNodeTooltips.ts b/src/renderer/extensions/vueNodes/composables/useNodeTooltips.ts index b13e9e23f..431e8a8bf 100644 --- a/src/renderer/extensions/vueNodes/composables/useNodeTooltips.ts +++ b/src/renderer/extensions/vueNodes/composables/useNodeTooltips.ts @@ -13,8 +13,8 @@ import { cn } from '@/utils/tailwindUtil' * * * IMPORTANT: this escape is needed for many reason due to primevue's directive tooltip system. - * We cannot use PT to conditonally render the tooltips because the entire PT object only run - * once during the intialization of the directive not every mount/unmount. + * We cannot use PT to conditionally render the tooltips because the entire PT object only run + * once during the initialization of the directive not every mount/unmount. * Once the directive is constructed its no longer reactive in the traditional sense. * We have to use something non destructive like mouseevents to dismiss the tooltip. * diff --git a/src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.ts b/src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.ts index 957c80275..c8c4f575f 100644 --- a/src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.ts +++ b/src/renderer/extensions/vueNodes/widgets/composables/useImageUploadWidget.ts @@ -106,7 +106,7 @@ export const useImageUploadWidget = () => { } // On load if we have a value then render the image - // The value isnt set immediately so we need to wait a moment + // The value isn't set immediately so we need to wait a moment // No change callbacks seem to be fired on initial setting of the value requestAnimationFrame(() => { nodeOutputStore.setNodeOutputs(node, fileComboWidget.value, { diff --git a/src/scripts/api.ts b/src/scripts/api.ts index 80a5d00ea..e372b8fa9 100644 --- a/src/scripts/api.ts +++ b/src/scripts/api.ts @@ -524,7 +524,7 @@ export class ComfyApi extends EventTarget { if (msg.data.sid) { const clientId = msg.data.sid this.clientId = clientId - window.name = clientId // use window name so it isnt reused when duplicating tabs + window.name = clientId // use window name so it isn't reused when duplicating tabs sessionStorage.setItem('clientId', clientId) // store in session storage so duplicate tab can load correct workflow } this.dispatchCustomEvent('status', msg.data.status ?? null) diff --git a/src/stores/electronDownloadStore.ts b/src/stores/electronDownloadStore.ts index cd78716e9..3364cc37d 100644 --- a/src/stores/electronDownloadStore.ts +++ b/src/stores/electronDownloadStore.ts @@ -14,7 +14,7 @@ export interface ElectronDownload status?: DownloadStatus } -/** Electron donwloads store handler */ +/** Electron downloads store handler */ export const useElectronDownloadStore = defineStore('downloads', () => { const downloads = ref([]) const { DownloadManager } = electronAPI() diff --git a/src/utils/executableGroupNodeChildDTO.ts b/src/utils/executableGroupNodeChildDTO.ts index 5cffd3f34..d5b0ac5e5 100644 --- a/src/utils/executableGroupNodeChildDTO.ts +++ b/src/utils/executableGroupNodeChildDTO.ts @@ -18,7 +18,7 @@ export class ExecutableGroupNodeChildDTO extends ExecutableNodeDTO { subgraphNodePath: readonly NodeId[], /** A flattened map of all DTOs in this node network. Subgraph instances have been expanded into their inner nodes. */ nodesByExecutionId: Map, - /** The actual subgraph instance that contains this node, otherise undefined. */ + /** The actual subgraph instance that contains this node, otherwise undefined. */ subgraphNode?: SubgraphNode | undefined, groupNodeHandler?: GroupNodeHandler ) { diff --git a/src/utils/linkFixer.ts b/src/utils/linkFixer.ts index 1c26afb29..64fdd598f 100644 --- a/src/utils/linkFixer.ts +++ b/src/utils/linkFixer.ts @@ -70,7 +70,7 @@ function extendLink(link: SerialisedLLinkArray) { * makes logical sense. Can apply fixes when passed the `fix` argument as true. * * Note that fixes are a best-effort attempt. Seems to get it correct in most cases, but there is a - * chance it correct an anomoly that results in placing an incorrect link (say, if there were two + * chance it correct an anomaly that results in placing an incorrect link (say, if there were two * links in the data). Users should take care to not overwrite work until manually checking the * result. */ diff --git a/src/utils/searchAndReplace.ts b/src/utils/searchAndReplace.ts index 1020d6fbe..1e9299c40 100644 --- a/src/utils/searchAndReplace.ts +++ b/src/utils/searchAndReplace.ts @@ -27,7 +27,7 @@ export function applyTextReplacements( let nodes = allNodes.filter( (n) => n.properties?.['Node name for S&R'] === split[0] ) - // If we cant, see if there is a node with that title + // If we can't, see if there is a node with that title if (!nodes.length) { nodes = allNodes.filter((n) => n.title === split[0]) } diff --git a/tests-ui/tests/litegraph/subgraph/SubgraphConversion.test.ts b/tests-ui/tests/litegraph/subgraph/SubgraphConversion.test.ts index 01a6ceb50..f978710ae 100644 --- a/tests-ui/tests/litegraph/subgraph/SubgraphConversion.test.ts +++ b/tests-ui/tests/litegraph/subgraph/SubgraphConversion.test.ts @@ -58,7 +58,7 @@ describe.skip('SubgraphConversion', () => { expect(graph.nodes.length).toBe(2) expect(graph.links.size).toBe(1) }) - it('Should merge boundry links', () => { + it('Should merge boundary links', () => { const subgraph = createTestSubgraph({ inputs: [{ name: 'value', type: 'number' }], outputs: [{ name: 'value', type: 'number' }] diff --git a/tests-ui/tests/litegraph/subgraph/SubgraphSlotVisualFeedback.test.ts b/tests-ui/tests/litegraph/subgraph/SubgraphSlotVisualFeedback.test.ts index dc1680727..0ed819a4f 100644 --- a/tests-ui/tests/litegraph/subgraph/SubgraphSlotVisualFeedback.test.ts +++ b/tests-ui/tests/litegraph/subgraph/SubgraphSlotVisualFeedback.test.ts @@ -135,7 +135,7 @@ describe.skip('SubgraphSlot visual feedback', () => { expect(globalAlphaValues).toContain(0.4) }) - // "not implmeneted yet" + // "not implemented yet" // it("should render slots with full opacity when dragging between compatible SubgraphInput and SubgraphOutput", () => { // const subgraph = createTestSubgraph() diff --git a/tests-ui/tests/widgets/proxyWidget.test.ts b/tests-ui/tests/widgets/proxyWidget.test.ts index fc0ab5f2f..9b2ec1e60 100644 --- a/tests-ui/tests/widgets/proxyWidget.test.ts +++ b/tests-ui/tests/widgets/proxyWidget.test.ts @@ -100,7 +100,7 @@ describe('Subgraph proxyWidgets', () => { expect(innerNodes[0].widgets[0].last_y).toBe(11) expect(innerNodes[0].widgets[0].computedHeight).toBe(12) }) - test('Can detatch and re-attach widgets', () => { + test('Can detach and re-attach widgets', () => { const [subgraphNode, innerNodes] = setupSubgraph(1) innerNodes[0].addWidget('text', 'stringWidget', 'value', () => {}) subgraphNode.properties.proxyWidgets = JSON.stringify([ From c662c77305ecf9988e6c1164f3be4a7e73367e9b Mon Sep 17 00:00:00 2001 From: snomiao Date: Thu, 2 Oct 2025 14:20:48 +0900 Subject: [PATCH 10/12] Add Playwright composite action to reduce workflow duplication (#5754) This PR introduces a reusable composite action for Playwright setup to reduce duplication across workflows. ## Changes - Created `.github/actions/setup-playwright/action.yml` composite action that: - Detects or uses provided Playwright version - Caches Playwright browsers with intelligent cache keys - Installs browsers only when cache miss occurs - Installs OS dependencies when cache hit occurs ## Technical Details - **Important:** The composite action requires `shell: bash` for all `run` steps as per [GitHub Actions requirements for composite actions](https://docs.github.com/en/actions/creating-actions/creating-a-composite-action#creating-an-action-metadata-file). This is a mandatory field for composite actions, unlike regular workflow steps. - Updated workflow paths to account for repository checkout locations (some workflows checkout to subdirectories like `ComfyUI_frontend/`) - Uses conditional caching to avoid redundant browser installations ## Benefits - Reduces code duplication across 6 workflow files - Centralizes Playwright caching logic - Consistent browser setup across all workflows - Easier maintenance and updates - Faster CI runs through intelligent caching ## Affected Workflows - `.github/workflows/test-ui.yaml` (2 uses) - `.github/workflows/i18n-custom-nodes.yaml` - `.github/workflows/i18n-node-defs.yaml` - `.github/workflows/i18n.yaml` - `.github/workflows/test-browser-exp.yaml` --------- Co-authored-by: GitHub Action --- .github/actions/setup-playwright/action.yml | 31 +++++++++++++ .github/workflows/tests-ci.yaml | 43 ++----------------- ...ales-for-given-custom-node-repository.yaml | 5 +-- .github/workflows/update-locales.yaml | 12 +----- .../update-node-definitions-locales.yaml | 8 ++-- .../update-playwright-expectations.yaml | 12 +----- src/lib/litegraph/src/LGraphNode.ts | 2 +- 7 files changed, 45 insertions(+), 68 deletions(-) create mode 100644 .github/actions/setup-playwright/action.yml diff --git a/.github/actions/setup-playwright/action.yml b/.github/actions/setup-playwright/action.yml new file mode 100644 index 000000000..ddd1a7605 --- /dev/null +++ b/.github/actions/setup-playwright/action.yml @@ -0,0 +1,31 @@ +name: Setup Playwright +description: Cache and install Playwright browsers with dependencies +runs: + using: composite + steps: + - name: Detect Playwright version + id: detect-version + shell: bash + working-directory: ComfyUI_frontend + run: | + PLAYWRIGHT_VERSION=$(pnpm ls @playwright/test --json | jq --raw-output '.[0].devDependencies["@playwright/test"].version') + echo "playwright-version=$PLAYWRIGHT_VERSION" >> $GITHUB_OUTPUT + + - name: Cache Playwright Browsers + uses: actions/cache@v4 + id: cache-playwright-browsers + with: + path: '~/.cache/ms-playwright' + key: ${{ runner.os }}-playwright-browsers-${{ steps.detect-version.outputs.playwright-version }} + + - name: Install Playwright Browsers + if: steps.cache-playwright-browsers.outputs.cache-hit != 'true' + shell: bash + run: pnpm exec playwright install chromium --with-deps + working-directory: ComfyUI_frontend + + - name: Install Playwright Browsers (operating system dependencies) + if: steps.cache-playwright-browsers.outputs.cache-hit == 'true' + shell: bash + run: pnpm exec playwright install-deps + working-directory: ComfyUI_frontend \ No newline at end of file diff --git a/.github/workflows/tests-ci.yaml b/.github/workflows/tests-ci.yaml index 01b180b4a..94d0f0b2d 100644 --- a/.github/workflows/tests-ci.yaml +++ b/.github/workflows/tests-ci.yaml @@ -12,7 +12,6 @@ jobs: runs-on: ubuntu-latest outputs: cache-key: ${{ steps.cache-key.outputs.key }} - playwright-version: ${{ steps.playwright-version.outputs.PLAYWRIGHT_VERSION }} steps: - name: Checkout ComfyUI uses: actions/checkout@v5 @@ -65,12 +64,6 @@ jobs: id: cache-key run: echo "key=$(date +%s)" >> $GITHUB_OUTPUT - - name: Playwright Version - id: playwright-version - run: | - PLAYWRIGHT_VERSION=$(pnpm ls @playwright/test --json | jq --raw-output '.[0].devDependencies["@playwright/test"].version') - echo "PLAYWRIGHT_VERSION=$PLAYWRIGHT_VERSION" >> $GITHUB_OUTPUT - working-directory: ComfyUI_frontend - name: Save cache uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 @@ -123,22 +116,8 @@ jobs: working-directory: ComfyUI - - name: Cache Playwright Browsers - uses: actions/cache@v4 - id: cache-playwright-browsers - with: - path: '~/.cache/ms-playwright' - key: '${{ runner.os }}-playwright-browsers-${{ needs.setup.outputs.playwright-version }}' - - - name: Install Playwright Browsers - if: steps.cache-playwright-browsers.outputs.cache-hit != 'true' - run: pnpm exec playwright install chromium --with-deps - working-directory: ComfyUI_frontend - - - name: Install Playwright Browsers (operating system dependencies) - if: steps.cache-playwright-browsers.outputs.cache-hit == 'true' - run: pnpm exec playwright install-deps - working-directory: ComfyUI_frontend + - name: Setup Playwright + uses: ./ComfyUI_frontend/.github/actions/setup-playwright - name: Start ComfyUI server run: | @@ -202,22 +181,8 @@ jobs: pip install wait-for-it working-directory: ComfyUI - - name: Cache Playwright Browsers - uses: actions/cache@v4 - id: cache-playwright-browsers - with: - path: '~/.cache/ms-playwright' - key: '${{ runner.os }}-playwright-browsers-${{ needs.setup.outputs.playwright-version }}' - - - name: Install Playwright Browsers - if: steps.cache-playwright-browsers.outputs.cache-hit != 'true' - run: pnpm exec playwright install chromium --with-deps - working-directory: ComfyUI_frontend - - - name: Install Playwright Browsers (operating system dependencies) - if: steps.cache-playwright-browsers.outputs.cache-hit == 'true' - run: pnpm exec playwright install-deps - working-directory: ComfyUI_frontend + - name: Setup Playwright + uses: ./ComfyUI_frontend/.github/actions/setup-playwright - name: Start ComfyUI server run: | diff --git a/.github/workflows/update-locales-for-given-custom-node-repository.yaml b/.github/workflows/update-locales-for-given-custom-node-repository.yaml index 74d0267cf..ec085eab5 100644 --- a/.github/workflows/update-locales-for-given-custom-node-repository.yaml +++ b/.github/workflows/update-locales-for-given-custom-node-repository.yaml @@ -77,9 +77,8 @@ jobs: python main.py --cpu --multi-user & wait-for-it --service 127.0.0.1:8188 -t 600 working-directory: ComfyUI - - name: Install Playwright Browsers - run: pnpm exec playwright install chromium --with-deps - working-directory: ComfyUI_frontend + - name: Setup Playwright + uses: ./ComfyUI_frontend/.github/actions/setup-playwright - name: Start dev server # Run electron dev server as it is a superset of the web dev server # We do want electron specific UIs to be translated. diff --git a/.github/workflows/update-locales.yaml b/.github/workflows/update-locales.yaml index 2871209a1..3bf939b23 100644 --- a/.github/workflows/update-locales.yaml +++ b/.github/workflows/update-locales.yaml @@ -26,16 +26,8 @@ jobs: key: i18n-tools-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }} restore-keys: | i18n-tools-cache-${{ runner.os }}- - - name: Cache Playwright browsers - uses: actions/cache@v4 - with: - path: ~/.cache/ms-playwright - key: playwright-browsers-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }} - restore-keys: | - playwright-browsers-${{ runner.os }}- - - name: Install Playwright Browsers - run: pnpm exec playwright install chromium --with-deps - working-directory: ComfyUI_frontend + - name: Setup Playwright + uses: ./.github/actions/setup-playwright - name: Start dev server # Run electron dev server as it is a superset of the web dev server # We do want electron specific UIs to be translated. diff --git a/.github/workflows/update-node-definitions-locales.yaml b/.github/workflows/update-node-definitions-locales.yaml index 71cb417d4..b063159dd 100644 --- a/.github/workflows/update-node-definitions-locales.yaml +++ b/.github/workflows/update-node-definitions-locales.yaml @@ -13,11 +13,9 @@ jobs: update-locales: runs-on: ubuntu-latest steps: - - name: Setup Frontend - uses: ./.github/actions/setup-frontend - - name: Install Playwright Browsers - run: pnpm exec playwright install chromium --with-deps - working-directory: ComfyUI_frontend + - uses: Comfy-Org/ComfyUI_frontend_setup_action@v3 + - name: Setup Playwright + uses: ./.github/actions/setup-playwright - name: Start dev server # Run electron dev server as it is a superset of the web dev server # We do want electron specific UIs to be translated. diff --git a/.github/workflows/update-playwright-expectations.yaml b/.github/workflows/update-playwright-expectations.yaml index 4f643cad8..c59628f69 100644 --- a/.github/workflows/update-playwright-expectations.yaml +++ b/.github/workflows/update-playwright-expectations.yaml @@ -14,16 +14,8 @@ jobs: uses: actions/checkout@v5 - name: Setup Frontend uses: ./.github/actions/setup-frontend - - name: Cache Playwright browsers - uses: actions/cache@v4 - with: - path: ~/.cache/ms-playwright - key: playwright-browsers-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }} - restore-keys: | - playwright-browsers-${{ runner.os }}- - - name: Install Playwright Browsers - run: pnpm exec playwright install chromium --with-deps - working-directory: ComfyUI_frontend + - name: Setup Playwright + uses: ./.github/actions/setup-playwright - name: Run Playwright tests and update snapshots id: playwright-tests run: pnpm exec playwright test --update-snapshots diff --git a/src/lib/litegraph/src/LGraphNode.ts b/src/lib/litegraph/src/LGraphNode.ts index 52586e445..557bf03b8 100644 --- a/src/lib/litegraph/src/LGraphNode.ts +++ b/src/lib/litegraph/src/LGraphNode.ts @@ -902,7 +902,7 @@ export class LGraphNode if (this.onSerialize?.(o)) console.warn( - 'node onSerialize shouldn\'t return anything, data should be stored in the object pass in the first parameter' + "node onSerialize shouldn't return anything, data should be stored in the object pass in the first parameter" ) return o From 9c97fb359daf14df7704f3b15cb889877a8d382c Mon Sep 17 00:00:00 2001 From: Alexander Piskun <13381981+bigcat88@users.noreply.github.com> Date: Thu, 2 Oct 2025 09:09:11 +0300 Subject: [PATCH 11/12] feat(auth): Allow SSO login only for whitelisted addresses (localhost) (#5815) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Hide Google/GitHub SSO login options when the UI is accessed from **non‑local** addresses. This PR also adds a **static whitelist** (editable in code) so we can allow additional hosts if needed. Default whitelisted addresses: 1. `localhost` and any subdomain: `*.localhost` 2. IPv4 loopback `127.0.0.0/8` (e.g., `127.x.y.z`) 4. IPv6 loopback `::1` (including equivalent textual forms such as `::0001`) ## Changes - **What**: * Add `src/utils/hostWhitelist.ts` with `normalizeHost` and `isHostWhitelisted` helpers. * Update `SignInContent.vue` to **hide** SSO options when `isHostWhitelisted(normalizeHost(window.location.hostname))` returns `false`. - **Breaking**: * Users accessing from Runpod or other previously allowed **non‑local** hosts will **lose** SSO login options. If we need to keep SSO there, we should add those hosts to the whitelist in `hostWhitelist.ts`. ## Review Focus 1. Verify that logging in from local addresses (`localhost`, `*.localhost`, `127.0.0.1`, `::1`) **does not change** the current behavior: SSO is visible. 2. Verify that from a **non‑local** address, SSO options are **not** displayed. ## Screenshots (if applicable) UI opened from `192.168.2.109` address: Screenshot From 2025-09-27 13-22-15 UI opened from default `127.0.0.1` address(nothing changed): Screenshot From 2025-09-27 13-35-27 ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-5815-feat-auth-Allow-SSO-login-only-for-whitelisted-addresses-localhost-27b6d73d365081ccbe84c034cf8e416d) by [Unito](https://www.unito.io) --- .../dialog/content/SignInContent.vue | 62 ++++----- src/utils/hostWhitelist.ts | 91 +++++++++++++ tests-ui/tests/utils/hostWhitelist.test.ts | 123 ++++++++++++++++++ 3 files changed, 247 insertions(+), 29 deletions(-) create mode 100644 src/utils/hostWhitelist.ts create mode 100644 tests-ui/tests/utils/hostWhitelist.test.ts diff --git a/src/components/dialog/content/SignInContent.vue b/src/components/dialog/content/SignInContent.vue index 3f3a47b7b..29f441a28 100644 --- a/src/components/dialog/content/SignInContent.vue +++ b/src/components/dialog/content/SignInContent.vue @@ -45,37 +45,39 @@ {{ t('auth.login.orContinueWith') }} - +
- +