Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
849 changes: 451 additions & 398 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

22 changes: 11 additions & 11 deletions pnpm-workspace.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ catalog:
'@nx/playwright': 22.2.6
'@nx/storybook': 22.2.4
'@nx/vite': 22.2.6
'@pinia/testing': ^0.1.5
'@pinia/testing': ^1.0.3
'@playwright/test': ^1.57.0
'@prettier/plugin-oxc': ^0.1.3
'@primeuix/forms': 0.0.2
Expand All @@ -26,7 +26,7 @@ catalog:
'@primevue/icons': 4.2.5
'@primevue/themes': ^4.2.5
'@sentry/vite-plugin': ^4.6.0
'@sentry/vue': ^8.48.0
'@sentry/vue': ^10.32.1
'@sparkjsdev/spark': ^0.1.10
'@storybook/addon-docs': ^10.1.9
'@storybook/vue3': ^10.1.9
Expand All @@ -39,8 +39,8 @@ catalog:
'@types/semver': ^7.7.0
'@types/three': ^0.169.0
'@vitejs/plugin-vue': ^6.0.0
'@vitest/coverage-v8': ^3.2.4
'@vitest/ui': ^3.2.0
'@vitest/coverage-v8': ^4.0.16
'@vitest/ui': ^4.0.16
'@vue/test-utils': ^2.4.6
'@vueuse/core': ^11.0.0
'@vueuse/integrations': ^13.9.0
Expand All @@ -59,11 +59,11 @@ catalog:
eslint-plugin-unused-imports: ^4.3.0
eslint-plugin-vue: ^10.6.2
firebase: ^11.6.0
globals: ^15.9.0
happy-dom: ^15.11.0
globals: ^16.5.0
happy-dom: ^20.0.11
Comment on lines +62 to +63
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

cd /tmp && find . -name "pnpm-workspace.yaml" -o -name "pnpm-workspace.yml" 2>/dev/null | head -5

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 98


🏁 Script executed:

# First, let's locate and examine the pnpm-workspace.yaml file
git ls-files | grep -E "pnpm-workspace\.ya?ml"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 89


🏁 Script executed:

# Read the pnpm-workspace.yaml file to see actual versions
cat pnpm-workspace.yaml | head -n 120

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2992


🌐 Web query:

Vitest v4 happy-dom jsdom globals compatibility requirements

💡 Result:

Short summary — Vitest v4 compatibility with happy-dom / jsdom and globals

  • Environments: Vitest supports both jsdom and happy-dom as test environments; you must install the chosen package yourself (npm i -D jsdom or happy-dom) and set test.environment to 'jsdom' or 'happy-dom'. [1][2]

  • environmentOptions: Vitest v4 accepts per-environment options (keys: jsdom and happyDOM) via test.environmentOptions to pass options into the environment setup. [3]

  • Globals: Vitest does not enable Jest-style globals by default. Enable them with test.globals = true (or --globals) if you want window/document/test APIs injected as globals; otherwise import from 'vitest'. [4]

  • API differences: happy-dom is generally faster but may lack some browser APIs that jsdom implements; choose jsdom for wider API coverage or happy-dom for speed and configure specific tests if needed. vi.stubGlobal/unstubAllGlobals affects both globalThis and window when using jsdom/happy-dom. [1][2]

References

  1. Vitest config / docs (environments, jsdom note). [1]
  2. Vitest guide — features (installing jsdom/happy-dom). [2]
  3. environmentOptions config reference (jsdom / happyDOM keys). [3]
  4. Migration / globals behavior (globals disabled by default). [4]

🌐 Web query:

happy-dom v20 breaking changes release notes

💡 Result:

Summary — happy-dom v20 breaking changes

  • Main breaking change: JavaScript evaluation (eval/Function) is disabled by default for security (VM-context escape / RCE). To re-enable you must set enableJavaScriptEvaluation: true and follow the safer-usage guidance in the project Wiki. [1][2]

Sources

  • happy-dom v20 release notes (GitHub releases). [1]
  • GHSA advisory / security advisory for the VM context escape (GHSA-37j7-fg3j-429f). [2]

References
[1] https://github.com/capricorn86/happy-dom/releases.
[2] GHSA-37j7-fg3j-429f.


🌐 Web query:

jsdom v27 vitest compatibility breaking changes

💡 Result:

Short summary of jsdom v27 breaking changes that have caused Vitest test failures and compatibility issues — and quick mitigations.

