mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-29 02:32:18 +00:00
Merge remote-tracking branch 'origin/main' into feat/new-workflow-templates
This commit is contained in:
@@ -128,7 +128,25 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
|
|
||||||
### Step 4: Analyze Dependency Updates
|
### Step 4: Analyze Dependency Updates
|
||||||
|
|
||||||
1. **Check significant dependency updates:**
|
1. **Use pnpm's built-in dependency analysis:**
|
||||||
|
```bash
|
||||||
|
# Get outdated dependencies with pnpm
|
||||||
|
pnpm outdated --format table > outdated-deps-${NEW_VERSION}.txt
|
||||||
|
|
||||||
|
# Check for license compliance
|
||||||
|
pnpm licenses ls --json > licenses-${NEW_VERSION}.json
|
||||||
|
|
||||||
|
# Analyze why specific dependencies exist
|
||||||
|
echo "Dependency analysis:" > dep-analysis-${NEW_VERSION}.md
|
||||||
|
MAJOR_DEPS=("vue" "vite" "@vitejs/plugin-vue" "typescript" "pinia")
|
||||||
|
for dep in "${MAJOR_DEPS[@]}"; do
|
||||||
|
echo -e "\n## $dep\n\`\`\`" >> dep-analysis-${NEW_VERSION}.md
|
||||||
|
pnpm why "$dep" >> dep-analysis-${NEW_VERSION}.md || echo "Not found" >> dep-analysis-${NEW_VERSION}.md
|
||||||
|
echo "\`\`\`" >> dep-analysis-${NEW_VERSION}.md
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Check for significant dependency updates:**
|
||||||
```bash
|
```bash
|
||||||
# Extract all dependency changes for major version bumps
|
# Extract all dependency changes for major version bumps
|
||||||
OTHER_DEP_CHANGES=""
|
OTHER_DEP_CHANGES=""
|
||||||
@@ -200,22 +218,48 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
PR data: [contents of prs-${NEW_VERSION}.json]
|
PR data: [contents of prs-${NEW_VERSION}.json]
|
||||||
```
|
```
|
||||||
|
|
||||||
3. **Generate GTM notification:**
|
3. **Generate GTM notification using this EXACT Slack-compatible format:**
|
||||||
```bash
|
```bash
|
||||||
# Save to gtm-summary-${NEW_VERSION}.md based on analysis
|
# Only create file if GTM-worthy features exist:
|
||||||
# If GTM-worthy features exist, include them with testing instructions
|
if [ "$GTM_FEATURES_FOUND" = "true" ]; then
|
||||||
# If not, note that this is a maintenance/bug fix release
|
cat > gtm-summary-${NEW_VERSION}.md << 'EOF'
|
||||||
|
*GTM Summary: ComfyUI Frontend v${NEW_VERSION}*
|
||||||
# Check if notification is needed
|
|
||||||
if grep -q "No marketing-worthy features" gtm-summary-${NEW_VERSION}.md; then
|
_Disclaimer: the below is AI-generated_
|
||||||
echo "✅ No GTM notification needed for this release"
|
|
||||||
echo "📄 Summary saved to: gtm-summary-${NEW_VERSION}.md"
|
1. *[Feature Title]* (#[PR_NUMBER])
|
||||||
else
|
* *Author:* @[username]
|
||||||
|
* *Demo:* [Media Link or "No demo available"]
|
||||||
|
* *Why users should care:* [One compelling sentence]
|
||||||
|
* *Key Features:*
|
||||||
|
* [Feature detail 1]
|
||||||
|
* [Feature detail 2]
|
||||||
|
|
||||||
|
2. *[Feature Title]* (#[PR_NUMBER])
|
||||||
|
* *Author:* @[username]
|
||||||
|
* *Demo:* [Media Link]
|
||||||
|
* *Why users should care:* [One compelling sentence]
|
||||||
|
* *Key Features:*
|
||||||
|
* [Feature detail 1]
|
||||||
|
* [Feature detail 2]
|
||||||
|
EOF
|
||||||
echo "📋 GTM summary saved to: gtm-summary-${NEW_VERSION}.md"
|
echo "📋 GTM summary saved to: gtm-summary-${NEW_VERSION}.md"
|
||||||
echo "📤 Share this file in #gtm channel to notify the team"
|
echo "📤 Share this file in #gtm channel to notify the team"
|
||||||
|
else
|
||||||
|
echo "✅ No GTM notification needed for this release"
|
||||||
|
echo "📄 No gtm-summary file created - no marketing-worthy features"
|
||||||
fi
|
fi
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**CRITICAL Formatting Requirements:**
|
||||||
|
- Use single asterisk (*) for emphasis, NOT double (**)
|
||||||
|
- Use underscore (_) for italics
|
||||||
|
- Use 4 spaces for indentation (not tabs)
|
||||||
|
- Convert author names to @username format (e.g., "John Smith" → "@john")
|
||||||
|
- No section headers (#), no code language specifications
|
||||||
|
- Always include "Disclaimer: the below is AI-generated"
|
||||||
|
- Keep content minimal - no testing instructions, additional sections, etc.
|
||||||
|
|
||||||
### Step 6: Version Preview
|
### Step 6: Version Preview
|
||||||
|
|
||||||
**Version Preview:**
|
**Version Preview:**
|
||||||
@@ -228,37 +272,42 @@ echo "Last stable release: $LAST_STABLE"
|
|||||||
|
|
||||||
### Step 7: Security and Dependency Audit
|
### Step 7: Security and Dependency Audit
|
||||||
|
|
||||||
1. Run security audit:
|
1. Run pnpm security audit:
|
||||||
```bash
|
```bash
|
||||||
npm audit --audit-level moderate
|
pnpm audit --audit-level moderate
|
||||||
|
pnpm licenses ls --summary
|
||||||
```
|
```
|
||||||
2. Check for known vulnerabilities in dependencies
|
2. Check for known vulnerabilities in dependencies
|
||||||
3. Scan for hardcoded secrets or credentials:
|
3. Run comprehensive dependency health check:
|
||||||
|
```bash
|
||||||
|
pnpm doctor
|
||||||
|
```
|
||||||
|
4. Scan for hardcoded secrets or credentials:
|
||||||
```bash
|
```bash
|
||||||
git log -p ${BASE_TAG}..HEAD | grep -iE "(password|key|secret|token)" || echo "No sensitive data found"
|
git log -p ${BASE_TAG}..HEAD | grep -iE "(password|key|secret|token)" || echo "No sensitive data found"
|
||||||
```
|
```
|
||||||
4. Verify no sensitive data in recent commits
|
5. Verify no sensitive data in recent commits
|
||||||
5. **SECURITY REVIEW**: Address any critical findings before proceeding?
|
6. **SECURITY REVIEW**: Address any critical findings before proceeding?
|
||||||
|
|
||||||
### Step 8: Pre-Release Testing
|
### Step 8: Pre-Release Testing
|
||||||
|
|
||||||
1. Run complete test suite:
|
1. Run complete test suite:
|
||||||
```bash
|
```bash
|
||||||
npm run test:unit
|
pnpm test:unit
|
||||||
npm run test:component
|
pnpm test:component
|
||||||
```
|
```
|
||||||
2. Run type checking:
|
2. Run type checking:
|
||||||
```bash
|
```bash
|
||||||
npm run typecheck
|
pnpm typecheck
|
||||||
```
|
```
|
||||||
3. Run linting (may have issues with missing packages):
|
3. Run linting (may have issues with missing packages):
|
||||||
```bash
|
```bash
|
||||||
npm run lint || echo "Lint issues - verify if critical"
|
pnpm lint || echo "Lint issues - verify if critical"
|
||||||
```
|
```
|
||||||
4. Test build process:
|
4. Test build process:
|
||||||
```bash
|
```bash
|
||||||
npm run build
|
pnpm build
|
||||||
npm run build:types
|
pnpm build:types
|
||||||
```
|
```
|
||||||
5. **QUALITY GATE**: All tests and builds passing?
|
5. **QUALITY GATE**: All tests and builds passing?
|
||||||
|
|
||||||
@@ -488,7 +537,7 @@ echo "Workflow triggered. Waiting for PR creation..."
|
|||||||
```bash
|
```bash
|
||||||
# Check npm availability
|
# Check npm availability
|
||||||
for i in {1..10}; do
|
for i in {1..10}; do
|
||||||
if npm view @comfyorg/comfyui-frontend-types@${NEW_VERSION} version >/dev/null 2>&1; then
|
if pnpm view @comfyorg/comfyui-frontend-types@${NEW_VERSION} version >/dev/null 2>&1; then
|
||||||
echo "✅ npm package available"
|
echo "✅ npm package available"
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ For each commit:
|
|||||||
- **CONFIRMATION REQUIRED**: Conflicts resolved correctly?
|
- **CONFIRMATION REQUIRED**: Conflicts resolved correctly?
|
||||||
3. After successful cherry-pick:
|
3. After successful cherry-pick:
|
||||||
- Show the changes: `git show HEAD`
|
- Show the changes: `git show HEAD`
|
||||||
- Run validation: `npm run typecheck && npm run lint`
|
- Run validation: `pnpm typecheck && pnpm lint`
|
||||||
4. **CONFIRMATION REQUIRED**: Cherry-pick successful and valid?
|
4. **CONFIRMATION REQUIRED**: Cherry-pick successful and valid?
|
||||||
|
|
||||||
### Step 6: Create PR to Core Branch
|
### Step 6: Create PR to Core Branch
|
||||||
@@ -197,7 +197,7 @@ For each commit:
|
|||||||
5. Track progress:
|
5. Track progress:
|
||||||
- GitHub release draft/publication
|
- GitHub release draft/publication
|
||||||
- PyPI upload
|
- PyPI upload
|
||||||
- npm types publication
|
- pnpm types publication
|
||||||
|
|
||||||
### Step 12: Post-Release Verification
|
### Step 12: Post-Release Verification
|
||||||
|
|
||||||
@@ -211,7 +211,7 @@ For each commit:
|
|||||||
```
|
```
|
||||||
3. Verify npm package:
|
3. Verify npm package:
|
||||||
```bash
|
```bash
|
||||||
npm view @comfyorg/comfyui-frontend-types@1.23.5
|
pnpm view @comfyorg/comfyui-frontend-types@1.23.5
|
||||||
```
|
```
|
||||||
4. Generate release summary with:
|
4. Generate release summary with:
|
||||||
- Version released
|
- Version released
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ Follow these steps systematically to verify our changes:
|
|||||||
|
|
||||||
1. **Server Setup**
|
1. **Server Setup**
|
||||||
- Check if the dev server is running on port 5173 using browser navigation or port checking
|
- Check if the dev server is running on port 5173 using browser navigation or port checking
|
||||||
- If not running, start it with `npm run dev` from the root directory
|
- If not running, start it with `pnpm dev` from the root directory
|
||||||
- If the server fails to start, provide detailed troubleshooting steps by reading package.json and README.md for accurate instructions
|
- If the server fails to start, provide detailed troubleshooting steps by reading package.json and README.md for accurate instructions
|
||||||
- Wait for the server to be fully ready before proceeding
|
- Wait for the server to be fully ready before proceeding
|
||||||
|
|
||||||
|
|||||||
13
.github/workflows/chromatic.yaml
vendored
13
.github/workflows/chromatic.yaml
vendored
@@ -21,11 +21,16 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0 # Required for Chromatic baseline
|
fetch-depth: 0 # Required for Chromatic baseline
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: '20'
|
node-version: '20'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Get current time
|
- name: Get current time
|
||||||
id: current-time
|
id: current-time
|
||||||
@@ -58,14 +63,14 @@ jobs:
|
|||||||
.cache
|
.cache
|
||||||
storybook-static
|
storybook-static
|
||||||
tsconfig.tsbuildinfo
|
tsconfig.tsbuildinfo
|
||||||
key: storybook-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('src/**/*.{ts,vue,js}', '*.config.*', '.storybook/**/*') }}
|
key: storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', '*.config.*', '.storybook/**/*') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
storybook-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}-
|
storybook-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-
|
||||||
storybook-cache-${{ runner.os }}-
|
storybook-cache-${{ runner.os }}-
|
||||||
storybook-tools-cache-${{ runner.os }}-
|
storybook-tools-cache-${{ runner.os }}-
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Build Storybook and run Chromatic
|
- name: Build Storybook and run Chromatic
|
||||||
id: chromatic
|
id: chromatic
|
||||||
|
|||||||
8
.github/workflows/claude-pr-review.yml
vendored
8
.github/workflows/claude-pr-review.yml
vendored
@@ -53,14 +53,20 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: '20'
|
node-version: '20'
|
||||||
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Install dependencies for analysis tools
|
- name: Install dependencies for analysis tools
|
||||||
run: |
|
run: |
|
||||||
npm install -g typescript @vue/compiler-sfc
|
pnpm install -g typescript @vue/compiler-sfc
|
||||||
|
|
||||||
- name: Run Claude PR Review
|
- name: Run Claude PR Review
|
||||||
uses: anthropics/claude-code-action@main
|
uses: anthropics/claude-code-action@main
|
||||||
|
|||||||
14
.github/workflows/dev-release.yaml
vendored
14
.github/workflows/dev-release.yaml
vendored
@@ -16,10 +16,14 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 'lts/*'
|
node-version: 'lts/*'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Cache tool outputs
|
- name: Cache tool outputs
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -28,7 +32,7 @@ jobs:
|
|||||||
.cache
|
.cache
|
||||||
dist
|
dist
|
||||||
tsconfig.tsbuildinfo
|
tsconfig.tsbuildinfo
|
||||||
key: dev-release-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
|
key: dev-release-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
dev-release-tools-cache-${{ runner.os }}-
|
dev-release-tools-cache-${{ runner.os }}-
|
||||||
|
|
||||||
@@ -42,9 +46,9 @@ jobs:
|
|||||||
ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
|
ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
|
||||||
USE_PROD_CONFIG: 'true'
|
USE_PROD_CONFIG: 'true'
|
||||||
run: |
|
run: |
|
||||||
npm ci
|
pnpm install --frozen-lockfile
|
||||||
npm run build
|
pnpm build
|
||||||
npm run zipdist
|
pnpm zipdist
|
||||||
- name: Upload dist artifact
|
- name: Upload dist artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
|
|||||||
15
.github/workflows/i18n-custom-nodes.yaml
vendored
15
.github/workflows/i18n-custom-nodes.yaml
vendored
@@ -42,9 +42,14 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
repository: ${{ inputs.owner }}/${{ inputs.repository }}
|
repository: ${{ inputs.owner }}/${{ inputs.repository }}
|
||||||
path: 'ComfyUI/custom_nodes/${{ inputs.repository }}'
|
path: 'ComfyUI/custom_nodes/${{ inputs.repository }}'
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 'lts/*'
|
node-version: 'lts/*'
|
||||||
|
cache: 'pnpm'
|
||||||
- uses: actions/setup-python@v4
|
- uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.10'
|
python-version: '3.10'
|
||||||
@@ -63,8 +68,8 @@ jobs:
|
|||||||
working-directory: ComfyUI/custom_nodes/${{ inputs.repository }}
|
working-directory: ComfyUI/custom_nodes/${{ inputs.repository }}
|
||||||
- name: Build & Install ComfyUI_frontend
|
- name: Build & Install ComfyUI_frontend
|
||||||
run: |
|
run: |
|
||||||
npm ci
|
pnpm install --frozen-lockfile
|
||||||
npm run build
|
pnpm build
|
||||||
rm -rf ../ComfyUI/web/*
|
rm -rf ../ComfyUI/web/*
|
||||||
mv dist/* ../ComfyUI/web/
|
mv dist/* ../ComfyUI/web/
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
@@ -79,18 +84,18 @@ jobs:
|
|||||||
- name: Start dev server
|
- name: Start dev server
|
||||||
# Run electron dev server as it is a superset of the web 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.
|
# We do want electron specific UIs to be translated.
|
||||||
run: npm run dev:electron &
|
run: pnpm dev:electron &
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
- name: Capture base i18n
|
- name: Capture base i18n
|
||||||
run: npx tsx scripts/diff-i18n capture
|
run: npx tsx scripts/diff-i18n capture
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
- name: Update en.json
|
- name: Update en.json
|
||||||
run: npm run collect-i18n
|
run: pnpm collect-i18n
|
||||||
env:
|
env:
|
||||||
PLAYWRIGHT_TEST_URL: http://localhost:5173
|
PLAYWRIGHT_TEST_URL: http://localhost:5173
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
- name: Update translations
|
- name: Update translations
|
||||||
run: npm run locale
|
run: pnpm locale
|
||||||
env:
|
env:
|
||||||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
|
|||||||
8
.github/workflows/i18n-node-defs.yaml
vendored
8
.github/workflows/i18n-node-defs.yaml
vendored
@@ -13,22 +13,22 @@ jobs:
|
|||||||
update-locales:
|
update-locales:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.3
|
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v3
|
||||||
- name: Install Playwright Browsers
|
- name: Install Playwright Browsers
|
||||||
run: npx playwright install chromium --with-deps
|
run: npx playwright install chromium --with-deps
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
- name: Start dev server
|
- name: Start dev server
|
||||||
# Run electron dev server as it is a superset of the web 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.
|
# We do want electron specific UIs to be translated.
|
||||||
run: npm run dev:electron &
|
run: pnpm dev:electron &
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
- name: Update en.json
|
- name: Update en.json
|
||||||
run: npm run collect-i18n -- scripts/collect-i18n-node-defs.ts
|
run: pnpm collect-i18n -- scripts/collect-i18n-node-defs.ts
|
||||||
env:
|
env:
|
||||||
PLAYWRIGHT_TEST_URL: http://localhost:5173
|
PLAYWRIGHT_TEST_URL: http://localhost:5173
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
- name: Update translations
|
- name: Update translations
|
||||||
run: npm run locale
|
run: pnpm locale
|
||||||
env:
|
env:
|
||||||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
|
|||||||
26
.github/workflows/i18n.yaml
vendored
26
.github/workflows/i18n.yaml
vendored
@@ -1,22 +1,20 @@
|
|||||||
name: Update Locales
|
name: Update Locales
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
# Manual dispatch for urgent translation updates
|
||||||
|
workflow_dispatch:
|
||||||
|
# Only trigger on PRs to main/master - additional branch filtering in job condition
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ main, master, dev* ]
|
branches: [ main ]
|
||||||
paths-ignore:
|
types: [opened, synchronize, reopened]
|
||||||
- '.github/**'
|
|
||||||
- '.husky/**'
|
|
||||||
- '.vscode/**'
|
|
||||||
- 'browser_tests/**'
|
|
||||||
- 'tests-ui/**'
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
update-locales:
|
update-locales:
|
||||||
# Don't run on fork PRs
|
# Branch detection: Only run for manual dispatch or version-bump-* branches from main repo
|
||||||
if: github.event.pull_request.head.repo.full_name == github.repository
|
if: github.event_name == 'workflow_dispatch' || (github.event.pull_request.head.repo.full_name == github.repository && startsWith(github.head_ref, 'version-bump-'))
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.3
|
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v3
|
||||||
|
|
||||||
- name: Cache tool outputs
|
- name: Cache tool outputs
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -24,7 +22,7 @@ jobs:
|
|||||||
path: |
|
path: |
|
||||||
ComfyUI_frontend/.cache
|
ComfyUI_frontend/.cache
|
||||||
ComfyUI_frontend/.cache
|
ComfyUI_frontend/.cache
|
||||||
key: i18n-tools-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/package-lock.json') }}
|
key: i18n-tools-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
i18n-tools-cache-${{ runner.os }}-
|
i18n-tools-cache-${{ runner.os }}-
|
||||||
- name: Install Playwright Browsers
|
- name: Install Playwright Browsers
|
||||||
@@ -33,15 +31,15 @@ jobs:
|
|||||||
- name: Start dev server
|
- name: Start dev server
|
||||||
# Run electron dev server as it is a superset of the web 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.
|
# We do want electron specific UIs to be translated.
|
||||||
run: npm run dev:electron &
|
run: pnpm dev:electron &
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
- name: Update en.json
|
- name: Update en.json
|
||||||
run: npm run collect-i18n -- scripts/collect-i18n-general.ts
|
run: pnpm collect-i18n -- scripts/collect-i18n-general.ts
|
||||||
env:
|
env:
|
||||||
PLAYWRIGHT_TEST_URL: http://localhost:5173
|
PLAYWRIGHT_TEST_URL: http://localhost:5173
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
- name: Update translations
|
- name: Update translations
|
||||||
run: npm run locale
|
run: pnpm locale
|
||||||
env:
|
env:
|
||||||
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
|
|||||||
25
.github/workflows/lint-and-format.yaml
vendored
25
.github/workflows/lint-and-format.yaml
vendored
@@ -19,11 +19,16 @@ jobs:
|
|||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- name: Use Node.js
|
- name: Use Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 'lts/*'
|
node-version: 'lts/*'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Cache tool outputs
|
- name: Cache tool outputs
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -34,20 +39,20 @@ jobs:
|
|||||||
tsconfig.tsbuildinfo
|
tsconfig.tsbuildinfo
|
||||||
.prettierCache
|
.prettierCache
|
||||||
.knip-cache
|
.knip-cache
|
||||||
key: lint-format-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('src/**/*.{ts,vue,js,mts}', '*.config.*', '.eslintrc.*', '.prettierrc.*', 'tsconfig.json') }}
|
key: lint-format-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js,mts}', '*.config.*', '.eslintrc.*', '.prettierrc.*', 'tsconfig.json') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
lint-format-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}-
|
lint-format-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-
|
||||||
lint-format-cache-${{ runner.os }}-
|
lint-format-cache-${{ runner.os }}-
|
||||||
ci-tools-cache-${{ runner.os }}-
|
ci-tools-cache-${{ runner.os }}-
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Run ESLint with auto-fix
|
- name: Run ESLint with auto-fix
|
||||||
run: npm run lint:fix
|
run: pnpm lint:fix
|
||||||
|
|
||||||
- name: Run Prettier with auto-format
|
- name: Run Prettier with auto-format
|
||||||
run: npm run format
|
run: pnpm format
|
||||||
|
|
||||||
- name: Check for changes
|
- name: Check for changes
|
||||||
id: verify-changed-files
|
id: verify-changed-files
|
||||||
@@ -69,9 +74,9 @@ jobs:
|
|||||||
|
|
||||||
- name: Final validation
|
- name: Final validation
|
||||||
run: |
|
run: |
|
||||||
npm run lint
|
pnpm lint
|
||||||
npm run format:check
|
pnpm format:check
|
||||||
npm run knip
|
pnpm knip
|
||||||
|
|
||||||
- name: Comment on PR about auto-fix
|
- name: Comment on PR about auto-fix
|
||||||
if: steps.verify-changed-files.outputs.changed == 'true' && github.event.pull_request.head.repo.full_name == github.repository
|
if: steps.verify-changed-files.outputs.changed == 'true' && github.event.pull_request.head.repo.full_name == github.repository
|
||||||
@@ -96,5 +101,5 @@ jobs:
|
|||||||
issue_number: context.issue.number,
|
issue_number: context.issue.number,
|
||||||
owner: context.repo.owner,
|
owner: context.repo.owner,
|
||||||
repo: context.repo.repo,
|
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\nnpm run prepare\n```\n\n### Option 2: Fix manually\nRun these commands and push the changes:\n```bash\nnpm run lint:fix\nnpm run format\n```\n\nSee [CONTRIBUTING.md](https://github.com/Comfy-Org/ComfyUI_frontend/blob/main/CONTRIBUTING.md#git-pre-commit-hooks) for more details.'
|
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.'
|
||||||
})
|
})
|
||||||
28
.github/workflows/release.yaml
vendored
28
.github/workflows/release.yaml
vendored
@@ -19,10 +19,14 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 'lts/*'
|
node-version: 'lts/*'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Cache tool outputs
|
- name: Cache tool outputs
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -30,7 +34,7 @@ jobs:
|
|||||||
path: |
|
path: |
|
||||||
.cache
|
.cache
|
||||||
tsconfig.tsbuildinfo
|
tsconfig.tsbuildinfo
|
||||||
key: release-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
|
key: release-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
release-tools-cache-${{ runner.os }}-
|
release-tools-cache-${{ runner.os }}-
|
||||||
|
|
||||||
@@ -53,9 +57,9 @@ jobs:
|
|||||||
ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
|
ALGOLIA_API_KEY: ${{ secrets.ALGOLIA_API_KEY }}
|
||||||
USE_PROD_CONFIG: 'true'
|
USE_PROD_CONFIG: 'true'
|
||||||
run: |
|
run: |
|
||||||
npm ci
|
pnpm install --frozen-lockfile
|
||||||
npm run build
|
pnpm build
|
||||||
npm run zipdist
|
pnpm zipdist
|
||||||
- name: Upload dist artifact
|
- name: Upload dist artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
@@ -125,10 +129,14 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 'lts/*'
|
node-version: 'lts/*'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
registry-url: https://registry.npmjs.org
|
registry-url: https://registry.npmjs.org
|
||||||
|
|
||||||
- name: Cache tool outputs
|
- name: Cache tool outputs
|
||||||
@@ -138,14 +146,14 @@ jobs:
|
|||||||
.cache
|
.cache
|
||||||
tsconfig.tsbuildinfo
|
tsconfig.tsbuildinfo
|
||||||
dist
|
dist
|
||||||
key: types-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
|
key: types-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
types-tools-cache-${{ runner.os }}-
|
types-tools-cache-${{ runner.os }}-
|
||||||
|
|
||||||
- run: npm ci
|
- run: pnpm install --frozen-lockfile
|
||||||
- run: npm run build:types
|
- run: pnpm build:types
|
||||||
- name: Publish package
|
- name: Publish package
|
||||||
run: npm publish --access public
|
run: pnpm publish --access public
|
||||||
working-directory: dist
|
working-directory: dist
|
||||||
env:
|
env:
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
|||||||
2
.github/workflows/test-browser-exp.yaml
vendored
2
.github/workflows/test-browser-exp.yaml
vendored
@@ -10,7 +10,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: github.event.label.name == 'New Browser Test Expectations'
|
if: github.event.label.name == 'New Browser Test Expectations'
|
||||||
steps:
|
steps:
|
||||||
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v2.3
|
- uses: Comfy-Org/ComfyUI_frontend_setup_action@v3
|
||||||
- name: Install Playwright Browsers
|
- name: Install Playwright Browsers
|
||||||
run: npx playwright install chromium --with-deps
|
run: npx playwright install chromium --with-deps
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
|
|||||||
32
.github/workflows/test-ui.yaml
vendored
32
.github/workflows/test-ui.yaml
vendored
@@ -37,11 +37,16 @@ jobs:
|
|||||||
path: 'ComfyUI/custom_nodes/ComfyUI_devtools'
|
path: 'ComfyUI/custom_nodes/ComfyUI_devtools'
|
||||||
ref: 'd05fd48dd787a4192e16802d4244cfcc0e2f9684'
|
ref: 'd05fd48dd787a4192e16802d4244cfcc0e2f9684'
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- uses: actions/setup-node@v4
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: lts/*
|
node-version: lts/*
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
cache-dependency-path: 'ComfyUI_frontend/package-lock.json'
|
cache-dependency-path: 'ComfyUI_frontend/pnpm-lock.yaml'
|
||||||
|
|
||||||
- name: Get current time
|
- name: Get current time
|
||||||
id: current-time
|
id: current-time
|
||||||
@@ -61,7 +66,7 @@ jobs:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<img alt='claude-loading-gif' src="https://github.com/user-attachments/assets/5ac382c7-e004-429b-8e35-7feb3e8f9c6f" width="14px" height="14px" style="vertical-align: middle; margin-left: 4px;" />
|
<img alt='comfy-loading-gif' src="https://github.com/user-attachments/assets/755c86ee-e445-4ea8-bc2c-cca85df48686" width="14px" height="14px" style="vertical-align: middle; margin-left: 4px;" />
|
||||||
<bold>[${{ steps.current-time.outputs.time }} UTC] Preparing browser tests across multiple browsers...</bold>
|
<bold>[${{ steps.current-time.outputs.time }} UTC] Preparing browser tests across multiple browsers...</bold>
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -73,16 +78,16 @@ jobs:
|
|||||||
path: |
|
path: |
|
||||||
ComfyUI_frontend/.cache
|
ComfyUI_frontend/.cache
|
||||||
ComfyUI_frontend/tsconfig.tsbuildinfo
|
ComfyUI_frontend/tsconfig.tsbuildinfo
|
||||||
key: playwright-setup-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/package-lock.json') }}-${{ hashFiles('ComfyUI_frontend/src/**/*.{ts,vue,js}', 'ComfyUI_frontend/*.config.*') }}
|
key: playwright-setup-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }}-${{ hashFiles('ComfyUI_frontend/src/**/*.{ts,vue,js}', 'ComfyUI_frontend/*.config.*') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
playwright-setup-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/package-lock.json') }}-
|
playwright-setup-cache-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }}-
|
||||||
playwright-setup-cache-${{ runner.os }}-
|
playwright-setup-cache-${{ runner.os }}-
|
||||||
playwright-tools-cache-${{ runner.os }}-
|
playwright-tools-cache-${{ runner.os }}-
|
||||||
|
|
||||||
- name: Build ComfyUI_frontend
|
- name: Build ComfyUI_frontend
|
||||||
run: |
|
run: |
|
||||||
npm ci
|
pnpm install --frozen-lockfile
|
||||||
npm run build
|
pnpm build
|
||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
|
|
||||||
- name: Generate cache key
|
- name: Generate cache key
|
||||||
@@ -129,6 +134,11 @@ jobs:
|
|||||||
ComfyUI_frontend
|
ComfyUI_frontend
|
||||||
key: comfyui-setup-${{ needs.setup.outputs.cache-key }}
|
key: comfyui-setup-${{ needs.setup.outputs.cache-key }}
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- uses: actions/setup-python@v4
|
- uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: '3.10'
|
python-version: '3.10'
|
||||||
@@ -158,7 +168,7 @@ jobs:
|
|||||||
comment-author: 'github-actions[bot]'
|
comment-author: 'github-actions[bot]'
|
||||||
edit-mode: append
|
edit-mode: append
|
||||||
body: |
|
body: |
|
||||||
<img alt='claude-loading-gif' src="https://github.com/user-attachments/assets/5ac382c7-e004-429b-8e35-7feb3e8f9c6f" width="14px" height="14px" style="vertical-align: middle; margin-left: 4px;" />
|
<img alt='comfy-loading-gif' src="https://github.com/user-attachments/assets/755c86ee-e445-4ea8-bc2c-cca85df48686" width="14px" height="14px" style="vertical-align: middle; margin-left: 4px;" />
|
||||||
<bold>${{ matrix.browser }}</bold>: Running tests...
|
<bold>${{ matrix.browser }}</bold>: Running tests...
|
||||||
|
|
||||||
- name: Install requirements
|
- name: Install requirements
|
||||||
@@ -179,9 +189,9 @@ jobs:
|
|||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: ~/.cache/ms-playwright
|
path: ~/.cache/ms-playwright
|
||||||
key: playwright-browsers-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/package-lock.json') }}-${{ matrix.browser }}
|
key: playwright-browsers-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }}-${{ matrix.browser }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
playwright-browsers-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/package-lock.json') }}-
|
playwright-browsers-${{ runner.os }}-${{ hashFiles('ComfyUI_frontend/pnpm-lock.yaml') }}-
|
||||||
playwright-browsers-${{ runner.os }}-
|
playwright-browsers-${{ runner.os }}-
|
||||||
|
|
||||||
- name: Install Playwright Browsers
|
- name: Install Playwright Browsers
|
||||||
@@ -189,7 +199,7 @@ jobs:
|
|||||||
working-directory: ComfyUI_frontend
|
working-directory: ComfyUI_frontend
|
||||||
|
|
||||||
- name: Install Wrangler
|
- name: Install Wrangler
|
||||||
run: npm install -g wrangler
|
run: pnpm install -g wrangler
|
||||||
|
|
||||||
- name: Run Playwright tests (${{ matrix.browser }})
|
- name: Run Playwright tests (${{ matrix.browser }})
|
||||||
id: playwright
|
id: playwright
|
||||||
|
|||||||
13
.github/workflows/update-electron-types.yaml
vendored
13
.github/workflows/update-electron-types.yaml
vendored
@@ -14,28 +14,33 @@ jobs:
|
|||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: lts/*
|
node-version: lts/*
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Cache tool outputs
|
- name: Cache tool outputs
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
.cache
|
.cache
|
||||||
key: electron-types-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
|
key: electron-types-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
electron-types-tools-cache-${{ runner.os }}-
|
electron-types-tools-cache-${{ runner.os }}-
|
||||||
|
|
||||||
- name: Update electron types
|
- name: Update electron types
|
||||||
run: npm install @comfyorg/comfyui-electron-types@latest
|
run: pnpm install @comfyorg/comfyui-electron-types@latest
|
||||||
|
|
||||||
- name: Get new version
|
- name: Get new version
|
||||||
id: get-version
|
id: get-version
|
||||||
run: |
|
run: |
|
||||||
NEW_VERSION=$(node -e "console.log(JSON.parse(require('fs').readFileSync('./package-lock.json')).packages['node_modules/@comfyorg/comfyui-electron-types'].version)")
|
NEW_VERSION=$(node -e "console.log(JSON.parse(require('fs').readFileSync('./pnpm-lock.yaml')).packages['node_modules/@comfyorg/comfyui-electron-types'].version)")
|
||||||
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT
|
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
|
|||||||
13
.github/workflows/update-manager-types.yaml
vendored
13
.github/workflows/update-manager-types.yaml
vendored
@@ -19,23 +19,28 @@ jobs:
|
|||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: lts/*
|
node-version: lts/*
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Cache tool outputs
|
- name: Cache tool outputs
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
.cache
|
.cache
|
||||||
key: update-manager-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
|
key: update-manager-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
update-manager-tools-cache-${{ runner.os }}-
|
update-manager-tools-cache-${{ runner.os }}-
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Cache ComfyUI-Manager repository
|
- name: Cache ComfyUI-Manager repository
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -81,7 +86,7 @@ jobs:
|
|||||||
- name: Lint generated types
|
- name: Lint generated types
|
||||||
run: |
|
run: |
|
||||||
echo "Linting generated ComfyUI-Manager API types..."
|
echo "Linting generated ComfyUI-Manager API types..."
|
||||||
npm run lint:fix:no-cache -- ./src/types/generatedManagerTypes.ts
|
pnpm lint:fix:no-cache -- ./src/types/generatedManagerTypes.ts
|
||||||
|
|
||||||
- name: Check for changes
|
- name: Check for changes
|
||||||
id: check-changes
|
id: check-changes
|
||||||
|
|||||||
13
.github/workflows/update-registry-types.yaml
vendored
13
.github/workflows/update-registry-types.yaml
vendored
@@ -18,23 +18,28 @@ jobs:
|
|||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: lts/*
|
node-version: lts/*
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Cache tool outputs
|
- name: Cache tool outputs
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
.cache
|
.cache
|
||||||
key: update-registry-tools-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}
|
key: update-registry-tools-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
update-registry-tools-cache-${{ runner.os }}-
|
update-registry-tools-cache-${{ runner.os }}-
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Cache comfy-api repository
|
- name: Cache comfy-api repository
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -81,7 +86,7 @@ jobs:
|
|||||||
- name: Lint generated types
|
- name: Lint generated types
|
||||||
run: |
|
run: |
|
||||||
echo "Linting generated Comfy Registry API types..."
|
echo "Linting generated Comfy Registry API types..."
|
||||||
npm run lint:fix:no-cache -- ./src/types/comfyRegistryTypes.ts
|
pnpm lint:fix:no-cache -- ./src/types/comfyRegistryTypes.ts
|
||||||
|
|
||||||
- name: Check for changes
|
- name: Check for changes
|
||||||
id: check-changes
|
id: check-changes
|
||||||
|
|||||||
9
.github/workflows/version-bump.yaml
vendored
9
.github/workflows/version-bump.yaml
vendored
@@ -26,16 +26,21 @@ jobs:
|
|||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: lts/*
|
node-version: lts/*
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Bump version
|
- name: Bump version
|
||||||
id: bump-version
|
id: bump-version
|
||||||
run: |
|
run: |
|
||||||
npm version ${{ github.event.inputs.version_type }} --preid ${{ github.event.inputs.pre_release }} --no-git-tag-version
|
pnpm version ${{ github.event.inputs.version_type }} --preid ${{ github.event.inputs.pre_release }} --no-git-tag-version
|
||||||
NEW_VERSION=$(node -p "require('./package.json').version")
|
NEW_VERSION=$(node -p "require('./package.json').version")
|
||||||
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT
|
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
|||||||
17
.github/workflows/vitest.yaml
vendored
17
.github/workflows/vitest.yaml
vendored
@@ -13,11 +13,16 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v4
|
||||||
|
with:
|
||||||
|
version: 10
|
||||||
|
|
||||||
- name: Use Node.js
|
- name: Use Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: 'lts/*'
|
node-version: 'lts/*'
|
||||||
cache: 'npm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Cache tool outputs
|
- name: Cache tool outputs
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -26,16 +31,16 @@ jobs:
|
|||||||
.cache
|
.cache
|
||||||
coverage
|
coverage
|
||||||
.vitest-cache
|
.vitest-cache
|
||||||
key: vitest-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('src/**/*.{ts,vue,js}', 'vitest.config.*', 'tsconfig.json') }}
|
key: vitest-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ hashFiles('src/**/*.{ts,vue,js}', 'vitest.config.*', 'tsconfig.json') }}
|
||||||
restore-keys: |
|
restore-keys: |
|
||||||
vitest-cache-${{ runner.os }}-${{ hashFiles('**/package-lock.json') }}-
|
vitest-cache-${{ runner.os }}-${{ hashFiles('**/pnpm-lock.yaml') }}-
|
||||||
vitest-cache-${{ runner.os }}-
|
vitest-cache-${{ runner.os }}-
|
||||||
test-tools-cache-${{ runner.os }}-
|
test-tools-cache-${{ runner.os }}-
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: npm ci
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Run Vitest tests
|
- name: Run Vitest tests
|
||||||
run: |
|
run: |
|
||||||
npm run test:component
|
pnpm test:component
|
||||||
npm run test:unit
|
pnpm test:unit
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -10,7 +10,6 @@ lerna-debug.log*
|
|||||||
# Package manager lockfiles (allow users to use different package managers)
|
# Package manager lockfiles (allow users to use different package managers)
|
||||||
bun.lock
|
bun.lock
|
||||||
bun.lockb
|
bun.lockb
|
||||||
pnpm-lock.yaml
|
|
||||||
yarn.lock
|
yarn.lock
|
||||||
|
|
||||||
# Cache files
|
# Cache files
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
## Quick Commands
|
## Quick Commands
|
||||||
|
|
||||||
- `npm run storybook`: Start Storybook development server
|
- `pnpm storybook`: Start Storybook development server
|
||||||
- `npm run build-storybook`: Build static Storybook
|
- `pnpm build-storybook`: Build static Storybook
|
||||||
- `npm run test:component`: Run component tests (includes Storybook components)
|
- `pnpm test:component`: Run component tests (includes Storybook components)
|
||||||
|
|
||||||
## Development Workflow for Storybook
|
## Development Workflow for Storybook
|
||||||
|
|
||||||
@@ -19,8 +19,8 @@
|
|||||||
- Ensure proper theming and styling
|
- Ensure proper theming and styling
|
||||||
|
|
||||||
3. **Code Quality**:
|
3. **Code Quality**:
|
||||||
- Run `npm run typecheck` to verify TypeScript
|
- Run `pnpm typecheck` to verify TypeScript
|
||||||
- Run `npm run lint` to check for linting issues
|
- Run `pnpm lint` to check for linting issues
|
||||||
- Follow existing story patterns and conventions
|
- Follow existing story patterns and conventions
|
||||||
|
|
||||||
## Story Creation Guidelines
|
## Story Creation Guidelines
|
||||||
@@ -138,13 +138,13 @@ The Storybook preview is configured with:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Check TypeScript issues
|
# Check TypeScript issues
|
||||||
npm run typecheck
|
pnpm typecheck
|
||||||
|
|
||||||
# Lint Storybook files
|
# Lint Storybook files
|
||||||
npm run lint .storybook/
|
pnpm lint .storybook/
|
||||||
|
|
||||||
# Build to check for production issues
|
# Build to check for production issues
|
||||||
npm run build-storybook
|
pnpm build-storybook
|
||||||
```
|
```
|
||||||
|
|
||||||
## File Organization
|
## File Organization
|
||||||
|
|||||||
@@ -40,10 +40,10 @@ Storybook is a frontend workshop for building UI components and pages in isolati
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Start Storybook development server
|
# Start Storybook development server
|
||||||
npm run storybook
|
pnpm storybook
|
||||||
|
|
||||||
# Build static Storybook for deployment
|
# Build static Storybook for deployment
|
||||||
npm run build-storybook
|
pnpm build-storybook
|
||||||
```
|
```
|
||||||
|
|
||||||
### Creating Stories
|
### Creating Stories
|
||||||
|
|||||||
22
AGENTS.md
22
AGENTS.md
@@ -8,19 +8,19 @@
|
|||||||
- Config: `vite.config.mts`, `vitest.config.ts`, `playwright.config.ts`, `eslint.config.js`, `.prettierrc`.
|
- Config: `vite.config.mts`, `vitest.config.ts`, `playwright.config.ts`, `eslint.config.js`, `.prettierrc`.
|
||||||
|
|
||||||
## Build, Test, and Development Commands
|
## Build, Test, and Development Commands
|
||||||
- `npm run dev`: Start Vite dev server.
|
- `pnpm dev`: Start Vite dev server.
|
||||||
- `npm run dev:electron`: Dev server with Electron API mocks.
|
- `pnpm dev:electron`: Dev server with Electron API mocks.
|
||||||
- `npm run build`: Type-check then production build to `dist/`.
|
- `pnpm build`: Type-check then production build to `dist/`.
|
||||||
- `npm run preview`: Preview the production build locally.
|
- `pnpm preview`: Preview the production build locally.
|
||||||
- `npm run test:unit`: Run Vitest unit tests (`tests-ui/`).
|
- `pnpm test:unit`: Run Vitest unit tests (`tests-ui/`).
|
||||||
- `npm run test:component`: Run component tests (`src/components/`).
|
- `pnpm test:component`: Run component tests (`src/components/`).
|
||||||
- `npm run test:browser`: Run Playwright E2E tests (`browser_tests/`).
|
- `pnpm test:browser`: Run Playwright E2E tests (`browser_tests/`).
|
||||||
- `npm run lint` / `npm run lint:fix`: Lint (ESLint). `npm run format` / `format:check`: Prettier.
|
- `pnpm lint` / `pnpm lint:fix`: Lint (ESLint). `pnpm format` / `format:check`: Prettier.
|
||||||
- `npm run typecheck`: Vue TSC type checking.
|
- `pnpm typecheck`: Vue TSC type checking.
|
||||||
|
|
||||||
## Coding Style & Naming Conventions
|
## Coding Style & Naming Conventions
|
||||||
- Language: TypeScript, Vue SFCs (`.vue`). Indent 2 spaces; single quotes; no semicolons; width 80 (see `.prettierrc`).
|
- Language: TypeScript, Vue SFCs (`.vue`). Indent 2 spaces; single quotes; no semicolons; width 80 (see `.prettierrc`).
|
||||||
- Imports: sorted/grouped by plugin; run `npm run format` before committing.
|
- Imports: sorted/grouped by plugin; run `pnpm format` before committing.
|
||||||
- ESLint: Vue + TS rules; no floating promises; unused imports disallowed; i18n raw text restrictions in templates.
|
- ESLint: Vue + TS rules; no floating promises; unused imports disallowed; i18n raw text restrictions in templates.
|
||||||
- Naming: Vue components in PascalCase (e.g., `MenuHamburger.vue`); composables `useXyz.ts`; Pinia stores `*Store.ts`.
|
- Naming: Vue components in PascalCase (e.g., `MenuHamburger.vue`); composables `useXyz.ts`; Pinia stores `*Store.ts`.
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@
|
|||||||
## Commit & Pull Request Guidelines
|
## Commit & Pull Request Guidelines
|
||||||
- Commits: Prefer Conventional Commits (e.g., `feat(ui): add sidebar`), `refactor(litegraph): …`. Use `[skip ci]` for locale-only updates when appropriate.
|
- Commits: Prefer Conventional Commits (e.g., `feat(ui): add sidebar`), `refactor(litegraph): …`. Use `[skip ci]` for locale-only updates when appropriate.
|
||||||
- PRs: Include clear description, linked issues (`Fixes #123`), and screenshots/GIFs for UI changes. Add/adjust tests and i18n strings when applicable.
|
- PRs: Include clear description, linked issues (`Fixes #123`), and screenshots/GIFs for UI changes. Add/adjust tests and i18n strings when applicable.
|
||||||
- Quality gates: `npm run lint`, `npm run typecheck`, and relevant tests must pass. Keep PRs focused and small.
|
- Quality gates: `pnpm lint`, `pnpm typecheck`, and relevant tests must pass. Keep PRs focused and small.
|
||||||
|
|
||||||
## Security & Configuration Tips
|
## Security & Configuration Tips
|
||||||
- Secrets: Use `.env` (see `.env_example`); do not commit secrets.
|
- Secrets: Use `.env` (see `.env_example`); do not commit secrets.
|
||||||
|
|||||||
14
CLAUDE.md
14
CLAUDE.md
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
## Quick Commands
|
## Quick Commands
|
||||||
|
|
||||||
- `npm run`: See all available commands
|
- `pnpm`: See all available commands
|
||||||
- `npm run typecheck`: Type checking
|
- `pnpm typecheck`: Type checking
|
||||||
- `npm run lint`: Linting
|
- `pnpm lint`: Linting
|
||||||
- `npm run format`: Prettier formatting
|
- `pnpm format`: Prettier formatting
|
||||||
- `npm run test:component`: Run component tests with browser environment
|
- `pnpm test:component`: Run component tests with browser environment
|
||||||
- `npm run test:unit`: Run all unit tests
|
- `pnpm test:unit`: Run all unit tests
|
||||||
- `npm run test:unit -- tests-ui/tests/example.test.ts`: Run single test file
|
- `pnpm test:unit -- tests-ui/tests/example.test.ts`: Run single test file
|
||||||
|
|
||||||
## Development Workflow
|
## Development Workflow
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ Have another idea? Drop into Discord or open an issue, and let's chat!
|
|||||||
### Prerequisites & Technology Stack
|
### Prerequisites & Technology Stack
|
||||||
|
|
||||||
- **Required Software**:
|
- **Required Software**:
|
||||||
- Node.js (v16 or later; v20/v22 strongly recommended) and npm
|
- Node.js (v16 or later; v24 strongly recommended) and pnpm
|
||||||
- Git for version control
|
- Git for version control
|
||||||
- A running ComfyUI backend instance
|
- A running ComfyUI backend instance
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ Have another idea? Drop into Discord or open an issue, and let's chat!
|
|||||||
|
|
||||||
2. Install dependencies:
|
2. Install dependencies:
|
||||||
```bash
|
```bash
|
||||||
npm install
|
pnpm install
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Configure environment (optional):
|
3. Configure environment (optional):
|
||||||
@@ -57,13 +57,13 @@ python main.py --port 8188
|
|||||||
|
|
||||||
### Git pre-commit hooks
|
### Git pre-commit hooks
|
||||||
|
|
||||||
Run `npm run prepare` to install Git pre-commit hooks. Currently, the pre-commit hook is used to auto-format code on commit.
|
Run `pnpm prepare` to install Git pre-commit hooks. Currently, the pre-commit hook is used to auto-format code on commit.
|
||||||
|
|
||||||
### Dev Server
|
### Dev Server
|
||||||
|
|
||||||
- Start local ComfyUI backend at `localhost:8188`
|
- Start local ComfyUI backend at `localhost:8188`
|
||||||
- Run `npm run dev` to start the dev server
|
- Run `pnpm dev` to start the dev server
|
||||||
- Run `npm run dev:electron` to start the dev server with electron API mocked
|
- Run `pnpm dev:electron` to start the dev server with electron API mocked
|
||||||
|
|
||||||
#### Access dev server on touch devices
|
#### Access dev server on touch devices
|
||||||
|
|
||||||
@@ -155,7 +155,7 @@ For ComfyUI_frontend development, you can ask coding assistants to use Playwrigh
|
|||||||
|
|
||||||
##### Setup for Claude Code
|
##### Setup for Claude Code
|
||||||
|
|
||||||
After installing dependencies with `npm i`, the Playwright MCP server will be automatically available when you start Claude Code locally.
|
After installing dependencies with `pnpm i`, the Playwright MCP server will be automatically available when you start Claude Code locally.
|
||||||
|
|
||||||
Here's how Claude Code can use the Playwright MCP server to inspect the interface of the local development server (assuming you're running the dev server at `localhost:5173`):
|
Here's how Claude Code can use the Playwright MCP server to inspect the interface of the local development server (assuming you're running the dev server at `localhost:5173`):
|
||||||
|
|
||||||
@@ -210,14 +210,14 @@ Here's how Claude Code can use the Playwright MCP server to inspect the interfac
|
|||||||
|
|
||||||
### Unit Tests
|
### Unit Tests
|
||||||
|
|
||||||
- `npm i` to install all dependencies
|
- `pnpm i` to install all dependencies
|
||||||
- `npm run test:unit` to execute all unit tests
|
- `pnpm test:unit` to execute all unit tests
|
||||||
|
|
||||||
### Component Tests
|
### Component Tests
|
||||||
|
|
||||||
Component tests verify Vue components in `src/components/`.
|
Component tests verify Vue components in `src/components/`.
|
||||||
|
|
||||||
- `npm run test:component` to execute all component tests
|
- `pnpm test:component` to execute all component tests
|
||||||
|
|
||||||
### Playwright Tests
|
### Playwright Tests
|
||||||
|
|
||||||
@@ -228,12 +228,12 @@ Playwright tests verify the whole app. See [browser_tests/README.md](browser_tes
|
|||||||
Before submitting a PR, ensure all tests pass:
|
Before submitting a PR, ensure all tests pass:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm run test:unit
|
pnpm test:unit
|
||||||
npm run test:component
|
pnpm test:component
|
||||||
npm run test:browser
|
pnpm test:browser
|
||||||
npm run typecheck
|
pnpm typecheck
|
||||||
npm run lint
|
pnpm lint
|
||||||
npm run format
|
pnpm format
|
||||||
```
|
```
|
||||||
|
|
||||||
## Code Style Guidelines
|
## Code Style Guidelines
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ test.describe('Selection Toolbox', () => {
|
|||||||
const boundingBox = await toolboxContainer.boundingBox()
|
const boundingBox = await toolboxContainer.boundingBox()
|
||||||
expect(boundingBox).not.toBeNull()
|
expect(boundingBox).not.toBeNull()
|
||||||
// Canvas-based positioning can vary, just verify toolbox appears in reasonable bounds
|
// Canvas-based positioning can vary, just verify toolbox appears in reasonable bounds
|
||||||
expect(boundingBox!.x).toBeGreaterThan(-100) // Not too far off-screen left
|
expect(boundingBox!.x).toBeGreaterThan(-200) // Not too far off-screen left
|
||||||
expect(boundingBox!.x).toBeLessThan(1000) // Not too far off-screen right
|
expect(boundingBox!.x).toBeLessThan(1000) // Not too far off-screen right
|
||||||
expect(boundingBox!.y).toBeGreaterThan(-100) // Not too far off-screen top
|
expect(boundingBox!.y).toBeGreaterThan(-100) // Not too far off-screen top
|
||||||
})
|
})
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 103 KiB After Width: | Height: | Size: 103 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 103 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 99 KiB |
@@ -105,7 +105,7 @@ The alternative would have been breaking all existing extensions or staying with
|
|||||||
|
|
||||||
Build the frontend for full functionality:
|
Build the frontend for full functionality:
|
||||||
```bash
|
```bash
|
||||||
npm run build
|
pnpm build
|
||||||
```
|
```
|
||||||
|
|
||||||
For faster iteration during development, use watch mode:
|
For faster iteration during development, use watch mode:
|
||||||
|
|||||||
19797
package-lock.json
generated
19797
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
19
package.json
19
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@comfyorg/comfyui-frontend",
|
"name": "@comfyorg/comfyui-frontend",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.26.6",
|
"version": "1.26.7",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"repository": "https://github.com/Comfy-Org/ComfyUI_frontend",
|
"repository": "https://github.com/Comfy-Org/ComfyUI_frontend",
|
||||||
"homepage": "https://comfy.org",
|
"homepage": "https://comfy.org",
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite",
|
"dev": "vite",
|
||||||
"dev:electron": "vite --config vite.electron.config.mts",
|
"dev:electron": "vite --config vite.electron.config.mts",
|
||||||
"build": "npm run typecheck && vite build",
|
"build": "pnpm typecheck && vite build",
|
||||||
"build:types": "vite build --config vite.types.config.mts && node scripts/prepare-types.js",
|
"build:types": "vite build --config vite.types.config.mts && node scripts/prepare-types.js",
|
||||||
"zipdist": "node scripts/zipdist.js",
|
"zipdist": "node scripts/zipdist.js",
|
||||||
"typecheck": "vue-tsc --noEmit",
|
"typecheck": "vue-tsc --noEmit",
|
||||||
@@ -21,6 +21,7 @@
|
|||||||
"test:browser": "npx playwright test",
|
"test:browser": "npx playwright test",
|
||||||
"test:unit": "vitest run tests-ui/tests",
|
"test:unit": "vitest run tests-ui/tests",
|
||||||
"test:component": "vitest run src/components/",
|
"test:component": "vitest run src/components/",
|
||||||
|
"preinstall": "npx only-allow pnpm",
|
||||||
"prepare": "husky || true && git config blame.ignoreRevsFile .git-blame-ignore-revs || true",
|
"prepare": "husky || true && git config blame.ignoreRevsFile .git-blame-ignore-revs || true",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"lint": "eslint src --cache",
|
"lint": "eslint src --cache",
|
||||||
@@ -45,6 +46,7 @@
|
|||||||
"@pinia/testing": "^0.1.5",
|
"@pinia/testing": "^0.1.5",
|
||||||
"@playwright/test": "^1.52.0",
|
"@playwright/test": "^1.52.0",
|
||||||
"@storybook/addon-docs": "^9.1.1",
|
"@storybook/addon-docs": "^9.1.1",
|
||||||
|
"@storybook/vue3": "^9.1.1",
|
||||||
"@storybook/vue3-vite": "^9.1.1",
|
"@storybook/vue3-vite": "^9.1.1",
|
||||||
"@trivago/prettier-plugin-sort-imports": "^5.2.0",
|
"@trivago/prettier-plugin-sort-imports": "^5.2.0",
|
||||||
"@types/dompurify": "^3.0.5",
|
"@types/dompurify": "^3.0.5",
|
||||||
@@ -56,6 +58,7 @@
|
|||||||
"@vue/test-utils": "^2.4.6",
|
"@vue/test-utils": "^2.4.6",
|
||||||
"autoprefixer": "^10.4.19",
|
"autoprefixer": "^10.4.19",
|
||||||
"chalk": "^5.3.0",
|
"chalk": "^5.3.0",
|
||||||
|
"commander": "^14.0.0",
|
||||||
"eslint": "^9.12.0",
|
"eslint": "^9.12.0",
|
||||||
"eslint-config-prettier": "^10.1.2",
|
"eslint-config-prettier": "^10.1.2",
|
||||||
"eslint-plugin-prettier": "^5.2.6",
|
"eslint-plugin-prettier": "^5.2.6",
|
||||||
@@ -67,11 +70,14 @@
|
|||||||
"happy-dom": "^15.11.0",
|
"happy-dom": "^15.11.0",
|
||||||
"husky": "^9.0.11",
|
"husky": "^9.0.11",
|
||||||
"identity-obj-proxy": "^3.0.0",
|
"identity-obj-proxy": "^3.0.0",
|
||||||
|
"ink": "^4.2.0",
|
||||||
"knip": "^5.62.0",
|
"knip": "^5.62.0",
|
||||||
"lint-staged": "^15.2.7",
|
"lint-staged": "^15.2.7",
|
||||||
"lucide-vue-next": "^0.540.0",
|
"lucide-vue-next": "^0.540.0",
|
||||||
"postcss": "^8.4.39",
|
"postcss": "^8.4.39",
|
||||||
"prettier": "^3.3.2",
|
"prettier": "^3.3.2",
|
||||||
|
"react": "^18.3.1",
|
||||||
|
"react-reconciler": "^0.29.2",
|
||||||
"storybook": "^9.1.1",
|
"storybook": "^9.1.1",
|
||||||
"tailwindcss": "^3.4.4",
|
"tailwindcss": "^3.4.4",
|
||||||
"tsx": "^4.15.6",
|
"tsx": "^4.15.6",
|
||||||
@@ -79,6 +85,7 @@
|
|||||||
"typescript-eslint": "^8.0.0",
|
"typescript-eslint": "^8.0.0",
|
||||||
"unplugin-icons": "^0.22.0",
|
"unplugin-icons": "^0.22.0",
|
||||||
"unplugin-vue-components": "^0.28.0",
|
"unplugin-vue-components": "^0.28.0",
|
||||||
|
"uuid": "^11.1.0",
|
||||||
"vite": "^5.4.19",
|
"vite": "^5.4.19",
|
||||||
"vite-plugin-dts": "^4.3.0",
|
"vite-plugin-dts": "^4.3.0",
|
||||||
"vite-plugin-html": "^3.2.2",
|
"vite-plugin-html": "^3.2.2",
|
||||||
@@ -92,8 +99,14 @@
|
|||||||
"@alloc/quick-lru": "^5.2.0",
|
"@alloc/quick-lru": "^5.2.0",
|
||||||
"@atlaskit/pragmatic-drag-and-drop": "^1.3.1",
|
"@atlaskit/pragmatic-drag-and-drop": "^1.3.1",
|
||||||
"@comfyorg/comfyui-electron-types": "^0.4.43",
|
"@comfyorg/comfyui-electron-types": "^0.4.43",
|
||||||
|
"@primeuix/forms": "0.0.2",
|
||||||
|
"@primeuix/styled": "0.3.2",
|
||||||
|
"@primeuix/utils": "^0.3.2",
|
||||||
|
"@primevue/core": "^4.2.5",
|
||||||
"@primevue/forms": "^4.2.5",
|
"@primevue/forms": "^4.2.5",
|
||||||
|
"@primevue/icons": "4.2.5",
|
||||||
"@primevue/themes": "^4.2.5",
|
"@primevue/themes": "^4.2.5",
|
||||||
|
"@sentry/core": "^10.5.0",
|
||||||
"@sentry/vue": "^8.48.0",
|
"@sentry/vue": "^8.48.0",
|
||||||
"@tiptap/core": "^2.10.4",
|
"@tiptap/core": "^2.10.4",
|
||||||
"@tiptap/extension-link": "^2.10.4",
|
"@tiptap/extension-link": "^2.10.4",
|
||||||
@@ -113,8 +126,10 @@
|
|||||||
"es-toolkit": "^1.39.9",
|
"es-toolkit": "^1.39.9",
|
||||||
"extendable-media-recorder": "^9.2.27",
|
"extendable-media-recorder": "^9.2.27",
|
||||||
"extendable-media-recorder-wav-encoder": "^7.0.129",
|
"extendable-media-recorder-wav-encoder": "^7.0.129",
|
||||||
|
"fast-glob": "^3.3.3",
|
||||||
"firebase": "^11.6.0",
|
"firebase": "^11.6.0",
|
||||||
"fuse.js": "^7.0.0",
|
"fuse.js": "^7.0.0",
|
||||||
|
"glob": "^11.0.3",
|
||||||
"jsondiffpatch": "^0.6.0",
|
"jsondiffpatch": "^0.6.0",
|
||||||
"loglevel": "^1.9.2",
|
"loglevel": "^1.9.2",
|
||||||
"marked": "^15.0.11",
|
"marked": "^15.0.11",
|
||||||
|
|||||||
@@ -90,8 +90,8 @@ export default defineConfig({
|
|||||||
|
|
||||||
/* Run your local dev server before starting the tests */
|
/* Run your local dev server before starting the tests */
|
||||||
// webServer: {
|
// webServer: {
|
||||||
// command: 'npm run start',
|
// command: 'pnpm dev',
|
||||||
// url: 'http://127.0.0.1:3000',
|
// url: 'http://127.0.0.1:5173',
|
||||||
// reuseExistingServer: !process.env.CI,
|
// reuseExistingServer: !process.env.CI,
|
||||||
// },
|
// },
|
||||||
})
|
})
|
||||||
|
|||||||
12504
pnpm-lock.yaml
generated
Normal file
12504
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
15
pnpm-workspace.yaml
Normal file
15
pnpm-workspace.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
packages:
|
||||||
|
- apps/**
|
||||||
|
- packages/**
|
||||||
|
|
||||||
|
ignoredBuiltDependencies:
|
||||||
|
- '@firebase/util'
|
||||||
|
- protobufjs
|
||||||
|
- vue-demi
|
||||||
|
|
||||||
|
onlyBuiltDependencies:
|
||||||
|
- '@playwright/browser-chromium'
|
||||||
|
- '@playwright/browser-firefox'
|
||||||
|
- '@playwright/browser-webkit'
|
||||||
|
- esbuild
|
||||||
|
- oxc-resolver
|
||||||
@@ -118,7 +118,7 @@ const sortedGroups = (category: SettingTreeNode): ISettingGroup[] => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handleSearch = (query: string) => {
|
const handleSearch = (query: string) => {
|
||||||
handleSearchBase(query)
|
handleSearchBase(query.trim())
|
||||||
activeCategory.value = query ? null : defaultCategory.value
|
activeCategory.value = query ? null : defaultCategory.value
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,16 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<Transition name="slide-up">
|
<div
|
||||||
<!-- Wrapping panel in div to get correct ref because panel ref is not of raw dom el -->
|
ref="toolboxRef"
|
||||||
<div
|
style="transform: translate(var(--tb-x), var(--tb-y))"
|
||||||
v-show="visible"
|
class="fixed left-0 top-0 z-40"
|
||||||
ref="toolboxRef"
|
>
|
||||||
style="
|
<Transition name="slide-up">
|
||||||
transform: translate(calc(var(--tb-x) - 50%), calc(var(--tb-y) - 120%));
|
|
||||||
"
|
|
||||||
class="selection-toolbox fixed left-0 top-0 z-40"
|
|
||||||
>
|
|
||||||
<Panel
|
<Panel
|
||||||
class="rounded-lg"
|
v-if="visible"
|
||||||
|
class="rounded-lg selection-toolbox"
|
||||||
:pt="{
|
:pt="{
|
||||||
header: 'hidden',
|
header: 'hidden',
|
||||||
content: 'p-0 flex flex-row'
|
content: 'p-0 flex flex-row'
|
||||||
@@ -33,8 +30,8 @@
|
|||||||
/>
|
/>
|
||||||
<HelpButton />
|
<HelpButton />
|
||||||
</Panel>
|
</Panel>
|
||||||
</div>
|
</Transition>
|
||||||
</Transition>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@@ -84,22 +81,31 @@ const extensionToolboxCommands = computed<ComfyCommandImpl[]>(() => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
.selection-toolbox {
|
||||||
|
transform: translateX(-50%) translateY(-120%);
|
||||||
|
will-change: transform, opacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slideUp {
|
||||||
|
0% {
|
||||||
|
transform: translateX(-50%) translateY(-100%);
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
50% {
|
||||||
|
transform: translateX(-50%) translateY(-125%);
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateX(-50%) translateY(-120%);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.slide-up-enter-active {
|
.slide-up-enter-active {
|
||||||
opacity: 1;
|
animation: slideUp 125ms ease-out;
|
||||||
transition: all 0.3s ease-out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.slide-up-leave-active {
|
.slide-up-leave-active {
|
||||||
transition: none;
|
animation: slideUp 25ms ease-out reverse;
|
||||||
}
|
|
||||||
|
|
||||||
.slide-up-enter-from {
|
|
||||||
transform: translateY(-100%);
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.slide-up-leave-to {
|
|
||||||
transform: translateY(0);
|
|
||||||
opacity: 0;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -136,8 +136,6 @@ const closePopup = async () => {
|
|||||||
hide()
|
hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Learn more handled by anchor href
|
|
||||||
|
|
||||||
// const handleCTA = async () => {
|
// const handleCTA = async () => {
|
||||||
// window.open('https://docs.comfy.org/installation/update_comfyui', '_blank')
|
// window.open('https://docs.comfy.org/installation/update_comfyui', '_blank')
|
||||||
// await closePopup()
|
// await closePopup()
|
||||||
@@ -161,8 +159,10 @@ defineExpose({
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
/* Popup container - positioning handled by parent */
|
/* Popup container - positioning handled by parent */
|
||||||
.whats-new-popup-container {
|
.whats-new-popup-container {
|
||||||
|
--whats-new-popup-bottom: 1rem;
|
||||||
|
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: 1rem;
|
bottom: var(--whats-new-popup-bottom);
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
pointer-events: auto;
|
pointer-events: auto;
|
||||||
}
|
}
|
||||||
@@ -171,8 +171,8 @@ defineExpose({
|
|||||||
.help-center-arrow {
|
.help-center-arrow {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
bottom: calc(
|
bottom: calc(
|
||||||
var(--sidebar-width, 4rem) + 0.25rem
|
var(--sidebar-width) * 2 + var(--sidebar-width) / 2
|
||||||
); /* Position toward center of help center icon */
|
); /* Position to center of help center icon (2 icons below + half icon height for center) */
|
||||||
transform: none;
|
transform: none;
|
||||||
z-index: 999;
|
z-index: 999;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
@@ -185,7 +185,10 @@ defineExpose({
|
|||||||
|
|
||||||
.whats-new-popup-container.sidebar-left.small-sidebar .help-center-arrow {
|
.whats-new-popup-container.sidebar-left.small-sidebar .help-center-arrow {
|
||||||
left: -14px; /* Overlap with popup outline */
|
left: -14px; /* Overlap with popup outline */
|
||||||
bottom: calc(2.5rem + 0.25rem); /* Adjust for small sidebar */
|
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 ) */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Sidebar positioning classes applied by parent */
|
/* Sidebar positioning classes applied by parent */
|
||||||
|
|||||||
@@ -76,6 +76,22 @@ const getTabTooltipSuffix = (tab: SidebarTabExtension) => {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
/* Global CSS variables for sidebar
|
||||||
|
* These variables need to be global (not scoped) because they are used by
|
||||||
|
* teleported components like WhatsNewPopup that render outside the sidebar
|
||||||
|
* but need to reference sidebar dimensions for proper positioning.
|
||||||
|
*/
|
||||||
|
:root {
|
||||||
|
--sidebar-width: 4rem;
|
||||||
|
--sidebar-icon-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root:has(.side-tool-bar-container.small-sidebar) {
|
||||||
|
--sidebar-width: 2.5rem;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.side-tool-bar-container {
|
.side-tool-bar-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -88,9 +104,6 @@ const getTabTooltipSuffix = (tab: SidebarTabExtension) => {
|
|||||||
background-color: var(--comfy-menu-secondary-bg);
|
background-color: var(--comfy-menu-secondary-bg);
|
||||||
color: var(--fg-color);
|
color: var(--fg-color);
|
||||||
box-shadow: var(--bar-shadow);
|
box-shadow: var(--bar-shadow);
|
||||||
|
|
||||||
--sidebar-width: 4rem;
|
|
||||||
--sidebar-icon-size: 1rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.side-tool-bar-container.small-sidebar {
|
.side-tool-bar-container.small-sidebar {
|
||||||
|
|||||||
@@ -1332,6 +1332,9 @@ const apiNodeCosts: Record<string, { displayPrice: string | PricingFunction }> =
|
|||||||
return 'Token-based'
|
return 'Token-based'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
GeminiImageNode: {
|
||||||
|
displayPrice: '$0.03 per 1K tokens'
|
||||||
|
},
|
||||||
// OpenAI nodes
|
// OpenAI nodes
|
||||||
OpenAIChatNode: {
|
OpenAIChatNode: {
|
||||||
displayPrice: (node: LGraphNode): string => {
|
displayPrice: (node: LGraphNode): string => {
|
||||||
|
|||||||
@@ -446,6 +446,9 @@ export function useCoreCommands(): ComfyCommand[] {
|
|||||||
)
|
)
|
||||||
group.resizeTo(canvas.selectedItems, padding)
|
group.resizeTo(canvas.selectedItems, padding)
|
||||||
canvas.graph?.add(group)
|
canvas.graph?.add(group)
|
||||||
|
|
||||||
|
group.recomputeInsideNodes()
|
||||||
|
|
||||||
useTitleEditorStore().titleEditorTarget = group
|
useTitleEditorStore().titleEditorTarget = group
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const CORE_MENU_COMMANDS = [
|
|||||||
],
|
],
|
||||||
[['Edit'], ['Comfy.Undo', 'Comfy.Redo']],
|
[['Edit'], ['Comfy.Undo', 'Comfy.Redo']],
|
||||||
[['Edit'], ['Comfy.OpenClipspace']],
|
[['Edit'], ['Comfy.OpenClipspace']],
|
||||||
|
[['Edit'], ['Comfy.RefreshNodeDefinitions']],
|
||||||
[
|
[
|
||||||
['Help'],
|
['Help'],
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -42,6 +42,8 @@ app.registerExtension({
|
|||||||
this.graph.add(group)
|
this.graph.add(group)
|
||||||
// @ts-expect-error fixme ts strict error
|
// @ts-expect-error fixme ts strict error
|
||||||
this.graph.change()
|
this.graph.change()
|
||||||
|
|
||||||
|
group.recomputeInsideNodes()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,9 @@
|
|||||||
|
|
||||||
# Bash commands
|
# Bash commands
|
||||||
|
|
||||||
- `npm run typecheck` Run the typechecker
|
- `pnpm typecheck` Run the typechecker
|
||||||
- `npm run build` Build the project
|
- `pnpm build` Build the project
|
||||||
- `npm run lint:fix` Run ESLint
|
- `pnpm lint:fix` Run ESLint
|
||||||
|
|
||||||
# Code style
|
# Code style
|
||||||
|
|
||||||
|
|||||||
@@ -152,7 +152,7 @@ Use GitHub actions to release normal versions.
|
|||||||
|
|
||||||
### Pre-release
|
### Pre-release
|
||||||
|
|
||||||
The action directly translates `Version increment type` to the npm version command. `Pre-release ID (suffix)` is the option for the `--preid` argument.
|
The action directly translates `Version increment type` to the pnpm version command. `Pre-release ID (suffix)` is the option for the `--preid` argument.
|
||||||
|
|
||||||
e.g. Use `prerelease` increment type to automatically bump the patch version and create a pre-release version. Subsequent runs of prerelease will update the prerelease version only.
|
e.g. Use `prerelease` increment type to automatically bump the patch version and create a pre-release version. Subsequent runs of prerelease will update the prerelease version only.
|
||||||
Use `patch` when ready to remove the pre-release suffix.
|
Use `patch` when ready to remove the pre-release suffix.
|
||||||
|
|||||||
@@ -79,19 +79,20 @@ const messages = {
|
|||||||
#### Option A: Local Generation (Optional)
|
#### Option A: Local Generation (Optional)
|
||||||
```bash
|
```bash
|
||||||
# Only if you have OpenAI API key configured
|
# Only if you have OpenAI API key configured
|
||||||
npm run locale
|
pnpm locale
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Option B: Let CI Handle It (Recommended)
|
#### Option B: Let CI Handle It (Recommended)
|
||||||
- Create your PR with the configuration changes above
|
- Create your PR with the configuration changes above
|
||||||
- Our GitHub CI will automatically generate translation files
|
- **Important**: Translation files will be generated during release PRs, not feature PRs
|
||||||
- Empty JSON files are fine - they'll be populated by the workflow
|
- Empty JSON files are fine - they'll be populated during the next release workflow
|
||||||
|
- For urgent translation needs, maintainers can manually trigger the workflow
|
||||||
|
|
||||||
### Step 3: Test Your Changes
|
### Step 3: Test Your Changes
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm run typecheck # Check for TypeScript errors
|
pnpm typecheck # Check for TypeScript errors
|
||||||
npm run dev # Start development server
|
pnpm dev # Start development server
|
||||||
```
|
```
|
||||||
|
|
||||||
**Testing checklist:**
|
**Testing checklist:**
|
||||||
@@ -110,11 +111,23 @@ npm run dev # Start development server
|
|||||||
|
|
||||||
## What Happens in CI
|
## What Happens in CI
|
||||||
|
|
||||||
Our automated translation workflow:
|
Our automated translation workflow now runs on release PRs (version-bump-* branches) to improve development performance:
|
||||||
|
|
||||||
|
### For Feature PRs (Regular Development)
|
||||||
|
- **No automatic translations** - faster reviews and fewer conflicts
|
||||||
|
- **English-only development** - new strings show in English until release
|
||||||
|
- **Focus on functionality** - reviewers see only your actual changes
|
||||||
|
|
||||||
|
### For Release PRs (version-bump-* branches)
|
||||||
1. **Collects strings**: Scans the UI for translatable text
|
1. **Collects strings**: Scans the UI for translatable text
|
||||||
2. **Updates English files**: Ensures all strings are captured
|
2. **Updates English files**: Ensures all strings are captured
|
||||||
3. **Generates translations**: Uses OpenAI API to translate to all configured languages
|
3. **Generates translations**: Uses OpenAI API to translate to all configured languages
|
||||||
4. **Commits back**: Automatically updates your PR with complete translations
|
4. **Commits back**: Automatically updates the release PR with complete translations
|
||||||
|
|
||||||
|
### Manual Translation Updates
|
||||||
|
If urgent translation updates are needed outside of releases, maintainers can:
|
||||||
|
- Trigger the "Update Locales" workflow manually from GitHub Actions
|
||||||
|
- The workflow supports manual dispatch for emergency translation updates
|
||||||
|
|
||||||
## File Structure
|
## File Structure
|
||||||
|
|
||||||
|
|||||||
@@ -341,6 +341,7 @@
|
|||||||
"micPermissionDenied": "تم رفض إذن الميكروفون",
|
"micPermissionDenied": "تم رفض إذن الميكروفون",
|
||||||
"migrate": "ترحيل",
|
"migrate": "ترحيل",
|
||||||
"missing": "مفقود",
|
"missing": "مفقود",
|
||||||
|
"moreWorkflows": "المزيد من سير العمل",
|
||||||
"name": "الاسم",
|
"name": "الاسم",
|
||||||
"newFolder": "مجلد جديد",
|
"newFolder": "مجلد جديد",
|
||||||
"next": "التالي",
|
"next": "التالي",
|
||||||
|
|||||||
@@ -341,6 +341,7 @@
|
|||||||
"micPermissionDenied": "Permiso de micrófono denegado",
|
"micPermissionDenied": "Permiso de micrófono denegado",
|
||||||
"migrate": "Migrar",
|
"migrate": "Migrar",
|
||||||
"missing": "Faltante",
|
"missing": "Faltante",
|
||||||
|
"moreWorkflows": "Más flujos de trabajo",
|
||||||
"name": "Nombre",
|
"name": "Nombre",
|
||||||
"newFolder": "Nueva carpeta",
|
"newFolder": "Nueva carpeta",
|
||||||
"next": "Siguiente",
|
"next": "Siguiente",
|
||||||
|
|||||||
@@ -341,6 +341,7 @@
|
|||||||
"micPermissionDenied": "Permission du microphone refusée",
|
"micPermissionDenied": "Permission du microphone refusée",
|
||||||
"migrate": "Migrer",
|
"migrate": "Migrer",
|
||||||
"missing": "Manquant",
|
"missing": "Manquant",
|
||||||
|
"moreWorkflows": "Plus de workflows",
|
||||||
"name": "Nom",
|
"name": "Nom",
|
||||||
"newFolder": "Nouveau dossier",
|
"newFolder": "Nouveau dossier",
|
||||||
"next": "Suivant",
|
"next": "Suivant",
|
||||||
|
|||||||
@@ -341,6 +341,7 @@
|
|||||||
"micPermissionDenied": "マイクの許可が拒否されました",
|
"micPermissionDenied": "マイクの許可が拒否されました",
|
||||||
"migrate": "移行する",
|
"migrate": "移行する",
|
||||||
"missing": "不足している",
|
"missing": "不足している",
|
||||||
|
"moreWorkflows": "さらに多くのワークフロー",
|
||||||
"name": "名前",
|
"name": "名前",
|
||||||
"newFolder": "新しいフォルダー",
|
"newFolder": "新しいフォルダー",
|
||||||
"next": "次へ",
|
"next": "次へ",
|
||||||
|
|||||||
@@ -341,6 +341,7 @@
|
|||||||
"micPermissionDenied": "마이크 권한이 거부되었습니다",
|
"micPermissionDenied": "마이크 권한이 거부되었습니다",
|
||||||
"migrate": "이전(migrate)",
|
"migrate": "이전(migrate)",
|
||||||
"missing": "누락됨",
|
"missing": "누락됨",
|
||||||
|
"moreWorkflows": "더 많은 워크플로우",
|
||||||
"name": "이름",
|
"name": "이름",
|
||||||
"newFolder": "새 폴더",
|
"newFolder": "새 폴더",
|
||||||
"next": "다음",
|
"next": "다음",
|
||||||
|
|||||||
@@ -341,6 +341,7 @@
|
|||||||
"micPermissionDenied": "Доступ к микрофону запрещён",
|
"micPermissionDenied": "Доступ к микрофону запрещён",
|
||||||
"migrate": "Мигрировать",
|
"migrate": "Мигрировать",
|
||||||
"missing": "Отсутствует",
|
"missing": "Отсутствует",
|
||||||
|
"moreWorkflows": "Больше рабочих процессов",
|
||||||
"name": "Имя",
|
"name": "Имя",
|
||||||
"newFolder": "Новая папка",
|
"newFolder": "Новая папка",
|
||||||
"next": "Далее",
|
"next": "Далее",
|
||||||
|
|||||||
@@ -341,6 +341,7 @@
|
|||||||
"micPermissionDenied": "麥克風權限被拒絕",
|
"micPermissionDenied": "麥克風權限被拒絕",
|
||||||
"migrate": "遷移",
|
"migrate": "遷移",
|
||||||
"missing": "缺少",
|
"missing": "缺少",
|
||||||
|
"moreWorkflows": "更多工作流程",
|
||||||
"name": "名稱",
|
"name": "名稱",
|
||||||
"newFolder": "新資料夾",
|
"newFolder": "新資料夾",
|
||||||
"next": "下一步",
|
"next": "下一步",
|
||||||
|
|||||||
@@ -341,6 +341,7 @@
|
|||||||
"micPermissionDenied": "麦克风权限被拒绝",
|
"micPermissionDenied": "麦克风权限被拒绝",
|
||||||
"migrate": "迁移",
|
"migrate": "迁移",
|
||||||
"missing": "缺失",
|
"missing": "缺失",
|
||||||
|
"moreWorkflows": "更多工作流",
|
||||||
"name": "名称",
|
"name": "名称",
|
||||||
"newFolder": "新文件夹",
|
"newFolder": "新文件夹",
|
||||||
"next": "下一个",
|
"next": "下一个",
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ import { ExtensionManager } from '@/types/extensionTypes'
|
|||||||
import type { NodeExecutionId } from '@/types/nodeIdentification'
|
import type { NodeExecutionId } from '@/types/nodeIdentification'
|
||||||
import { ColorAdjustOptions, adjustColor } from '@/utils/colorUtil'
|
import { ColorAdjustOptions, adjustColor } from '@/utils/colorUtil'
|
||||||
import { graphToPrompt } from '@/utils/executionUtil'
|
import { graphToPrompt } from '@/utils/executionUtil'
|
||||||
|
import { forEachNode } from '@/utils/graphTraversalUtil'
|
||||||
import {
|
import {
|
||||||
getNodeByExecutionId,
|
getNodeByExecutionId,
|
||||||
triggerCallbackOnAllNodes
|
triggerCallbackOnAllNodes
|
||||||
@@ -1700,12 +1701,13 @@ export class ComfyApp {
|
|||||||
for (const nodeId in defs) {
|
for (const nodeId in defs) {
|
||||||
this.registerNodeDef(nodeId, defs[nodeId])
|
this.registerNodeDef(nodeId, defs[nodeId])
|
||||||
}
|
}
|
||||||
for (const node of this.graph.nodes) {
|
// Refresh combo widgets in all nodes including those in subgraphs
|
||||||
|
forEachNode(this.graph, (node) => {
|
||||||
const def = defs[node.type]
|
const def = defs[node.type]
|
||||||
// Allow primitive nodes to handle refresh
|
// Allow primitive nodes to handle refresh
|
||||||
node.refreshComboInNode?.(defs)
|
node.refreshComboInNode?.(defs)
|
||||||
|
|
||||||
if (!def?.input) continue
|
if (!def?.input) return
|
||||||
|
|
||||||
if (node.widgets) {
|
if (node.widgets) {
|
||||||
const nodeInputs = def.input
|
const nodeInputs = def.input
|
||||||
@@ -1732,7 +1734,7 @@ export class ComfyApp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
|
|
||||||
await useExtensionService().invokeExtensionsAsync(
|
await useExtensionService().invokeExtensionsAsync(
|
||||||
'refreshComboInNodes',
|
'refreshComboInNodes',
|
||||||
|
|||||||
@@ -33,13 +33,13 @@ To run the tests locally:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Run unit tests
|
# Run unit tests
|
||||||
npm run test:unit
|
pnpm test:unit
|
||||||
|
|
||||||
# Run unit tests in watch mode
|
# Run unit tests in watch mode
|
||||||
npm run test:unit:dev
|
pnpm test:unit:dev
|
||||||
|
|
||||||
# Run component tests with browser-native environment
|
# Run component tests with browser-native environment
|
||||||
npm run test:component
|
pnpm test:component
|
||||||
```
|
```
|
||||||
|
|
||||||
Refer to the specific guides for more detailed information on each testing type.
|
Refer to the specific guides for more detailed information on each testing type.
|
||||||
@@ -1561,6 +1561,14 @@ describe('useNodePricing', () => {
|
|||||||
const price = getNodeDisplayPrice(node)
|
const price = getNodeDisplayPrice(node)
|
||||||
expect(price).toBe('Token-based')
|
expect(price).toBe('Token-based')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('should return static price for GeminiImageNode', () => {
|
||||||
|
const { getNodeDisplayPrice } = useNodePricing()
|
||||||
|
const node = createMockNode('GeminiImageNode')
|
||||||
|
|
||||||
|
const price = getNodeDisplayPrice(node)
|
||||||
|
expect(price).toBe('$0.03 per 1K tokens')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('Additional RunwayML edge cases', () => {
|
describe('Additional RunwayML edge cases', () => {
|
||||||
|
|||||||
@@ -18,13 +18,13 @@ litegraph/
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Run all litegraph tests
|
# Run all litegraph tests
|
||||||
npm run test:unit -- tests-ui/tests/litegraph/
|
pnpm test:unit -- tests-ui/tests/litegraph/
|
||||||
|
|
||||||
# Run specific subdirectory
|
# Run specific subdirectory
|
||||||
npm run test:unit -- tests-ui/tests/litegraph/core/
|
pnpm test:unit -- tests-ui/tests/litegraph/core/
|
||||||
|
|
||||||
# Run single test file
|
# Run single test file
|
||||||
npm run test:unit -- tests-ui/tests/litegraph/core/LGraph.test.ts
|
pnpm test:unit -- tests-ui/tests/litegraph/core/LGraph.test.ts
|
||||||
```
|
```
|
||||||
|
|
||||||
## Migration Status
|
## Migration Status
|
||||||
|
|||||||
Reference in New Issue
Block a user