mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-07-03 05:38:26 +00:00
## Summary
Add a `COVERAGE_CRITICAL` unit-coverage gate over folder-based critical
runtime areas and wire it into the unit CI job. First PR of a stacked
series that ratchets the gate upward as tests land.
## Changes
- **What**: `vite.config.mts` gains `CRITICAL_COVERAGE_INCLUDE` folder
globs for core runtime areas: `src/base`, `src/composables`, `src/core`,
`src/schemas`, `src/scripts`, `src/services`, `src/stores`, `src/utils`,
selected `src/platform` logic slices, selected
`src/lib/litegraph/src/{node,subgraph,utils}` primitives, and selected
`src/workbench` manager logic; `package.json` gains
`test:coverage:critical` (`COVERAGE_CRITICAL=true vitest run
--coverage`); `ci-tests-unit.yaml` runs the gate. The thresholds are
env-gated, so the normal `test:coverage` run is unaffected.
- **Breaking**: none.
## Review Focus
Establishes the measurement substrate, no tests added yet. Thresholds
are locked to the current baseline over the folder-based critical scope
so CI is green:
| metric | baseline | threshold |
|---|---|---|
| statements | 69.53% (24287/34930) | 69 |
| branches | 60.7% (11497/18940) | 60 |
| functions | 67.34% (4980/7395) | 67 |
| lines | 70.83% (22619/31930) | 70 |
The scope is intentionally not whole `src/platform`, `src/lib`, or
`src/workbench`: UI-heavy and specialized lanes like platform
components, telemetry/surveys, litegraph
canvas/widgets/infrastructure/types, and manager components/types stay
outside this gate for now.
Subsequent stacked PRs add tests and bump these thresholds; a later
refactor series ratchets branches to 90.
Created by Codex
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> **Low Risk**
> Changes are limited to test/coverage configuration and CI; no
application runtime behavior is modified.
>
> **Overview**
> Introduces a **critical-path unit coverage gate** that only runs when
`COVERAGE_CRITICAL=true`, leaving the existing `pnpm test:coverage`
behavior unchanged.
>
> **Vitest** (`vite.config.mts`): when the flag is set, coverage is
limited to folder globs for core runtime areas (base, composables, core,
services, stores, utils, selected platform/workspace/auth slices,
litegraph node/subgraph/utils, workbench manager logic, etc.) and
**Vitest thresholds** are enforced (statements 69%, branches 60%,
functions 67%, lines 70%). In that mode, litegraph is no longer
blanket-excluded from coverage the way the full `src` run still excludes
`src/lib/litegraph/**`.
>
> **Tooling & CI**: adds `test:coverage:critical` in `package.json` and
a new unit CI step after Codecov upload that runs the gate so
regressions in those areas fail the job.
>
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
25e73f3844. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->
---------
Co-authored-by: huang47 <157390+huang47@users.noreply.github.com>
221 lines
9.3 KiB
JSON
221 lines
9.3 KiB
JSON
{
|
|
"name": "@comfyorg/comfyui-frontend",
|
|
"version": "1.47.6",
|
|
"private": true,
|
|
"description": "Official front-end implementation of ComfyUI",
|
|
"homepage": "https://comfy.org",
|
|
"license": "GPL-3.0-only",
|
|
"repository": "https://github.com/Comfy-Org/ComfyUI_frontend",
|
|
"type": "module",
|
|
"scripts": {
|
|
"build:cloud": "cross-env DISTRIBUTION=cloud vite build --config vite.config.mts",
|
|
"build:desktop": "pnpm --filter @comfyorg/desktop-ui run build",
|
|
"build-storybook": "storybook build",
|
|
"build:types": "vite build --config vite.types.config.mts && node scripts/prepare-types.js",
|
|
"build:analyze": "cross-env ANALYZE_BUNDLE=true pnpm build",
|
|
"build": "pnpm typecheck && vite build --config vite.config.mts",
|
|
"clean": "pnpm dlx rimraf dist dist-ssr coverage playwright-report blob-report test-results node_modules/.vite apps/desktop-ui/dist apps/website/dist",
|
|
"clean:all": "pnpm clean && pnpm dlx rimraf node_modules",
|
|
"size:collect": "node scripts/size-collect.js",
|
|
"size:report": "node scripts/size-report.js",
|
|
"collect-i18n": "pnpm exec playwright test --config=playwright.i18n.config.ts",
|
|
"dev:cloud": "pnpm dev:cloud:test",
|
|
"dev:cloud:test": "cross-env DEV_SERVER_COMFYUI_URL=https://testcloud.comfy.org/ vite --config vite.config.mts",
|
|
"dev:cloud:staging": "cross-env DEV_SERVER_COMFYUI_URL=https://stagingcloud.comfy.org/ vite --config vite.config.mts",
|
|
"dev:cloud:prod": "cross-env DEV_SERVER_COMFYUI_URL=https://cloud.comfy.org/ vite --config vite.config.mts",
|
|
"dev:desktop": "pnpm --filter @comfyorg/desktop-ui run dev",
|
|
"dev:electron": "cross-env DISTRIBUTION=desktop vite --config vite.electron.config.mts",
|
|
"dev:no-vue": "cross-env DISABLE_VUE_PLUGINS=true vite --config vite.config.mts",
|
|
"dev:test": "cross-env VITE_USE_LEGACY_DEFAULT_GRAPH=true vite --config vite.config.mts",
|
|
"dev": "vite --config vite.config.mts",
|
|
"devtools:pycheck": "python3 -m compileall -q tools/devtools",
|
|
"format:check": "oxfmt --check",
|
|
"format": "oxfmt --write",
|
|
"json-schema": "tsx scripts/generate-json-schema.ts",
|
|
"knip:no-cache": "knip",
|
|
"knip": "knip --cache",
|
|
"lint:fix:no-cache": "oxlint src browser_tests --type-aware --fix && eslint src --fix",
|
|
"lint:fix": "oxlint src browser_tests --type-aware --fix && eslint src --cache --fix",
|
|
"lint:no-cache": "pnpm exec stylelint '{apps,packages,src}/**/*.{css,vue}' && oxlint src browser_tests --type-aware && eslint src",
|
|
"lint:unstaged:fix": "git diff --name-only HEAD | grep -E '\\.(js|ts|vue|mts)$' | xargs -r eslint --cache --fix",
|
|
"lint:unstaged": "git diff --name-only HEAD | grep -E '\\.(js|ts|vue|mts)$' | xargs -r eslint --cache",
|
|
"lint": "pnpm stylelint && oxlint src browser_tests --type-aware && eslint src --cache",
|
|
"lint:desktop": "pnpm --filter @comfyorg/desktop-ui run lint",
|
|
"locale": "lobe-i18n locale",
|
|
"oxlint": "oxlint src browser_tests --type-aware",
|
|
"prepare": "pnpm exec husky || true && git config blame.ignoreRevsFile .git-blame-ignore-revs || true",
|
|
"preview": "vite preview --config vite.config.mts",
|
|
"storybook": "storybook dev -p 6006",
|
|
"storybook:desktop": "pnpm --filter @comfyorg/desktop-ui run storybook",
|
|
"stylelint:fix": "stylelint --cache --fix '{apps,packages,src}/**/*.{css,vue}'",
|
|
"stylelint": "stylelint --cache '{apps,packages,src}/**/*.{css,vue}'",
|
|
"test:browser": "pnpm exec playwright test",
|
|
"test:browser:coverage": "cross-env COLLECT_COVERAGE=true pnpm test:browser",
|
|
"test:browser:local": "cross-env PLAYWRIGHT_LOCAL=1 PLAYWRIGHT_TEST_URL=http://localhost:5173 pnpm test:browser",
|
|
"test:coverage": "vitest run --coverage",
|
|
"test:coverage:critical": "cross-env COVERAGE_CRITICAL=true vitest run --coverage",
|
|
"test:unit": "vitest run",
|
|
"typecheck": "vue-tsc --noEmit",
|
|
"typecheck:browser": "vue-tsc --project browser_tests/tsconfig.json",
|
|
"typecheck:desktop": "pnpm --filter @comfyorg/desktop-ui run typecheck",
|
|
"typecheck:website": "pnpm --filter @comfyorg/website run typecheck",
|
|
"zipdist": "node scripts/zipdist.js"
|
|
},
|
|
"dependencies": {
|
|
"@alloc/quick-lru": "catalog:",
|
|
"@atlaskit/pragmatic-drag-and-drop": "^1.3.1",
|
|
"@comfyorg/comfyui-desktop-bridge-types": "workspace:*",
|
|
"@comfyorg/comfyui-electron-types": "catalog:",
|
|
"@comfyorg/design-system": "workspace:*",
|
|
"@comfyorg/fbx-exporter-three": "^1.0.1",
|
|
"@comfyorg/object-info-parser": "workspace:*",
|
|
"@comfyorg/registry-types": "workspace:*",
|
|
"@comfyorg/shared-frontend-utils": "workspace:*",
|
|
"@comfyorg/tailwind-utils": "workspace:*",
|
|
"@customerio/cdp-analytics-browser": "catalog:",
|
|
"@formkit/auto-animate": "catalog:",
|
|
"@iconify/json": "catalog:",
|
|
"@primeuix/forms": "catalog:",
|
|
"@primeuix/styled": "catalog:",
|
|
"@primeuix/utils": "catalog:",
|
|
"@primevue/core": "catalog:",
|
|
"@primevue/forms": "catalog:",
|
|
"@primevue/icons": "catalog:",
|
|
"@primevue/themes": "catalog:",
|
|
"@sentry/vue": "catalog:",
|
|
"@sparkjsdev/spark": "catalog:",
|
|
"@tanstack/vue-virtual": "catalog:",
|
|
"@tiptap/core": "catalog:",
|
|
"@tiptap/extension-link": "catalog:",
|
|
"@tiptap/extension-table": "catalog:",
|
|
"@tiptap/extension-table-cell": "catalog:",
|
|
"@tiptap/extension-table-header": "catalog:",
|
|
"@tiptap/extension-table-row": "catalog:",
|
|
"@tiptap/pm": "catalog:",
|
|
"@tiptap/starter-kit": "catalog:",
|
|
"@vee-validate/zod": "catalog:",
|
|
"@vueuse/core": "catalog:",
|
|
"@vueuse/integrations": "catalog:",
|
|
"@vueuse/router": "^14.2.0",
|
|
"@xterm/addon-fit": "^0.10.0",
|
|
"@xterm/addon-serialize": "^0.13.0",
|
|
"@xterm/xterm": "^5.5.0",
|
|
"algoliasearch": "catalog:",
|
|
"axios": "catalog:",
|
|
"chart.js": "^4.5.0",
|
|
"cva": "catalog:",
|
|
"dompurify": "catalog:",
|
|
"dotenv": "catalog:",
|
|
"es-toolkit": "^1.39.9",
|
|
"extendable-media-recorder": "^9.2.27",
|
|
"extendable-media-recorder-wav-encoder": "^7.0.129",
|
|
"firebase": "catalog:",
|
|
"fuse.js": "^7.0.0",
|
|
"glob": "catalog:",
|
|
"jsonata": "catalog:",
|
|
"loglevel": "^1.9.2",
|
|
"marked": "^15.0.11",
|
|
"pinia": "catalog:",
|
|
"posthog-js": "catalog:",
|
|
"primeicons": "catalog:",
|
|
"primevue": "catalog:",
|
|
"reka-ui": "catalog:",
|
|
"semver": "^7.7.2",
|
|
"three": "catalog:",
|
|
"tiptap-markdown": "^0.8.10",
|
|
"typegpu": "catalog:",
|
|
"vee-validate": "catalog:",
|
|
"vue": "catalog:",
|
|
"vue-i18n": "catalog:",
|
|
"vue-router": "catalog:",
|
|
"vuefire": "catalog:",
|
|
"wwobjloader2": "catalog:",
|
|
"yjs": "catalog:",
|
|
"zod": "catalog:",
|
|
"zod-validation-error": "catalog:"
|
|
},
|
|
"devDependencies": {
|
|
"@comfyorg/ingest-types": "workspace:*",
|
|
"@eslint/js": "catalog:",
|
|
"@intlify/eslint-plugin-vue-i18n": "catalog:",
|
|
"@lobehub/i18n-cli": "catalog:",
|
|
"@pinia/testing": "catalog:",
|
|
"@playwright/test": "catalog:",
|
|
"@sentry/vite-plugin": "catalog:",
|
|
"@storybook/addon-docs": "catalog:",
|
|
"@storybook/addon-mcp": "catalog:",
|
|
"@storybook/vue3": "catalog:",
|
|
"@storybook/vue3-vite": "catalog:",
|
|
"@tailwindcss/vite": "catalog:",
|
|
"@testing-library/jest-dom": "catalog:",
|
|
"@testing-library/user-event": "catalog:",
|
|
"@testing-library/vue": "catalog:",
|
|
"@total-typescript/shoehorn": "catalog:",
|
|
"@types/fs-extra": "catalog:",
|
|
"@types/jsdom": "catalog:",
|
|
"@types/node": "catalog:",
|
|
"@types/semver": "catalog:",
|
|
"@types/three": "catalog:",
|
|
"@vitejs/plugin-vue": "catalog:",
|
|
"@vitest/coverage-v8": "catalog:",
|
|
"@vitest/ui": "catalog:",
|
|
"@webgpu/types": "catalog:",
|
|
"cross-env": "catalog:",
|
|
"eslint": "catalog:",
|
|
"eslint-config-prettier": "catalog:",
|
|
"eslint-import-resolver-typescript": "catalog:",
|
|
"eslint-plugin-better-tailwindcss": "catalog:",
|
|
"eslint-plugin-import-x": "catalog:",
|
|
"eslint-plugin-oxlint": "catalog:",
|
|
"eslint-plugin-playwright": "catalog:",
|
|
"eslint-plugin-storybook": "catalog:",
|
|
"eslint-plugin-testing-library": "catalog:",
|
|
"eslint-plugin-unused-imports": "catalog:",
|
|
"eslint-plugin-vue": "catalog:",
|
|
"fast-check": "catalog:",
|
|
"fs-extra": "^11.2.0",
|
|
"globals": "catalog:",
|
|
"happy-dom": "catalog:",
|
|
"husky": "catalog:",
|
|
"jiti": "catalog:",
|
|
"jsdom": "catalog:",
|
|
"knip": "catalog:",
|
|
"lint-staged": "catalog:",
|
|
"markdown-table": "catalog:",
|
|
"mixpanel-browser": "catalog:",
|
|
"monocart-coverage-reports": "catalog:",
|
|
"oxfmt": "catalog:",
|
|
"oxlint": "catalog:",
|
|
"oxlint-tsgolint": "catalog:",
|
|
"picocolors": "catalog:",
|
|
"postcss-html": "catalog:",
|
|
"pretty-bytes": "catalog:",
|
|
"rollup-plugin-visualizer": "catalog:",
|
|
"storybook": "catalog:",
|
|
"stylelint": "catalog:",
|
|
"tailwindcss": "catalog:",
|
|
"tsx": "catalog:",
|
|
"typescript": "catalog:",
|
|
"typescript-eslint": "catalog:",
|
|
"unplugin-icons": "catalog:",
|
|
"unplugin-typegpu": "catalog:",
|
|
"unplugin-vue-components": "catalog:",
|
|
"uuid": "catalog:",
|
|
"vite": "catalog:",
|
|
"vite-plugin-dts": "catalog:",
|
|
"vite-plugin-html": "catalog:",
|
|
"vite-plugin-vue-devtools": "catalog:",
|
|
"vitest": "catalog:",
|
|
"vue-component-type-helpers": "catalog:",
|
|
"vue-eslint-parser": "catalog:",
|
|
"vue-tsc": "catalog:",
|
|
"zip-dir": "^2.0.0",
|
|
"zod-to-json-schema": "catalog:"
|
|
},
|
|
"engines": {
|
|
"node": ">=25 <26",
|
|
"pnpm": ">=11.3"
|
|
},
|
|
"packageManager": "pnpm@11.3.0"
|
|
}
|