What changed in jsdom v27 (relevant points)

  • Minimum Node.js requirement raised to Node 20+. [1][2]
  • User-agent stylesheet and CSS parsing/OM updates (behavioral changes that can break layout/selector-dependent tests). [2][3]
  • Event/DOM API changes: many new event constructors (PointerEvent, PromiseRejectionEvent, TransitionEvent, BeforeUnloadEvent, etc.), element.click() now fires PointerEvent instead of MouseEvent, some events made passive by default, MouseEvent gained movementX/movementY. These change event behavior/feature-detection in tests. [2]
  • Dependency/behavior changes (e.g., tough-cookie upgrade affecting cookie "secure" handling for http://localhost). [2]

Observed Vitest impacts and causes

  • Tests that relied on previous jsdom CSS/UA-styles, specific event types, or old feature-detection began failing after v27 (reports and writeups show many test suites broke after v27). [3]
  • Separate but related ecosystem problems: module resolution / environment conditions with Vite/Vitest can surface when switching DOM shims; Vitest has also introduced a real browser "browser mode" as an alternative to JSDOM for flaky DOM behavior. [6][4]

Quick mitigations

  • If you need immediate stability: pin jsdom to the latest 26.x release until you can adapt tests (package.json: "jsdom": "26.x"). [2][3]
  • Ensure your CI/dev Node version is >=20 when using jsdom v27+. [1][2]
  • Audit tests for assumptions about event types (MouseEvent vs PointerEvent), passive event behavior, and UA stylesheet-dependent CSS/selector behavior; adjust assertions or simulate the new events.
  • Consider switching tests that require more realistic browser behavior to Vitest’s browser mode (runs in a real browser) or run those tests in a Playwright-backed environment. [4]
  • File or follow issues in Vitest/jsdom repos if you hit specific regressions — many are already tracked. [3][5]

Sources
[1] jsdom v27 release notes / changelog (summary including Node 20 minimum).
[2] jsdom releases page (v27.0.0 → 27.x detailed changelog).
[3] Community writeup reporting Vitest test failures after jsdom v27.
[4] Vitest introduces Browser Mode (alternative to jsdom).
[5] Vitest issues discussing jsdom/environment resolution and related test failures.

If you want, I can:

  • look up the exact jsdom 26.x version string to pin to, or
  • search your repo/tests for specific patterns (element.click, MouseEvent usage, UA stylesheet reliance) and suggest targeted fixes.

Address breaking changes in test environment package upgrades.

The test environment packages have breaking changes that require test updates:

  • jsdom v27: Raises minimum Node.js to v20+, changes event behavior (PointerEvent replaces MouseEvent for element.click()), modifies CSS/UA stylesheet handling, makes some event listeners passive by default, and alters cookie security handling. Community reports indicate many test suites broke after this upgrade.
  • happy-dom v20: Disables JavaScript evaluation (eval/Function) by default for security; re-enable via enableJavaScriptEvaluation: true if tests rely on it.

Audit tests for assumptions about event types, passive event behavior, UA stylesheet dependencies, and any eval-based code before merging.

husky: ^9.1.7
jiti: 2.6.1
jsdom: ^26.1.0
jsdom: ^27.4.0
knip: ^5.75.1
lint-staged: ^16.2.7
markdown-table: ^3.0.4
Expand All @@ -72,7 +72,7 @@ catalog:
oxlint: ^1.33.0
oxlint-tsgolint: ^0.9.1
picocolors: ^1.1.1
pinia: ^2.1.7
pinia: ^3.0.4
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Won't this change be the more important one? Wonder what this major change included in pinia

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

postcss-html: ^1.8.0
prettier: ^3.7.4
pretty-bytes: ^7.1.0
Expand All @@ -96,13 +96,13 @@ catalog:
vite-plugin-dts: ^4.5.4
vite-plugin-html: ^3.2.2
vite-plugin-vue-devtools: ^8.0.0
vitest: ^3.2.4
vitest: ^4.0.16
vue: ^3.5.13
vue-component-type-helpers: ^3.0.7
vue-component-type-helpers: ^3.2.1
vue-eslint-parser: ^10.2.0
vue-i18n: ^9.14.3
vue-router: ^4.4.3
vue-tsc: ^3.1.8
vue-tsc: ^3.2.1
vuefire: ^3.2.1
yjs: ^13.6.27
zod: ^3.23.8
Expand Down
2 changes: 1 addition & 1 deletion src/components/queue/job/useJobErrorReporting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export const extractExecutionError = (
}
}

