fix: replace @bgotink/playwright-coverage with monocart-coverage-reports

Removes 242-line patch that was needed to fix Vite sourcemap resolution.
monocart-coverage-reports handles V8 coverage and sourcemap resolution
natively without patches.
This commit is contained in:
bymyself
2026-04-08 18:54:08 -07:00
parent 2a706200b7
commit 09b60d2e58
7 changed files with 99 additions and 440 deletions

View File

@@ -1,7 +1,7 @@
import type { APIRequestContext, Locator, Page } from '@playwright/test'
import { test as base } from '@playwright/test'
import { config as dotenvConfig } from 'dotenv'
import { promises as fs } from 'fs'
import MCR from 'monocart-coverage-reports'
import { NodeBadgeMode } from '../../src/types/nodeSource'
import { ComfyActionbar } from '@e2e/helpers/actionbar'
@@ -402,44 +402,25 @@ export class ComfyPage {
export const testComfySnapToGridGridSize = 50
const COLLECT_COVERAGE = process.env.COLLECT_COVERAGE === 'true'
const COVERAGE_ATTACHMENT = '@bgotink/playwright-coverage'
export const comfyPageFixture = base.extend<{
comfyPage: ComfyPage
comfyMouse: ComfyMouse
collectCoverage: boolean
}>({
collectCoverage: [COLLECT_COVERAGE, { option: true }],
page: async ({ page, collectCoverage, browserName }, use, testInfo) => {
if (browserName !== 'chromium' || !collectCoverage) {
page: async ({ page, browserName }, use) => {
if (browserName !== 'chromium' || !COLLECT_COVERAGE) {
return use(page)
}
await page.coverage.startJSCoverage({ resetOnNavigation: false })
await use(page)
const entries = await page.coverage.stopJSCoverage()
const coverage = await page.coverage.stopJSCoverage()
// Fetch source text for network-loaded scripts that V8 didn't capture
for (const entry of entries) {
if (typeof entry.source !== 'string' && entry.url.startsWith('http')) {
try {
const resp = await fetch(entry.url)
if (resp.ok)
(entry as Record<string, unknown>).source = await resp.text()
} catch {
// skip unreachable scripts
}
}
}
const resultFile = testInfo.outputPath('v8-coverage.json')
await fs.writeFile(resultFile, JSON.stringify({ result: entries }))
testInfo.attachments.push({
name: COVERAGE_ATTACHMENT,
contentType: 'application/json',
path: resultFile
const mcr = MCR({
outputDir: './coverage/playwright',
reports: []
})
await mcr.add(coverage)
},
comfyPage: async ({ page, request }, use, testInfo) => {

View File

@@ -1,15 +1,29 @@
import { config as dotenvConfig } from 'dotenv'
import MCR from 'monocart-coverage-reports'
import { writePerfReport } from './helpers/perfReporter'
import { restorePath } from './utils/backupUtils'
dotenvConfig()
export default function globalTeardown() {
export default async function globalTeardown() {
writePerfReport()
if (!process.env.CI && process.env.TEST_COMFYUI_DIR) {
restorePath([process.env.TEST_COMFYUI_DIR, 'user'])
restorePath([process.env.TEST_COMFYUI_DIR, 'models'])
}
if (process.env.COLLECT_COVERAGE === 'true') {
const mcr = MCR({
outputDir: './coverage/playwright',
reports: [['lcovonly', { file: 'coverage.lcov' }], ['text-summary']],
sourceFilter: {
'**/node_modules/**': false,
'**/browser_tests/**': false,
'**/*': true
}
})
await mcr.generate()
}
}

View File

@@ -124,7 +124,6 @@
"zod-validation-error": "catalog:"
},
"devDependencies": {
"@bgotink/playwright-coverage": "catalog:",
"@eslint/js": "catalog:",
"@intlify/eslint-plugin-vue-i18n": "catalog:",
"@lobehub/i18n-cli": "catalog:",
@@ -176,6 +175,7 @@
"lint-staged": "catalog:",
"markdown-table": "catalog:",
"mixpanel-browser": "catalog:",
"monocart-coverage-reports": "catalog:",
"nx": "catalog:",
"oxfmt": "catalog:",
"oxlint": "catalog:",
@@ -221,9 +221,6 @@
"sharp",
"unrs-resolver",
"vue-demi"
],
"patchedDependencies": {
"@bgotink/playwright-coverage@0.3.2": "patches/@bgotink__playwright-coverage@0.3.2.patch"
}
]
}
}

View File

@@ -1,242 +0,0 @@
diff --git a/lib/data.js b/lib/data.js
index c11873c7084264208c01abd66ee4a5c43e9e9aee..0858ce94961c27e880dbe6226b44a36e4553ed2f 100644
--- a/lib/data.js
+++ b/lib/data.js
@@ -49,6 +49,28 @@ const v8_to_istanbul_1 = __importDefault(require("v8-to-istanbul"));
const convertSourceMap = __importStar(require("convert-source-map"));
exports.attachmentName = '@bgotink/playwright-coverage';
const fetch = import('node-fetch');
+async function tryReadLocalSourceMap(url) {
+ try {
+ const parsed = new url_1.URL(url);
+ const urlPath = parsed.pathname.replace(/^\//, '');
+ const candidates = [
+ (0, path_1.join)(process.cwd(), 'dist', urlPath),
+ (0, path_1.join)(process.cwd(), urlPath),
+ ];
+ for (const candidate of candidates) {
+ try {
+ return await fs_1.promises.readFile(candidate, 'utf8');
+ }
+ catch {
+ // try next candidate
+ }
+ }
+ }
+ catch {
+ // invalid URL
+ }
+ return null;
+}
async function getSourceMap(url, source) {
const inlineMap = convertSourceMap.fromSource(source);
if (inlineMap != null) {
@@ -72,10 +94,19 @@ async function getSourceMap(url, source) {
return dataString;
}
default: {
- const response = await (await fetch).default(resolved.href, {
- method: 'GET',
- });
- return await response.text();
+ try {
+ const response = await (await fetch).default(resolved.href, {
+ method: 'GET',
+ });
+ return await response.text();
+ }
+ catch {
+ const local = await tryReadLocalSourceMap(resolved.href);
+ if (local != null) {
+ return local;
+ }
+ throw new Error(`Failed to fetch sourcemap: ${resolved.href}`);
+ }
}
}
});
@@ -94,6 +125,15 @@ async function getSourceMap(url, source) {
return (await response.json());
}
catch {
+ try {
+ const local = await tryReadLocalSourceMap(`${url}.map`);
+ if (local != null) {
+ return JSON.parse(local);
+ }
+ }
+ catch {
+ // ignore
+ }
return undefined;
}
}
@@ -104,10 +144,40 @@ async function convertToIstanbulCoverage(v8Coverage, sources, sourceMaps, exclud
const istanbulCoverage = (0, istanbul_lib_coverage_1.createCoverageMap)({});
for (const script of v8Coverage.result) {
const source = sources.get(script.url);
- const sourceMap = sourceMaps.get(script.url);
+ let sourceMap = sourceMaps.get(script.url);
if (source == null || !(sourceMap === null || sourceMap === void 0 ? void 0 : sourceMap.mappings)) {
continue;
}
+ // Rewrite sourcemap sources from build-output-relative paths to
+ // project-relative paths. Vite emits sources like "../../src/foo.ts"
+ // relative to dist/assets/. Resolve them against the script URL to
+ // get server-absolute paths, then strip the origin.
+ if (sourceMap.sources != null) {
+ const scriptUrl = script.url;
+ try {
+ const origin = new url_1.URL(scriptUrl).origin;
+ sourceMap = {
+ ...sourceMap,
+ sources: sourceMap.sources.map(s => {
+ if (s == null)
+ return s;
+ try {
+ const resolved = new url_1.URL(s, scriptUrl).href;
+ if (resolved.startsWith(origin + '/')) {
+ return resolved.slice(origin.length + 1);
+ }
+ }
+ catch {
+ // not a valid URL combo
+ }
+ return s;
+ }),
+ };
+ }
+ catch {
+ // scriptUrl is not a valid URL — skip rewriting
+ }
+ }
function sanitizePath(path) {
let url;
try {
diff --git a/src/data.ts b/src/data.ts
index 539a70e5bde5c2ab8644b0bfa3ff52625cf4490e..29bc26bf729cbf9496594d9b9e91745a095658c5 100644
--- a/src/data.ts
+++ b/src/data.ts
@@ -12,6 +12,33 @@ export const attachmentName = '@bgotink/playwright-coverage';
const fetch = import('node-fetch');
+/**
+ * Try to read a sourcemap from the local filesystem by mapping a URL path
+ * (e.g. /assets/index-abc.js.map) to a local file (e.g. dist/assets/index-abc.js.map).
+ * Falls back to common build output directories.
+ */
+async function tryReadLocalSourceMap(url: string): Promise<string | null> {
+ try {
+ const parsed = new URL(url);
+ // Try mapping URL pathname to dist/ directory
+ const urlPath = parsed.pathname.replace(/^\//, '');
+ const candidates = [
+ join(process.cwd(), 'dist', urlPath),
+ join(process.cwd(), urlPath),
+ ];
+ for (const candidate of candidates) {
+ try {
+ return await fs.readFile(candidate, 'utf8');
+ } catch {
+ // try next candidate
+ }
+ }
+ } catch {
+ // invalid URL
+ }
+ return null;
+}
+
export async function getSourceMap(
url: string,
source: string,
@@ -44,13 +71,23 @@ export async function getSourceMap(
return dataString;
}
default: {
- const response = await (
- await fetch
- ).default(resolved.href, {
- method: 'GET',
- });
+ // Try HTTP fetch first, fall back to reading from local filesystem
+ try {
+ const response = await (
+ await fetch
+ ).default(resolved.href, {
+ method: 'GET',
+ });
- return await response.text();
+ return await response.text();
+ } catch {
+ // HTTP fetch failed — try reading from local dist/ directory
+ const local = await tryReadLocalSourceMap(resolved.href);
+ if (local != null) {
+ return local;
+ }
+ throw new Error(`Failed to fetch sourcemap: ${resolved.href}`);
+ }
}
}
},
@@ -73,6 +110,15 @@ export async function getSourceMap(
return (await response.json()) as EncodedSourceMap;
} catch {
+ // HTTP fetch failed — try reading from local dist/ directory
+ try {
+ const local = await tryReadLocalSourceMap(`${url}.map`);
+ if (local != null) {
+ return JSON.parse(local) as EncodedSourceMap;
+ }
+ } catch {
+ // ignore
+ }
return undefined;
}
}
@@ -102,12 +148,41 @@ export async function convertToIstanbulCoverage(
for (const script of v8Coverage.result) {
const source = sources.get(script.url);
- const sourceMap = sourceMaps.get(script.url);
+ let sourceMap = sourceMaps.get(script.url);
if (source == null || !sourceMap?.mappings) {
continue;
}
+ // Rewrite sourcemap sources from build-output-relative paths to
+ // project-relative paths. Vite emits sources like "../../src/foo.ts"
+ // relative to dist/assets/. Resolve them against the script URL to
+ // get server-absolute paths, then strip the origin to get
+ // project-relative paths (e.g. "src/foo.ts").
+ if (sourceMap.sources != null) {
+ const scriptUrl = script.url;
+ try {
+ const origin = new URL(scriptUrl).origin;
+ sourceMap = {
+ ...sourceMap,
+ sources: sourceMap.sources.map(s => {
+ if (s == null) return s;
+ try {
+ const resolved = new URL(s, scriptUrl).href;
+ if (resolved.startsWith(origin + '/')) {
+ return resolved.slice(origin.length + 1);
+ }
+ } catch {
+ // not a valid URL combo
+ }
+ return s;
+ }),
+ };
+ } catch {
+ // scriptUrl is not a valid URL — skip rewriting
+ }
+ }
+
function sanitizePath(path: string) {
let url;

View File

@@ -1,24 +1,14 @@
import path from 'path'
import { fileURLToPath } from 'url'
import { defineCoverageReporterConfig } from '@bgotink/playwright-coverage'
import { defineConfig, devices } from '@playwright/test'
import type { PlaywrightTestConfig } from '@playwright/test'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const COLLECT_COVERAGE = process.env.COLLECT_COVERAGE === 'true'
const maybeLocalOptions: PlaywrightTestConfig = process.env.PLAYWRIGHT_LOCAL
? {
// VERY HELPFUL: Skip screenshot tests locally
// grep: process.env.CI ? undefined : /^(?!.*screenshot).*$/,
timeout: 30_000, // Longer timeout for breakpoints
retries: 0, // No retries while debugging. Increase if writing new tests. that may be flaky.
workers: 1, // Single worker for easier debugging. Increase to match CPU cores if you want to run a lot of tests in parallel.
timeout: 30_000,
retries: 0,
workers: 1,
use: {
trace: 'on', // Always capture traces (CI uses 'on-first-retry')
video: 'on' // Always record video (CI uses 'retain-on-failure')
trace: 'on',
video: 'on'
}
}
: {
@@ -32,24 +22,7 @@ export default defineConfig({
testDir: './browser_tests',
fullyParallel: true,
forbidOnly: !!process.env.CI,
reporter: COLLECT_COVERAGE
? [
['html'],
[
'@bgotink/playwright-coverage',
defineCoverageReporterConfig({
sourceRoot: __dirname,
exclude: ['**/node_modules/**', '**/browser_tests/**'],
resultDir: path.join(__dirname, 'coverage/playwright'),
reports: [
['html'],
['lcovonly', { file: 'coverage.lcov' }],
['text-summary', { file: null }]
]
})
]
]
: 'html',
reporter: 'html',
...maybeLocalOptions,
globalSetup: './browser_tests/globalSetup.ts',
@@ -60,7 +33,7 @@ export default defineConfig({
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
timeout: 15000,
grepInvert: /@mobile|@perf|@audit|@cloud/ // Run all tests except those tagged with @mobile, @perf, @audit, or @cloud
grepInvert: /@mobile|@perf|@audit|@cloud/
},
{
@@ -89,60 +62,28 @@ export default defineConfig({
name: 'chromium-2x',
use: { ...devices['Desktop Chrome'], deviceScaleFactor: 2 },
timeout: 15000,
grep: /@2x/ // Run all tests tagged with @2x
grep: /@2x/
},
{
name: 'chromium-0.5x',
use: { ...devices['Desktop Chrome'], deviceScaleFactor: 0.5 },
timeout: 15000,
grep: /@0.5x/ // Run all tests tagged with @0.5x
grep: /@0.5x/
},
// {
// name: 'firefox',
// use: { ...devices['Desktop Firefox'] },
// },
// {
// name: 'webkit',
// use: { ...devices['Desktop Safari'] },
// },
{
name: 'cloud',
use: { ...devices['Desktop Chrome'] },
timeout: 15000,
grep: /@cloud/, // Run only tests tagged with @cloud
grepInvert: /@oss/ // Exclude tests tagged with @oss
grep: /@cloud/,
grepInvert: /@oss/
},
/* Test against mobile viewports. */
{
name: 'mobile-chrome',
use: { ...devices['Pixel 5'], hasTouch: true },
grep: /@mobile/ // Run only tests tagged with @mobile
grep: /@mobile/
}
// {
// name: 'Mobile Safari',
// use: { ...devices['iPhone 12'] },
// },
/* Test against branded browsers. */
// {
// name: 'Microsoft Edge',
// use: { ...devices['Desktop Edge'], channel: 'msedge' },
// },
// {
// name: 'Google Chrome',
// use: { ...devices['Desktop Chrome'], channel: 'chrome' },
// },
]
/* Run your local dev server before starting the tests */
// webServer: {
// command: 'pnpm dev',
// url: 'http://127.0.0.1:5173',
// reuseExistingServer: !process.env.CI,
// },
})

154
pnpm-lock.yaml generated
View File

@@ -15,9 +15,6 @@ catalogs:
'@astrojs/vue':
specifier: ^5.0.0
version: 5.1.4
'@bgotink/playwright-coverage':
specifier: ^0.3.2
version: 0.3.2
'@comfyorg/comfyui-electron-types':
specifier: 0.6.2
version: 0.6.2
@@ -279,6 +276,9 @@ catalogs:
mixpanel-browser:
specifier: ^2.71.0
version: 2.71.0
monocart-coverage-reports:
specifier: ^2.12.9
version: 2.12.9
nx:
specifier: 22.6.1
version: 22.6.1
@@ -406,11 +406,6 @@ catalogs:
overrides:
vite: ^8.0.0
patchedDependencies:
'@bgotink/playwright-coverage@0.3.2':
hash: 64bb8e9343c74159293ceaf6f3bef88888c6e98149c458b3db33392ab4238565
path: patches/@bgotink__playwright-coverage@0.3.2.patch
importers:
.:
@@ -617,9 +612,6 @@ importers:
specifier: 'catalog:'
version: 3.3.0(zod@3.25.76)
devDependencies:
'@bgotink/playwright-coverage':
specifier: 'catalog:'
version: 0.3.2(patch_hash=64bb8e9343c74159293ceaf6f3bef88888c6e98149c458b3db33392ab4238565)(@playwright/test@1.58.1)
'@eslint/js':
specifier: 'catalog:'
version: 9.39.1
@@ -773,6 +765,9 @@ importers:
mixpanel-browser:
specifier: 'catalog:'
version: 2.71.0
monocart-coverage-reports:
specifier: 'catalog:'
version: 2.12.9
nx:
specifier: 'catalog:'
version: 22.6.1
@@ -1675,18 +1670,10 @@ packages:
resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==}
engines: {node: '>=6.9.0'}
'@bcoe/v8-coverage@0.2.3':
resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
'@bcoe/v8-coverage@1.0.2':
resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==}
engines: {node: '>=18'}
'@bgotink/playwright-coverage@0.3.2':
resolution: {integrity: sha512-F6ow6TD2LpELb+qD4MrmUj4TyP48JByQ/PNu6gehRLRtnU1mwXCnqfpT8AQ0bGiqS73EEg6Ifa5ts5DPSYYU8w==}
peerDependencies:
'@playwright/test': ^1.14.1
'@cacheable/memory@2.0.6':
resolution: {integrity: sha512-7e8SScMocHxcAb8YhtkbMhGG+EKLRIficb1F5sjvhSYsWTZGxvg4KIDp8kgxnV2PUJ3ddPe6J9QESjKvBWRDkg==}
@@ -4359,9 +4346,6 @@ packages:
'@types/hast@3.0.4':
resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
'@types/istanbul-lib-coverage@2.0.6':
resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
'@types/jsdom@21.1.7':
resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==}
@@ -5019,6 +5003,14 @@ packages:
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
acorn-loose@8.5.2:
resolution: {integrity: sha512-PPvV6g8UGMGgjrMu+n/f9E/tCSkNQ2Y97eFvuVdJfG11+xdIeDcLyNdC8SHcrHbRqkfwLASdplyR6B6sKM1U4A==}
engines: {node: '>=0.4.0'}
acorn-walk@8.3.5:
resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==}
engines: {node: '>=0.4.0'}
acorn@7.4.1:
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
engines: {node: '>=0.4.0'}
@@ -5536,9 +5528,6 @@ packages:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
comlink@4.4.2:
resolution: {integrity: sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==}
comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
@@ -5606,6 +5595,9 @@ packages:
resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
engines: {node: ^14.18.0 || >=16.10.0}
console-grid@2.2.3:
resolution: {integrity: sha512-+mecFacaFxGl+1G31IsCx41taUXuW2FxX+4xIE0TIPhgML+Jb9JFcBWGhhWerd1/vhScubdmHqTwOhB0KCUUAg==}
constantinople@4.0.1:
resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==}
@@ -5713,10 +5705,6 @@ packages:
typescript:
optional: true
data-uri-to-buffer@4.0.1:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
engines: {node: '>= 12'}
data-urls@6.0.0:
resolution: {integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA==}
engines: {node: '>=20'}
@@ -5939,6 +5927,9 @@ packages:
engines: {node: '>=14'}
hasBin: true
eight-colors@1.3.3:
resolution: {integrity: sha512-4B54S2Qi4pJjeHmCbDIsveQZWQ/TSSQng4ixYJ9/SYHHpeS5nYK0pzcHvWzWUfRsvJQjwoIENhAwqg59thQceg==}
ejs@3.1.10:
resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
engines: {node: '>=0.10.0'}
@@ -6368,10 +6359,6 @@ packages:
picomatch:
optional: true
fetch-blob@3.2.0:
resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
engines: {node: ^12.20 || >= 14.13}
fflate@0.4.8:
resolution: {integrity: sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==}
@@ -6469,10 +6456,6 @@ packages:
resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==}
engines: {node: '>= 12.20'}
formdata-polyfill@4.0.10:
resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
engines: {node: '>=12.20.0'}
front-matter@4.0.2:
resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==}
@@ -7493,6 +7476,9 @@ packages:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
lz-utils@2.1.0:
resolution: {integrity: sha512-CMkfimAypidTtWjNDxY8a1bc1mJdyEh04V2FfEQ5Zh8Nx4v7k850EYa+dOWGn9hKG5xOyHP5MkuduAZCTHRvJw==}
magic-string-ast@1.0.3:
resolution: {integrity: sha512-CvkkH1i81zl7mmb94DsRiFeG9V2fR2JeuK8yDgS8oiZSFa++wWLEgZ5ufEOyLHbvSbD1gTRKv9NdX69Rnvr9JA==}
engines: {node: '>=20.19.0'}
@@ -7769,6 +7755,13 @@ packages:
resolution: {integrity: sha512-4W79zekKGyYU4JXVmB78DOscMFaJth2gGhgfTl2alWE4rNe3nf4N2pqenQ0rEtIewrnD79M687Ouba3YGTLOvg==}
engines: {node: '>=18.0.0'}
monocart-coverage-reports@2.12.9:
resolution: {integrity: sha512-vtFqbC3Egl4nVa1FSIrQvMPO6HZtb9lo+3IW7/crdvrLNW2IH8lUsxaK0TsKNmMO2mhFWwqQywLV2CZelqPgwA==}
hasBin: true
monocart-locator@1.0.2:
resolution: {integrity: sha512-v8W5hJLcWMIxLCcSi/MHh+VeefI+ycFmGz23Froer9QzWjrbg4J3gFJBuI/T1VLNoYxF47bVPPxq8ZlNX4gVCw==}
mrmime@2.0.1:
resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==}
engines: {node: '>=10'}
@@ -7828,10 +7821,6 @@ packages:
encoding:
optional: true
node-fetch@3.3.2:
resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
node-html-parser@5.4.2:
resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==}
@@ -9458,10 +9447,6 @@ packages:
resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==}
hasBin: true
v8-to-istanbul@9.3.0:
resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==}
engines: {node: '>=10.12.0'}
valibot@1.2.0:
resolution: {integrity: sha512-mm1rxUsmOxzrwnX5arGS+U4T25RdvpPjPN4yR0u9pUBov9+zGVtO84tif1eY4r6zWxVxu3KzIyknJy3rxfRZZg==}
peerDependencies:
@@ -9732,10 +9717,6 @@ packages:
web-namespaces@2.0.1:
resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
web-streams-polyfill@3.3.3:
resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}
engines: {node: '>= 8'}
web-streams-polyfill@4.0.0-beta.3:
resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==}
engines: {node: '>= 14'}
@@ -10931,23 +10912,8 @@ snapshots:
'@babel/helper-string-parser': 7.27.1
'@babel/helper-validator-identifier': 7.28.5
'@bcoe/v8-coverage@0.2.3': {}
'@bcoe/v8-coverage@1.0.2': {}
'@bgotink/playwright-coverage@0.3.2(patch_hash=64bb8e9343c74159293ceaf6f3bef88888c6e98149c458b3db33392ab4238565)(@playwright/test@1.58.1)':
dependencies:
'@bcoe/v8-coverage': 0.2.3
'@playwright/test': 1.58.1
comlink: 4.4.2
convert-source-map: 2.0.0
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
istanbul-reports: 3.2.0
micromatch: 4.0.8
node-fetch: 3.3.2
v8-to-istanbul: 9.3.0
'@cacheable/memory@2.0.6':
dependencies:
'@cacheable/utils': 2.3.2
@@ -13463,8 +13429,6 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
'@types/istanbul-lib-coverage@2.0.6': {}
'@types/jsdom@21.1.7':
dependencies:
'@types/node': 25.0.3
@@ -14238,6 +14202,14 @@ snapshots:
dependencies:
acorn: 8.16.0
acorn-loose@8.5.2:
dependencies:
acorn: 8.16.0
acorn-walk@8.3.5:
dependencies:
acorn: 8.16.0
acorn@7.4.1: {}
acorn@8.16.0: {}
@@ -14907,8 +14879,6 @@ snapshots:
dependencies:
delayed-stream: 1.0.0
comlink@4.4.2: {}
comma-separated-tokens@2.0.3: {}
commander@10.0.1: {}
@@ -14965,6 +14935,8 @@ snapshots:
consola@3.4.2: {}
console-grid@2.2.3: {}
constantinople@4.0.1:
dependencies:
'@babel/parser': 7.29.0
@@ -15076,8 +15048,6 @@ snapshots:
optionalDependencies:
typescript: 5.9.3
data-uri-to-buffer@4.0.1: {}
data-urls@6.0.0:
dependencies:
whatwg-mimetype: 4.0.0
@@ -15309,6 +15279,8 @@ snapshots:
minimatch: 9.0.1
semver: 7.7.4
eight-colors@1.3.3: {}
ejs@3.1.10:
dependencies:
jake: 10.9.2
@@ -15892,11 +15864,6 @@ snapshots:
optionalDependencies:
picomatch: 4.0.3
fetch-blob@3.2.0:
dependencies:
node-domexception: 1.0.0
web-streams-polyfill: 3.3.3
fflate@0.4.8: {}
fflate@0.8.2: {}
@@ -16020,10 +15987,6 @@ snapshots:
node-domexception: 1.0.0
web-streams-polyfill: 4.0.0-beta.3
formdata-polyfill@4.0.10:
dependencies:
fetch-blob: 3.2.0
front-matter@4.0.2:
dependencies:
js-yaml: 3.14.2
@@ -17093,6 +17056,8 @@ snapshots:
lz-string@1.5.0: {}
lz-utils@2.1.0: {}
magic-string-ast@1.0.3:
dependencies:
magic-string: 0.30.21
@@ -17565,6 +17530,23 @@ snapshots:
modern-tar@0.7.3: {}
monocart-coverage-reports@2.12.9:
dependencies:
acorn: 8.16.0
acorn-loose: 8.5.2
acorn-walk: 8.3.5
commander: 14.0.3
console-grid: 2.2.3
eight-colors: 1.3.3
foreground-child: 3.3.1
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
istanbul-reports: 3.2.0
lz-utils: 2.1.0
monocart-locator: 1.0.2
monocart-locator@1.0.2: {}
mrmime@2.0.1: {}
ms@2.1.3: {}
@@ -17603,12 +17585,6 @@ snapshots:
dependencies:
whatwg-url: 5.0.0
node-fetch@3.3.2:
dependencies:
data-uri-to-buffer: 4.0.1
fetch-blob: 3.2.0
formdata-polyfill: 4.0.10
node-html-parser@5.4.2:
dependencies:
css-select: 4.3.0
@@ -19692,12 +19668,6 @@ snapshots:
uuid@11.1.0: {}
v8-to-istanbul@9.3.0:
dependencies:
'@jridgewell/trace-mapping': 0.3.31
'@types/istanbul-lib-coverage': 2.0.6
convert-source-map: 2.0.0
valibot@1.2.0(typescript@5.9.3):
optionalDependencies:
typescript: 5.9.3
@@ -20091,8 +20061,6 @@ snapshots:
web-namespaces@2.0.1: {}
web-streams-polyfill@3.3.3: {}
web-streams-polyfill@4.0.0-beta.3: {}
web-vitals@4.2.4: {}

View File

@@ -6,7 +6,6 @@ catalog:
'@alloc/quick-lru': ^5.2.0
'@astrojs/sitemap': ^3.7.1
'@astrojs/vue': ^5.0.0
'@bgotink/playwright-coverage': ^0.3.2
'@comfyorg/comfyui-electron-types': 0.6.2
'@eslint/js': ^9.39.1
'@formkit/auto-animate': ^0.9.0
@@ -94,6 +93,7 @@ catalog:
lint-staged: ^16.2.7
markdown-table: ^3.0.4
mixpanel-browser: ^2.71.0
monocart-coverage-reports: ^2.12.9
nx: 22.6.1
oxfmt: ^0.40.0
oxlint: ^1.55.0