chore(deps-dev): bump happy-dom from 20.11.1 to 21.0.4 in /frontend (#7391)

* chore(deps-dev): bump happy-dom from 20.11.1 to 21.0.4 in /frontend

Bumps [happy-dom](https://github.com/capricorn86/happy-dom) from 20.11.1 to 21.0.4.
- [Release notes](https://github.com/capricorn86/happy-dom/releases)
- [Commits](https://github.com/capricorn86/happy-dom/compare/v20.11.1...v21.0.4)

---
updated-dependencies:
- dependency-name: happy-dom
  dependency-version: 21.0.4
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>

* test(frontend): isolate FlipDisplay animations in DOM suites

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Willem Jiang <willem.jiang@gmail.com>
This commit is contained in:
dependabot[bot] 2026-10-24 10:45:01 +08:00 committed by GitHub
parent cf15f05f4d
commit 916e647a75
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 60 additions and 24 deletions

View File

@ -27,18 +27,21 @@ Run from `frontend/`; host pnpm calls use `../scripts/pnpm.py`.
- `pnpm format` / `pnpm format:write`: Prettier check/write.
- `pnpm test`: Rstest unit tests; `pnpm test:e2e`: Playwright Chromium E2E tests.
Rstest unit tests under `tests/unit/` mirror `src/` (e.g., `tests/unit/core/api/stream-mode.test.ts` tests `src/core/api/stream-mode.ts`). Import source modules via `@/`.
Unit tests under `tests/unit/` mirror `src/`; import source via `@/`.
Webpack is the default development bundler. Use `DEER_FLOW_DEV_BUNDLER=turbo` with `pnpm dev` to opt in to Turbopack when diagnosing a local Next.js bundler issue.
On Windows `pnpm dev` binds `127.0.0.1` by default because Hyper-V/winnat excluded port ranges can reject Next's default `0.0.0.0` bind with `EACCES` (#2870). Pass `pnpm dev -- --hostname 0.0.0.0` to listen on a LAN interface instead.
`rstest.config.ts` separates **node** (`*.test.ts` / `*.test.tsx`) for pure logic
from **happy-dom** (`*.dom.test.ts` / `*.dom.test.tsx`) for components and hooks
rendered with `@testing-library/react`'s `renderHook`. Keep the split: DOM tests
cost roughly 3x more runtime. Hooks that depend on React effect ordering, unmount
cleanup, or re-renders on store changes belong in `.dom.test.*`; do not mock React
in node tests to cover those behaviors.
`rstest.config.ts`: **node** runs `*.test.*` pure logic; **happy-dom** runs
`*.dom.test.*` components/hooks via `@testing-library/react` render/renderHook.
DOM costs ~3x: keep the split. Effect ordering, unmount cleanup and store
re-renders need DOM tests with real React.
Content/state suites may mock decorative `FlipDisplay` with
`tests/unit/helpers/flip-display.tsx`, preserving children, classes and keyed
remounts. Happy DOM 21's animation cancellation rejects `finished`; keep rejection
reporting enabled. Real Motion behavior belongs in Playwright.
E2E tests live under `tests/e2e/` and use Playwright with Chromium. They mock all backend APIs via `page.route()` network interception and test real page interactions (navigation, chat input, streaming responses). Config: `playwright.config.ts`. The real-backend auth contract in `tests/e2e-real-backend/auth-disabled-contract.spec.ts` and `backend/tests/test_auth_me_permissions.py` pin the complete route-permission list; update both when adding registered permissions (including `projects:read/write/delete`).

View File

@ -117,7 +117,7 @@
"@types/react-dom": "^19.0.0",
"eslint": "^9.23.0",
"eslint-config-next": "^15.2.3",
"happy-dom": "^20.11.1",
"happy-dom": "^21.0.4",
"postcss": "^8.5.18",
"prettier": "^3.5.3",
"prettier-plugin-tailwindcss": "^0.6.11",

View File

@ -266,7 +266,7 @@ importers:
version: 2.1.0(@rsbuild/core@2.0.15)(@rspack/core@2.0.8(@swc/helpers@0.5.23))
'@rstest/core':
specifier: ^0.10.6
version: 0.10.6(happy-dom@20.11.1)
version: 0.10.6(happy-dom@21.0.4)
'@tailwindcss/postcss':
specifier: ^4.0.15
version: 4.1.18
@ -295,8 +295,8 @@ importers:
specifier: ^15.2.3
version: 15.5.12(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3)
happy-dom:
specifier: ^20.11.1
version: 20.11.1
specifier: ^21.0.4
version: 21.0.4
postcss:
specifier: ^8.5.18
version: 8.5.25
@ -2536,8 +2536,8 @@ packages:
'@types/whatwg-mimetype@3.0.2':
resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==}
'@types/ws@8.18.1':
resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==}
'@types/ws@8.18.2':
resolution: {integrity: sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w==}
'@typescript-eslint/eslint-plugin@8.55.0':
resolution: {integrity: sha512-1y/MVSz0NglV1ijHC8OT49mPJ4qhPYjiK08YUQVbIOyu+5k862LKUHFkpKHWu//zmr7hDR2rhwUm6gnCGNmGBQ==}
@ -3853,8 +3853,8 @@ packages:
hachure-fill@0.5.2:
resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==}
happy-dom@20.11.1:
resolution: {integrity: sha512-XSt8tMzbW9ymE7687xztkO1ckR7qJNQ3LywY9vlYGhGi3zXrGBHuUo2Cl1ztZaICW+1eAGdkLbj6iwVqDT33kg==}
happy-dom@21.0.4:
resolution: {integrity: sha512-tFm+GaLBgo6o0awHnvHaNoraVo27qJ+2tZEtZ+cIa08hXbeitrxAJajLI05hsUy/2/YTKcUjQYzHe5mCcraLBw==}
engines: {node: '>=20.0.0'}
has-bigints@1.1.0:
@ -5954,8 +5954,8 @@ packages:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
ws@8.21.1:
resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==}
ws@8.22.0:
resolution: {integrity: sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
@ -7795,12 +7795,12 @@ snapshots:
optionalDependencies:
'@rspack/core': 2.0.8(@swc/helpers@0.5.23)
'@rstest/core@0.10.6(happy-dom@20.11.1)':
'@rstest/core@0.10.6(happy-dom@21.0.4)':
dependencies:
'@rsbuild/core': 2.0.15
'@types/chai': 5.2.3
optionalDependencies:
happy-dom: 20.11.1
happy-dom: 21.0.4
transitivePeerDependencies:
- '@module-federation/runtime-tools'
- core-js
@ -8250,7 +8250,7 @@ snapshots:
'@types/whatwg-mimetype@3.0.2': {}
'@types/ws@8.18.1':
'@types/ws@8.18.2':
dependencies:
'@types/node': 20.19.33
@ -9851,15 +9851,15 @@ snapshots:
hachure-fill@0.5.2: {}
happy-dom@20.11.1:
happy-dom@21.0.4:
dependencies:
'@types/node': 20.19.33
'@types/whatwg-mimetype': 3.0.2
'@types/ws': 8.18.1
'@types/ws': 8.18.2
buffer-image-size: 0.6.4
entities: 7.0.1
whatwg-mimetype: 3.0.0
ws: 8.21.1
ws: 8.22.0
transitivePeerDependencies:
- bufferutil
- utf-8-validate
@ -12566,7 +12566,7 @@ snapshots:
word-wrap@1.2.5: {}
ws@8.21.1: {}
ws@8.22.0: {}
yaml@2.8.3: {}

View File

@ -25,6 +25,14 @@ import {
} from "@/core/tasks/subtask-render";
import type { Subtask } from "@/core/tasks/types";
import { FlipDisplay as StaticFlipDisplay } from "../../../helpers/flip-display";
rs.mock("@/components/workspace/flip-display", () => ({
FlipDisplay: (props: Parameters<typeof StaticFlipDisplay>[0]) => (
<StaticFlipDisplay {...props} />
),
}));
rs.mock("@/core/tasks/api", () => ({ fetchSubtaskSteps: rs.fn() }));
afterEach(() => {

View File

@ -14,6 +14,14 @@ import { I18nContext } from "@/core/i18n/context";
import { enUS } from "@/core/i18n/locales/en-US";
import type { ArtifactEntry } from "@/core/threads/types";
import { FlipDisplay as StaticFlipDisplay } from "../../../helpers/flip-display";
rs.mock("@/components/workspace/flip-display", () => ({
FlipDisplay: (props: Parameters<typeof StaticFlipDisplay>[0]) => (
<StaticFlipDisplay {...props} />
),
}));
rs.mock("@/components/workspace/artifacts", () => ({
useArtifacts: () => ({ setOpen: () => undefined, select: () => undefined }),
}));

View File

@ -0,0 +1,17 @@
import type { ComponentProps } from "react";
import type { FlipDisplay as AnimatedFlipDisplay } from "@/components/workspace/flip-display";
// Content/state tests keep real React behavior without exercising Motion's
// browser animation lifecycle in Happy DOM. Preserve keyed child remounts.
export function FlipDisplay({
uniqueKey,
children,
className,
}: ComponentProps<typeof AnimatedFlipDisplay>) {
return (
<div className={className}>
<div key={uniqueKey}>{children}</div>
</div>
);
}