type UseJobErrorReportingOptions = {
export type UseJobErrorReportingOptions = {
taskForJob: ComputedRef<TaskItemImpl | null>
copyToClipboard: CopyHandler
dialog: JobErrorDialogService
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,14 @@ import type { AssetMeta } from '../schemas/mediaAssetSchema'
import { useMediaAssetGalleryStore } from './useMediaAssetGalleryStore'

vi.mock('@/stores/queueStore', () => ({
ResultItemImpl: vi.fn().mockImplementation((data) => ({
...data,
url: ''
}))
ResultItemImpl: vi
.fn<typeof ResultItemImpl>()
.mockImplementation(function (data) {
Object.assign(this, {
...data,
url: ''
})
})
}))

describe('useMediaAssetGalleryStore', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ const createMouseEvent = (

describe('useNodePointerInteractions', () => {
beforeEach(async () => {
vi.restoreAllMocks()
vi.resetAllMocks()
selectedItemsState.items = []
setActivePinia(createTestingPinia())
})
Expand Down
2 changes: 1 addition & 1 deletion src/utils/queueDisplay.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import type { JobState } from '@/types/queue'
import { formatDuration } from '@/utils/formatUtil'
import { clampPercentInt, formatPercent0 } from '@/utils/numberUtil'

type BuildJobDisplayCtx = {
export type BuildJobDisplayCtx = {
t: (k: string, v?: Record<string, any>) => string
locale: string
formatClockTimeFn: (ts: number, locale: string) => string
Expand Down
4 changes: 3 additions & 1 deletion tests-ui/tests/api.featureFlags.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ describe('API Feature Flags', () => {
}

// Mock WebSocket constructor
global.WebSocket = vi.fn().mockImplementation(() => mockWebSocket) as any
vi.stubGlobal('WebSocket', function (this: WebSocket) {
Object.assign(this, mockWebSocket)
})

// Reset API state
api.serverFeatureFlags = {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ const createWrapper = (props = {}) => {

describe('ZoomControlsModal', () => {
beforeEach(() => {
vi.restoreAllMocks()
vi.resetAllMocks()
})

it('should execute zoom in command when zoom in button is clicked', async () => {
Expand Down
15 changes: 9 additions & 6 deletions tests-ui/tests/components/queue/useJobErrorReporting.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ import type { ComputedRef } from 'vue'

import type { ExecutionErrorWsMessage } from '@/schemas/apiSchema'
import type { TaskItemImpl } from '@/stores/queueStore'
import type { JobErrorDialogService } from '@/components/queue/job/useJobErrorReporting'
import type {
JobErrorDialogService,
UseJobErrorReportingOptions
} from '@/components/queue/job/useJobErrorReporting'
import * as jobErrorReporting from '@/components/queue/job/useJobErrorReporting'

const createExecutionErrorMessage = (
Expand Down Expand Up @@ -90,9 +93,9 @@ describe('extractExecutionError', () => {
describe('useJobErrorReporting', () => {
let taskState = ref<TaskItemImpl | null>(null)
let taskForJob: ComputedRef<TaskItemImpl | null>
let copyToClipboard: ReturnType<typeof vi.fn>
let showExecutionErrorDialog: ReturnType<typeof vi.fn>
let showErrorDialog: ReturnType<typeof vi.fn>
let copyToClipboard: UseJobErrorReportingOptions['copyToClipboard']
let showExecutionErrorDialog: JobErrorDialogService['showExecutionErrorDialog']
let showErrorDialog: JobErrorDialogService['showErrorDialog']
let dialog: JobErrorDialogService
let composable: ReturnType<typeof jobErrorReporting.useJobErrorReporting>

Expand Down Expand Up @@ -146,7 +149,7 @@ describe('useJobErrorReporting', () => {
expect(copyToClipboard).toHaveBeenCalledTimes(1)
expect(copyToClipboard).toHaveBeenCalledWith('Clipboard failure')

copyToClipboard.mockClear()
vi.mocked(copyToClipboard).mockClear()
taskState.value = createTaskWithMessages([])
composable.copyErrorMessage()
expect(copyToClipboard).not.toHaveBeenCalled()
Expand Down Expand Up @@ -174,7 +177,7 @@ describe('useJobErrorReporting', () => {
composable.reportJobError()
expect(showExecutionErrorDialog).not.toHaveBeenCalled()
expect(showErrorDialog).toHaveBeenCalledTimes(1)
const [errorArg, optionsArg] = showErrorDialog.mock.calls[0]
const [errorArg, optionsArg] = vi.mocked(showErrorDialog).mock.calls[0]
expect(errorArg).toBeInstanceOf(Error)
expect(errorArg.message).toBe(message)
expect(optionsArg).toEqual({ reportType: 'queueJobError' })
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ describe('useCanvasHistory', () => {
return rafCallCount
}
)
vi.spyOn(window, 'alert').mockImplementation(() => {})
vi.stubGlobal('alert', () => {})

const createMockImageData = () => {
return {
Expand Down
42 changes: 21 additions & 21 deletions tests-ui/tests/composables/nodePack/usePacksSelection.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ type NodePack = components['schemas']['Node']

describe('usePacksSelection', () => {
let managerStore: ReturnType<typeof useComfyManagerStore>
let mockIsPackInstalled: ReturnType<typeof vi.fn>
let mockIsPackInstalled: (packName: string | undefined) => boolean

const createMockPack = (id: string): NodePack => ({
id,
Expand Down Expand Up @@ -58,7 +58,7 @@ describe('usePacksSelection', () => {
createMockPack('pack3')
])

mockIsPackInstalled.mockImplementation((id: string) => {
vi.mocked(mockIsPackInstalled).mockImplementation((id) => {
return id === 'pack1' || id === 'pack3'
})

Expand All @@ -76,7 +76,7 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockReturnValue(false)
vi.mocked(mockIsPackInstalled).mockReturnValue(false)

const { installedPacks } = usePacksSelection(nodePacks)

Expand All @@ -85,7 +85,7 @@ describe('usePacksSelection', () => {

it('should update when nodePacks ref changes', () => {
const nodePacks = ref<NodePack[]>([createMockPack('pack1')])
mockIsPackInstalled.mockReturnValue(true)
vi.mocked(mockIsPackInstalled).mockReturnValue(true)

const { installedPacks } = usePacksSelection(nodePacks)
expect(installedPacks.value).toHaveLength(1)
Expand All @@ -109,7 +109,7 @@ describe('usePacksSelection', () => {
createMockPack('pack3')
])

mockIsPackInstalled.mockImplementation((id: string) => {
vi.mocked(mockIsPackInstalled).mockImplementation((id) => {
return id === 'pack1'
})

Expand All @@ -126,7 +126,7 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockReturnValue(false)
vi.mocked(mockIsPackInstalled).mockReturnValue(false)

const { notInstalledPacks } = usePacksSelection(nodePacks)

Expand All @@ -141,7 +141,7 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockReturnValue(true)
vi.mocked(mockIsPackInstalled).mockReturnValue(true)

const { isAllInstalled } = usePacksSelection(nodePacks)

Expand All @@ -154,7 +154,7 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockImplementation((id: string) => id === 'pack1')
vi.mocked(mockIsPackInstalled).mockImplementation((id) => id === 'pack1')

const { isAllInstalled } = usePacksSelection(nodePacks)

Expand All @@ -177,7 +177,7 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockReturnValue(false)
vi.mocked(mockIsPackInstalled).mockReturnValue(false)

const { isNoneInstalled } = usePacksSelection(nodePacks)

Expand All @@ -190,7 +190,7 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockImplementation((id: string) => id === 'pack1')
vi.mocked(mockIsPackInstalled).mockImplementation((id) => id === 'pack1')

const { isNoneInstalled } = usePacksSelection(nodePacks)

Expand All @@ -214,7 +214,7 @@ describe('usePacksSelection', () => {
createMockPack('pack3')
])

mockIsPackInstalled.mockImplementation((id: string) => {
vi.mocked(mockIsPackInstalled).mockImplementation((id) => {
return id === 'pack1' || id === 'pack2'
})

Expand All @@ -229,7 +229,7 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockReturnValue(true)
vi.mocked(mockIsPackInstalled).mockReturnValue(true)

const { isMixed } = usePacksSelection(nodePacks)

Expand All @@ -242,7 +242,7 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockReturnValue(false)
vi.mocked(mockIsPackInstalled).mockReturnValue(false)

const { isMixed } = usePacksSelection(nodePacks)

Expand All @@ -265,7 +265,7 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockReturnValue(true)
vi.mocked(mockIsPackInstalled).mockReturnValue(true)

const { selectionState } = usePacksSelection(nodePacks)

Expand All @@ -278,7 +278,7 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockReturnValue(false)
vi.mocked(mockIsPackInstalled).mockReturnValue(false)

const { selectionState } = usePacksSelection(nodePacks)

Expand All @@ -292,7 +292,7 @@ describe('usePacksSelection', () => {
createMockPack('pack3')
])

mockIsPackInstalled.mockImplementation((id: string) => id === 'pack1')
vi.mocked(mockIsPackInstalled).mockImplementation((id) => id === 'pack1')

const { selectionState } = usePacksSelection(nodePacks)

Expand All @@ -305,13 +305,13 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockReturnValue(false)
vi.mocked(mockIsPackInstalled).mockReturnValue(false)

const { selectionState } = usePacksSelection(nodePacks)
expect(selectionState.value).toBe('none-installed')

// Change mock to simulate installation
mockIsPackInstalled.mockReturnValue(true)
vi.mocked(mockIsPackInstalled).mockReturnValue(true)

// Force reactivity update
nodePacks.value = [...nodePacks.value]
Expand All @@ -327,7 +327,7 @@ describe('usePacksSelection', () => {
createMockPack('pack2')
])

mockIsPackInstalled.mockImplementation((id: string) => id === 'pack2')
vi.mocked(mockIsPackInstalled).mockImplementation((id) => id === 'pack2')

const { installedPacks, notInstalledPacks } = usePacksSelection(nodePacks)

Expand All @@ -347,8 +347,8 @@ describe('usePacksSelection', () => {
pack2: false
}

mockIsPackInstalled.mockImplementation(
(id: string) => installationStatus[id] || false
vi.mocked(mockIsPackInstalled).mockImplementation(
(id) => (id && installationStatus[id]) || false
)

const { installedPacks, notInstalledPacks, selectionState } =
Expand Down
7 changes: 5 additions & 2 deletions tests-ui/tests/composables/useCachedRequest.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
import { useCachedRequest } from '@/composables/useCachedRequest'

describe('useCachedRequest', () => {
let mockRequestFn: ReturnType<typeof vi.fn>
let abortSpy: ReturnType<typeof vi.fn>
let mockRequestFn: (
params: any,
signal?: AbortSignal
) => Promise<unknown | null>
let abortSpy: () => void
Comment on lines +6 to +10
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Consider leveraging Vitest's typed mock utilities for improved type safety.

The explicit type annotations improve clarity for the Vitest v4 upgrade. However, there's a minor inconsistency: the type signature includes signal?: AbortSignal (line 8), but the implementation at line 28 omits this parameter. While TypeScript permits this, including the parameter in the implementation would improve consistency.

Additionally, the use of any for params violates the coding guideline to avoid any types. Consider using Vitest's Mock type utilities for more precise typing.

🔎 Suggested refactor for improved type safety
-  let mockRequestFn: (
-    params: any,
-    signal?: AbortSignal
-  ) => Promise<unknown | null>
-  let abortSpy: () => void
+  let mockRequestFn: ReturnType<typeof vi.fn<[params: unknown, signal?: AbortSignal], Promise<unknown | null>>>
+  let abortSpy: ReturnType<typeof vi.fn<[], void>>

And update the implementation to include the signal parameter for consistency:

-    mockRequestFn = vi.fn(async (params: any) => {
+    mockRequestFn = vi.fn(async (params: unknown, signal?: AbortSignal) => {

As per coding guidelines, avoid using any type and leverage Vitest utilities for mocking.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
let mockRequestFn: (
params: any,
signal?: AbortSignal
) => Promise<unknown | null>
let abortSpy: () => void
let mockRequestFn: ReturnType<typeof vi.fn<[params: unknown, signal?: AbortSignal], Promise<unknown | null>>>
let abortSpy: ReturnType<typeof vi.fn<[], void>>
Suggested change
let mockRequestFn: (
params: any,
signal?: AbortSignal
) => Promise<unknown | null>
let abortSpy: () => void
mockRequestFn = vi.fn(async (params: unknown, signal?: AbortSignal) => {
🤖 Prompt for AI Agents
In tests-ui/tests/composables/useCachedRequest.test.ts around lines 6 to 10, the
mockRequestFn is typed with `any` and its declaration includes `signal?:
AbortSignal` while the implementation omits that parameter; change the type to
use Vitest's Mock generic (e.g. Mock<Promise<unknown | null>, [paramsType,
AbortSignal?]> or a more specific params type instead of any), update the mock
implementation signature to accept the optional signal parameter, and replace
`any` with a concrete type or `unknown` to comply with the no-any guideline.


beforeEach(() => {
vi.clearAllMocks()
Expand Down
Loading
Loading