Skip to content

chore: updated node to supported 22,24,25#7628

Merged
SamTV12345 merged 9 commits intodevelopfrom
feature/node-bump
Apr 28, 2026
Merged

chore: updated node to supported 22,24,25#7628
SamTV12345 merged 9 commits intodevelopfrom
feature/node-bump

Conversation

@SamTV12345
Copy link
Copy Markdown
Member

No description provided.

@SamTV12345 SamTV12345 marked this pull request as ready for review April 28, 2026 19:59
@qodo-free-for-open-source-projects
Copy link
Copy Markdown

Review Summary by Qodo

Bump minimum Node.js version to 22 and update CI matrix

✨ Enhancement

Grey Divider

Walkthroughs

Description
• Updated Node.js version matrix from 20, 22, 24 to 22, 24, 25
• Bumped minimum required Node.js version to 22.0.0
• Updated CI/CD workflows across all test and release pipelines
• Added changelog entry documenting breaking change
Diagram
flowchart LR
  A["Node 20, 22, 24"] -- "Remove 20, Add 25" --> B["Node 22, 24, 25"]
  C["package.json engines"] -- "Update minimum" --> D["Node >= 22.0.0"]
  E["CI Workflows"] -- "Update matrix" --> F["All pipelines"]
  G["Documentation"] -- "Update requirements" --> H["README.md"]
Loading

Grey Divider

File Changes

1. .github/workflows/backend-tests.yml ⚙️ Configuration changes +4/-4

Update Node.js test matrix to 22, 24, 25

.github/workflows/backend-tests.yml


2. .github/workflows/frontend-admin-tests.yml ⚙️ Configuration changes +1/-1

Update Node.js test matrix to 22, 24, 25

.github/workflows/frontend-admin-tests.yml


3. .github/workflows/releaseEtherpad.yml ⚙️ Configuration changes +3/-3

Update release workflow Node.js to 22

.github/workflows/releaseEtherpad.yml


View more (6)
4. .github/workflows/upgrade-from-latest-release.yml ⚙️ Configuration changes +1/-1

Update Node.js test matrix to 22, 24, 25

.github/workflows/upgrade-from-latest-release.yml


5. bin/plugins/lib/npmpublish.yml ⚙️ Configuration changes +3/-3

Update npm publish workflow Node.js to 22

bin/plugins/lib/npmpublish.yml


6. package.json Dependencies +1/-1

Update minimum Node.js engine requirement to 22

package.json


7. src/package.json Dependencies +1/-1

Update minimum Node.js engine requirement to 22

src/package.json


8. README.md 📝 Documentation +2/-2

Update Node.js version requirement documentation

README.md


9. CHANGELOG.md 📝 Documentation +6/-0

Add breaking change entry for Node.js 22 requirement

CHANGELOG.md


Grey Divider

Qodo Logo

@qodo-free-for-open-source-projects
Copy link
Copy Markdown

qodo-free-for-open-source-projects Bot commented Apr 28, 2026

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (1) 📎 Requirement gaps (0)

Grey Divider


Action required

1. Node engine bumped to 22 📘 Rule violation ⚙ Maintainability
Description
This PR raises the minimum supported Node.js version from 20 to 22, which is a breaking
compatibility change for existing users who are still on Node 20. The change introduces a hard
requirement with no compatibility/fallback path, violating the backward-compatibility requirement.
Code

package.json[45]

+    "node": ">=22.0.0"
Evidence
PR Compliance ID 2 requires maintaining backward compatibility for public
configuration/requirements. The PR changes the declared Node.js engine requirement to >=22.0.0
(and documents it as a breaking change), which will break installs/runs for users on Node 20 without
any compatibility strategy in this PR.

package.json[45-45]
src/package.json[136-136]
CHANGELOG.md[1-6]
Best Practice: Repository guidelines

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The PR introduces a breaking increase of the minimum Node.js requirement to 22 (via `engines.node`), which violates the backward-compatibility requirement unless a compatibility/deprecation strategy is provided.
## Issue Context
Users on Node 20 will be unable to install/run after this change. If dropping Node 20 is intended, provide a compatibility plan (e.g., deprecation period, delayed enforcement, or release strategy that preserves compatibility in this line).
## Fix Focus Areas
- package.json[45-45]
- src/package.json[136-136]
- CHANGELOG.md[1-6]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Installer allows Node 20🐞 Bug ≡ Correctness
Description
The PR bumps the minimum supported Node.js version to >=22, but the one-line installers still only
require Node 20, allowing users to proceed with an unsupported runtime and hit failures later
(dependency install or runtime).
Code

package.json[45]

+    "node": ">=22.0.0"
Evidence
package.json now enforces Node >=22, while both installer scripts still hardcode a minimum major
version of 20 and gate installation on that value; the README’s quick install section advertises
Node >=22, so the scripts are inconsistent with the documented and enforced requirement.

package.json[44-46]
README.md[65-75]
bin/installer.sh[33-56]
bin/installer.ps1[37-57]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Minimum supported Node.js is now >=22, but the POSIX and PowerShell one-line installers still accept Node 20.
### Issue Context
This PR updates `engines.node` and the README requirement to Node >=22. The installer scripts should reject Node 20 to avoid installing a broken setup.
### Fix Focus Areas
- bin/installer.sh[33-56]
- bin/installer.ps1[37-57]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Packages depend on Node 20🐞 Bug ≡ Correctness
Description
The Debian/RPM packaging metadata still declares nodejs (>= 20) even though Etherpad now requires
Node >=22, so package managers can install Node 20 and deliver a broken Etherpad install.
Code

package.json[45]

+    "node": ">=22.0.0"
Evidence
The runtime requirement is now Node >=22, but packaging/nfpm.yaml and packaging/README.md still
state Node >=20, including an explicit dependency constraint in nfpm.yaml that would allow Node 20
to satisfy package installation.

package.json[44-46]
packaging/nfpm.yaml[22-26]
packaging/nfpm.yaml[110-119]
packaging/README.md[72-75]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Packaging metadata still allows installation with Node 20, but the project now requires Node >=22.
### Issue Context
The `.deb/.rpm` dependencies should enforce the same minimum Node version as `package.json` to prevent broken installs.
### Fix Focus Areas
- packaging/nfpm.yaml[22-26]
- packaging/nfpm.yaml[110-119]
- packaging/README.md[72-75]
- .github/workflows/deb-package.yml[140-147]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

4. Docs still reference Node 20🐞 Bug ⚙ Maintainability
Description
Some documentation still states Node >=20 and references setup-node 20, contradicting the new
minimum Node >=22 and potentially causing contributors to use an unsupported runtime.
Code

README.md[69]

+The fastest way to get Etherpad running. Requires `git` and Node.js >= 22.
Evidence
The README now says Node >=22, but AGENTS.MD and the npm trusted publishing documentation still
reference Node >=20 and setup-node version 20, creating conflicting guidance.

README.md[67-75]
AGENTS.MD[8-11]
doc/npm-trusted-publishing.md[86-92]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Docs still mention Node 20 after the project minimum was bumped to Node >=22.
### Issue Context
README and `engines.node` have been updated; remaining docs should be consistent to avoid setup confusion.
### Fix Focus Areas
- AGENTS.MD[8-11]
- doc/npm-trusted-publishing.md[86-92]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment thread package.json
},
"engines": {
"node": ">=20.0.0"
"node": ">=22.0.0"
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Action required

1. Node engine bumped to 22 📘 Rule violation ⚙ Maintainability

This PR raises the minimum supported Node.js version from 20 to 22, which is a breaking
compatibility change for existing users who are still on Node 20. The change introduces a hard
requirement with no compatibility/fallback path, violating the backward-compatibility requirement.
Agent Prompt
## Issue description
The PR introduces a breaking increase of the minimum Node.js requirement to 22 (via `engines.node`), which violates the backward-compatibility requirement unless a compatibility/deprecation strategy is provided.

## Issue Context
Users on Node 20 will be unable to install/run after this change. If dropping Node 20 is intended, provide a compatibility plan (e.g., deprecation period, delayed enforcement, or release strategy that preserves compatibility in this line).

## Fix Focus Areas
- package.json[45-45]
- src/package.json[136-136]
- CHANGELOG.md[1-6]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Node 20 is end of life. People can update without any problem.

Comment thread package.json
Comment thread package.json
@qodo-free-for-open-source-projects
Copy link
Copy Markdown

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: Playwright Firefox with plugins

Failed stage: Run the frontend tests [❌]

Failed test name: ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading is changed

Failure summary:

The GitHub Action failed during the Playwright UI test run (WITH_PLUGINS=1 pnpm run test-ui
--project=firefox) because at least one test consistently failed and the test command exited
non-zero (ELIFECYCLE Command failed with exit code 1).

Failing test (non-flaky):
-
plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:44:7
(ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading
is changed) failed after retries (#1#5). The assertion at headings.spec.ts:74:26 expected the
second line to be exactly Second Line, but the DOM text was unexpectedly truncated/variant (e.g.,
Secon, Second, Second , Seco), causing expect(locator).toHaveText('Second Line') to time out.

Additional issues observed (marked flaky in the run summary, but still indicate instability):
-
ep_markdown test markdown.spec.ts timed out (90s) because clicks on .buttonicon-bold were blocked:

intercepts pointer events (markdown.spec.ts:19:48).
- Core italic.spec.ts
timed out (90s) for the same reason:
intercepts pointer events

(italic.spec.ts:26:23).

Note: Earlier curl probes showed repeated Failed to connect to localhost port 9001, suggesting
initial server startup/connectivity issues, though the UI test suite later executed and produced
results.

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

276:  + ep_table_of_contents ^0.3.138
277:  Packages: +39
278:  +++++++++++++++++++++++++++++++++++++++
279:  Done in 6.4s using pnpm v10.33.2
280:  ##[group]Run cp ./src/tests/settings.json settings.json
281:  �[36;1mcp ./src/tests/settings.json settings.json�[0m
282:  shell: /usr/bin/bash -e {0}
283:  env:
284:  PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
285:  ##[endgroup]
286:  ##[group]Run set -euo pipefail
287:  �[36;1mset -euo pipefail�[0m
288:  �[36;1mpnpm run prod > /tmp/etherpad-server.log 2>&1 &�[0m
289:  �[36;1m# Generous 90s budget so a slow runner (or, in the with-plugins�[0m
290:  �[36;1m# variant, plugin boot) doesn't lose the race against the test�[0m
291:  �[36;1m# phase. Fail loudly on timeout rather than silently falling�[0m
292:  �[36;1m# through to tests against a half-started server.�[0m
293:  �[36;1m# --max-time bounds each probe so a stuck server can't make a�[0m
294:  �[36;1m# single curl call eat the whole 90s budget.�[0m
295:  �[36;1mcan_connect() { curl --max-time 3 -sSfo /dev/null http://localhost:9001/; }�[0m
296:  �[36;1mfor i in $(seq 1 90); do can_connect && break; sleep 1; done�[0m
297:  �[36;1mif ! can_connect; then�[0m
298:  �[36;1m  echo "::error::Etherpad did not respond on :9001 within 90s"�[0m
299:  �[36;1m  echo "----- server log -----"�[0m
300:  �[36;1m  tail -n 200 /tmp/etherpad-server.log || true�[0m
301:  �[36;1m  exit 1�[0m
302:  �[36;1mfi�[0m
303:  �[36;1mcd src�[0m
304:  �[36;1mpnpm exec playwright install firefox  --with-deps�[0m
305:  �[36;1m# WITH_PLUGINS skips a small set of specs that fail when the�[0m
306:  �[36;1m# /ether plugin set is loaded — tracked for fixup follow-ups.�[0m
307:  �[36;1mWITH_PLUGINS=1 pnpm run test-ui --project=firefox�[0m
308:  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
309:  env:
310:  PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
311:  ##[endgroup]
312:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
313:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
314:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
315:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
316:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
317:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
318:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
319:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
320:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
321:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
322:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
323:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
324:  curl: (7) Failed to connect to localhost port 9001 after 0 ms: Couldn't connect to server
325:  Installing dependencies...
...

756:  ✓   55 [firefox] › tests/frontend-new/specs/chat.spec.ts:142:5 › chat title bar lays out as a centred flex row with underscore minimize (875ms)
757:  ✓   56 [firefox] › tests/frontend-new/specs/chat.spec.ts:190:5 › chat icon click reliably opens the chat box (848ms)
758:  ✓   57 [firefox] › tests/frontend-new/specs/clear_authorship_color.spec.ts:17:5 › clear authorship color (1.5s)
759:  ✓   58 [firefox] › tests/frontend-new/specs/clear_authorship_color.spec.ts:38:5 › clear authorship colors can be undone to restore author colors (1.5s)
760:  -   59 [firefox] › tests/frontend-new/specs/clear_authorship_color.spec.ts:73:5 › clears authorship when first line has line attributes
761:  -   60 [firefox] › tests/frontend-new/specs/collab_client.spec.ts:39:7 › Messages in the COLLABROOM › bug #4978 regression test
762:  -   61 [firefox] › tests/frontend-new/specs/delete.spec.ts:10:5 › delete keystroke
763:  ✘   44 [firefox] › plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:44:7 › ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading is changed (retry #5) (22.4s)
764:  ✓   62 [firefox] › tests/frontend-new/specs/editbar.spec.ts:9:5 › should go to home on pad (1.0s)
765:  ✓   63 [firefox] › tests/frontend-new/specs/embed_value.spec.ts:78:9 › embed links › read and write › is an iframe with the correct url parameters and correct size (1.7s)
766:  ✓   65 [firefox] › tests/frontend-new/specs/embed_value.spec.ts:97:11 › embed links › when read only option is set › the share link shows a read only url (1.9s)
767:  ✓   64 [firefox] › tests/frontend-new/specs/embed_value.spec.ts:66:11 › embed links › read and write › the share link is the actual pad url (2.7s)
768:  ✓   67 [firefox] › tests/frontend-new/specs/enter.spec.ts:11:7 › enter keystroke › creates a new line & puts cursor onto a new line (1.2s)
769:  ✓   66 [firefox] › tests/frontend-new/specs/embed_value.spec.ts:114:11 › embed links › when read only option is set › the embed as iframe code is an iframe with the correct url parameters and correct size (1.9s)
770:  -   68 [firefox] › tests/frontend-new/specs/enter.spec.ts:33:7 › enter keystroke › enter is always visible after event
771:  ✓   69 [firefox] › tests/frontend-new/specs/error_sanitization.spec.ts:10:7 › error sanitization › production mode hides error details from gritter popup (1.0s)
772:  ✓   70 [firefox] › tests/frontend-new/specs/error_sanitization.spec.ts:45:7 › error sanitization › development mode shows full error details in gritter popup (1.0s)
773:  ✓   71 [firefox] › tests/frontend-new/specs/error_sanitization.spec.ts:70:7 › error sanitization › duplicate errors are deduplicated in both modes (1.2s)
774:  ✓   72 [firefox] › tests/frontend-new/specs/error_sanitization.spec.ts:93:7 › error sanitization › errors before clientVars handshake default to hiding details (973ms)
775:  ✓   74 [firefox] › tests/frontend-new/specs/indentation.spec.ts:9:7 › indentation button › indent text with keypress (1.0s)
...

802:  ✓  101 [firefox] › tests/frontend-new/specs/pad_settings.spec.ts:167:7 › creator-owned pad settings › disabling chat disables and visually greys the dependent chat toggles (1.4s)
803:  -  102 [firefox] › tests/frontend-new/specs/page_up_down.spec.ts:12:7 › Page Up / Page Down › PageDown moves caret forward by a page of lines
804:  ✓  103 [firefox] › tests/frontend-new/specs/page_up_down.spec.ts:52:7 › Page Up / Page Down › PageUp moves caret backward by a page of lines (5.1s)
805:  -  104 [firefox] › tests/frontend-new/specs/page_up_down.spec.ts:92:7 › Page Up / Page Down › PageDown with consecutive long wrapped lines moves by correct amount (#4562)
806:  -  105 [firefox] › tests/frontend-new/specs/page_up_down.spec.ts:148:7 › Page Up / Page Down › PageDown then PageUp returns to approximately same position
807:  ✓  106 [firefox] › tests/frontend-new/specs/redo.spec.ts:12:7 › undo button then redo button › redo some typing with button (1.5s)
808:  ✓  107 [firefox] › tests/frontend-new/specs/redo.spec.ts:39:7 › undo button then redo button › redo some typing with keypress (1.3s)
809:  ✓  108 [firefox] › tests/frontend-new/specs/rtl_url_param.spec.ts:11:7 › RTL URL parameter › rtl=true enables RTL mode (1.1s)
810:  ✓  109 [firefox] › tests/frontend-new/specs/rtl_url_param.spec.ts:16:7 › RTL URL parameter › rtl=false disables RTL mode after rtl=true (1.6s)
811:  ✓  110 [firefox] › tests/frontend-new/specs/rtl_url_param.spec.ts:26:7 › RTL URL parameter › no rtl param falls back to the pad setting after an RTL URL override (1.5s)
812:  -  111 [firefox] › tests/frontend-new/specs/select_focus_restore.spec.ts:8:5 › toolbar select change returns focus to the pad editor (#7589)
813:  ✓  112 [firefox] › tests/frontend-new/specs/strikethrough.spec.ts:10:7 › strikethrough button › makes text strikethrough (873ms)
814:  ✓  113 [firefox] › tests/frontend-new/specs/timeslider_follow.spec.ts:15:7 › timeslider follow › content as it's added to timeslider (2.6s)
815:  -  114 [firefox] › tests/frontend-new/specs/timeslider_follow.spec.ts:50:7 › timeslider follow › only to lines that exist in the pad view, regression test for #4389
816:  ✓  115 [firefox] › tests/frontend-new/specs/timeslider_identity_changeset.spec.ts:16:7 › Timeslider with identity changesets (bug #5214) › timeslider playback advances through all revisions including identity changesets (9.3s)
817:  ✓  116 [firefox] › tests/frontend-new/specs/timeslider_identity_changeset.spec.ts:58:7 › Timeslider with identity changesets (bug #5214) › timeslider can scrub through all revisions without error (3.4s)
818:  -  117 [firefox] › tests/frontend-new/specs/timeslider_line_numbers.spec.ts:10:7 › timeslider line numbers › shows line numbers aligned with the rendered document lines
...

860:  -  159 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:32:9 › special characters inside URL › https://etherpad.org/$foo
861:  -  160 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:32:9 › special characters inside URL › https://etherpad.org/'foo
862:  -  161 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:32:9 › special characters inside URL › https://etherpad.org/*foo
863:  -  162 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:49:9 › punctuation after URL is ignored › https://etherpad.org:
864:  -  163 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:49:9 › punctuation after URL is ignored › https://etherpad.org.
865:  -  164 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:49:9 › punctuation after URL is ignored › https://etherpad.org,
866:  -  165 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:49:9 › punctuation after URL is ignored › https://etherpad.org;
867:  -  166 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:49:9 › punctuation after URL is ignored › https://etherpad.org?
868:  -  167 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:49:9 › punctuation after URL is ignored › https://etherpad.org!
869:  -  168 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:49:9 › punctuation after URL is ignored › https://etherpad.org)
870:  -  169 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:49:9 › punctuation after URL is ignored › https://etherpad.org]
871:  -  170 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:49:9 › punctuation after URL is ignored › https://etherpad.org'
872:  -  171 [firefox] › tests/frontend-new/specs/urls_become_clickable.spec.ts:49:9 › punctuation after URL is ignored › https://etherpad.org*
873:  ✘   83 [firefox] › tests/frontend-new/specs/italic.spec.ts:10:7 › italic some text › makes text italic using button (1.5m)
874:  ✓  172 [firefox] › tests/frontend-new/specs/italic.spec.ts:10:7 › italic some text › makes text italic using button (retry #1) (1.7s)
875:  ##[error]  1) [firefox] › plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:44:7 › ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading is changed 
876:      Error: expect(locator).toHaveText(expected) failed
877:  
...

883:      Call log:
884:        - Expect "toHaveText" with timeout 20000ms
885:        - waiting for locator('#innerdocbody').locator('div').nth(1)
886:          24 × locator resolved to <div class="ace-line" id="magicdomid18">…</div>
887:             - unexpected value "Secon"
888:  
889:  
890:        72 |     const second = padBody.locator('div').nth(1);
891:        73 |     await expect(second.locator('h1')).toHaveCount(0);
892:      > 74 |     await expect(second).toHaveText('Second Line');
893:           |                          ^
894:        75 |   });
895:        76 | });
896:        77 |
897:          at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
898:  ##[error]  1) [firefox] › plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:44:7 › ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading is changed 
899:  
900:      Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
901:      Error: expect(locator).toHaveText(expected) failed
902:  
...

908:      Call log:
909:        - Expect "toHaveText" with timeout 20000ms
910:        - waiting for locator('#innerdocbody').locator('div').nth(1)
911:          24 × locator resolved to <div class="ace-line" id="magicdomid19">…</div>
912:             - unexpected value "Second"
913:  
914:  
915:        72 |     const second = padBody.locator('div').nth(1);
916:        73 |     await expect(second.locator('h1')).toHaveCount(0);
917:      > 74 |     await expect(second).toHaveText('Second Line');
918:           |                          ^
919:        75 |   });
920:        76 | });
921:        77 |
922:          at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
923:  ##[error]  1) [firefox] › plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:44:7 › ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading is changed 
924:  
925:      Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
926:      Error: expect(locator).toHaveText(expected) failed
927:  
...

933:      Call log:
934:        - Expect "toHaveText" with timeout 20000ms
935:        - waiting for locator('#innerdocbody').locator('div').nth(1)
936:          24 × locator resolved to <div class="ace-line" id="magicdomid20">…</div>
937:             - unexpected value "Second "
938:  
939:  
940:        72 |     const second = padBody.locator('div').nth(1);
941:        73 |     await expect(second.locator('h1')).toHaveCount(0);
942:      > 74 |     await expect(second).toHaveText('Second Line');
943:           |                          ^
944:        75 |   });
945:        76 | });
946:        77 |
947:          at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
948:  ##[error]  1) [firefox] › plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:44:7 › ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading is changed 
949:  
950:      Retry #3 ───────────────────────────────────────────────────────────────────────────────────────
951:      Error: expect(locator).toHaveText(expected) failed
952:  
...

958:      Call log:
959:        - Expect "toHaveText" with timeout 20000ms
960:        - waiting for locator('#innerdocbody').locator('div').nth(1)
961:          24 × locator resolved to <div class="ace-line" id="magicdomid20">…</div>
962:             - unexpected value "Second "
963:  
964:  
965:        72 |     const second = padBody.locator('div').nth(1);
966:        73 |     await expect(second.locator('h1')).toHaveCount(0);
967:      > 74 |     await expect(second).toHaveText('Second Line');
968:           |                          ^
969:        75 |   });
970:        76 | });
971:        77 |
972:          at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
973:  ##[error]  1) [firefox] › plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:44:7 › ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading is changed 
974:  
975:      Retry #4 ───────────────────────────────────────────────────────────────────────────────────────
976:      Error: expect(locator).toHaveText(expected) failed
977:  
...

983:      Call log:
984:        - Expect "toHaveText" with timeout 20000ms
985:        - waiting for locator('#innerdocbody').locator('div').nth(1)
986:          23 × locator resolved to <div class="ace-line" id="magicdomid17">…</div>
987:             - unexpected value "Seco"
988:  
989:  
990:        72 |     const second = padBody.locator('div').nth(1);
991:        73 |     await expect(second.locator('h1')).toHaveCount(0);
992:      > 74 |     await expect(second).toHaveText('Second Line');
993:           |                          ^
994:        75 |   });
995:        76 | });
996:        77 |
997:          at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
998:  ##[error]  1) [firefox] › plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:44:7 › ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading is changed 
999:  
1000:      Retry #5 ───────────────────────────────────────────────────────────────────────────────────────
1001:      Error: expect(locator).toHaveText(expected) failed
1002:  
...

1008:      Call log:
1009:        - Expect "toHaveText" with timeout 20000ms
1010:        - waiting for locator('#innerdocbody').locator('div').nth(1)
1011:          23 × locator resolved to <div class="ace-line" id="magicdomid17">…</div>
1012:             - unexpected value "Seco"
1013:  
1014:  
1015:        72 |     const second = padBody.locator('div').nth(1);
1016:        73 |     await expect(second.locator('h1')).toHaveCount(0);
1017:      > 74 |     await expect(second).toHaveText('Second Line');
1018:           |                          ^
1019:        75 |   });
1020:        76 | });
1021:        77 |
1022:          at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
1023:  ##[error]  2) [firefox] › plugin_packages/.versions/ep_markdown@11.0.17/static/tests/frontend-new/specs/markdown.spec.ts:10:7 › ep_markdown › Bold section renders the markdown class on body when "Show Markdown" is enabled 
1024:      Test timeout of 90000ms exceeded.
1025:  ##[error]  2) [firefox] › plugin_packages/.versions/ep_markdown@11.0.17/static/tests/frontend-new/specs/markdown.spec.ts:10:7 › ep_markdown › Bold section renders the markdown class on body when "Show Markdown" is enabled 
1026:      Error: locator.click: Test timeout of 90000ms exceeded.
1027:      Call log:
...

1047:              - scrolling into view if needed
1048:              - done scrolling
1049:              - <div id="toolbar-overlay"></div> intercepts pointer events
1050:            - retrying click action
1051:              - waiting 500ms
1052:  
1053:  
1054:        17 |
1055:        18 |         // Apply bold via the toolbar button.
1056:      > 19 |         await page.locator('.buttonicon-bold').click();
1057:           |                                                ^
1058:        20 |
1059:        21 |         // Toggle "Show Markdown" in pad settings.
1060:        22 |         // Settings popup must be open for #options-markdown to be clickable.
1061:          at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_markdown@11.0.17/static/tests/frontend-new/specs/markdown.spec.ts:19:48
1062:  ##[error]  3) [firefox] › tests/frontend-new/specs/italic.spec.ts:10:7 › italic some text › makes text italic using button 
1063:      Test timeout of 90000ms exceeded.
1064:  ##[error]  3) [firefox] › tests/frontend-new/specs/italic.spec.ts:10:7 › italic some text › makes text italic using button 
1065:      Error: locator.click: Test timeout of 90000ms exceeded.
1066:      Call log:
...

1086:              - scrolling into view if needed
1087:              - done scrolling
1088:              - <div id="toolbar-overlay"></div> intercepts pointer events
1089:            - retrying click action
1090:              - waiting 500ms
1091:  
1092:  
1093:        24 |     // get the bold button and click it
1094:        25 |     const $boldButton = page.locator('.buttonicon-italic');
1095:      > 26 |     await $boldButton.click();
1096:           |                       ^
1097:        27 |
1098:        28 |     // ace creates a new dom element when you press a button, just get the first text element again
1099:        29 |     const $newFirstTextElement = padBody.locator('div').first();
1100:          at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/italic.spec.ts:26:23
1101:  ##[notice]  1 failed
1102:      [firefox] › plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:44:7 › ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading is changed 
1103:    2 flaky
1104:      [firefox] › plugin_packages/.versions/ep_markdown@11.0.17/static/tests/frontend-new/specs/markdown.spec.ts:10:7 › ep_markdown › Bold section renders the markdown class on body when "Show Markdown" is enabled 
1105:      [firefox] › tests/frontend-new/specs/italic.spec.ts:10:7 › italic some text › makes text italic using button 
1106:    67 skipped
1107:    95 passed (4.4m)
1108:  1) [firefox] › plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:44:7 › ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading is changed 
1109:  Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoHaveText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed
1110:  Locator:  locator('#innerdocbody').locator('div').nth(1)
...

1112:  Received: �[31m"Secon"�[39m
1113:  Timeout:  20000ms
1114:  Call log:
1115:  �[2m  - Expect "toHaveText" with timeout 20000ms�[22m
1116:  �[2m  - waiting for locator('#innerdocbody').locator('div').nth(1)�[22m
1117:  �[2m    24 × locator resolved to <div class="ace-line" id="magicdomid18">…</div>�[22m
1118:  �[2m       - unexpected value "Secon"�[22m
1119:  72 |     const second = padBody.locator('div').nth(1);
1120:  73 |     await expect(second.locator('h1')).toHaveCount(0);
1121:  > 74 |     await expect(second).toHaveText('Second Line');
1122:  |                          ^
1123:  75 |   });
1124:  76 | });
1125:  77 |
1126:  at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
1127:  Error Context: test-results/plugin_packages-.versions--8635e-ged-when-heading-is-changed-firefox/error-context.md
1128:  Retry #1 ───────────────────────────────────────────────────────────────────────────────────────
1129:  Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoHaveText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed
1130:  Locator:  locator('#innerdocbody').locator('div').nth(1)
...

1135:  �[2m  - Expect "toHaveText" with timeout 20000ms�[22m
1136:  �[2m  - waiting for locator('#innerdocbody').locator('div').nth(1)�[22m
1137:  �[2m    24 × locator resolved to <div class="ace-line" id="magicdomid19">…</div>�[22m
1138:  �[2m       - unexpected value "Second"�[22m
1139:  72 |     const second = padBody.locator('div').nth(1);
1140:  73 |     await expect(second.locator('h1')).toHaveCount(0);
1141:  > 74 |     await expect(second).toHaveText('Second Line');
1142:  |                          ^
1143:  75 |   });
1144:  76 | });
1145:  77 |
1146:  at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
1147:  attachment #1: video (video/webm) ──────────────────────────────────────────────────────────────
1148:  test-results/plugin_packages-.versions--8635e-ged-when-heading-is-changed-firefox-retry1/video.webm
1149:  ────────────────────────────────────────────────────────────────────────────────────────────────
1150:  Error Context: test-results/plugin_packages-.versions--8635e-ged-when-heading-is-changed-firefox-retry1/error-context.md
1151:  attachment #3: trace (application/zip) ─────────────────────────────────────────────────────────
1152:  test-results/plugin_packages-.versions--8635e-ged-when-heading-is-changed-firefox-retry1/trace.zip
1153:  Usage:
1154:  pnpm exec playwright show-trace test-results/plugin_packages-.versions--8635e-ged-when-heading-is-changed-firefox-retry1/trace.zip
1155:  ────────────────────────────────────────────────────────────────────────────────────────────────
1156:  Retry #2 ───────────────────────────────────────────────────────────────────────────────────────
1157:  Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoHaveText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed
1158:  Locator:  locator('#innerdocbody').locator('div').nth(1)
...

1160:  Received: �[31m"Second�[7m �[27m"�[39m
1161:  Timeout:  20000ms
1162:  Call log:
1163:  �[2m  - Expect "toHaveText" with timeout 20000ms�[22m
1164:  �[2m  - waiting for locator('#innerdocbody').locator('div').nth(1)�[22m
1165:  �[2m    24 × locator resolved to <div class="ace-line" id="magicdomid20">…</div>�[22m
1166:  �[2m       - unexpected value "Second "�[22m
1167:  72 |     const second = padBody.locator('div').nth(1);
1168:  73 |     await expect(second.locator('h1')).toHaveCount(0);
1169:  > 74 |     await expect(second).toHaveText('Second Line');
1170:  |                          ^
1171:  75 |   });
1172:  76 | });
1173:  77 |
1174:  at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
1175:  Error Context: test-results/plugin_packages-.versions--8635e-ged-when-heading-is-changed-firefox-retry2/error-context.md
1176:  Retry #3 ───────────────────────────────────────────────────────────────────────────────────────
1177:  Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoHaveText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed
1178:  Locator:  locator('#innerdocbody').locator('div').nth(1)
...

1180:  Received: �[31m"Second�[7m �[27m"�[39m
1181:  Timeout:  20000ms
1182:  Call log:
1183:  �[2m  - Expect "toHaveText" with timeout 20000ms�[22m
1184:  �[2m  - waiting for locator('#innerdocbody').locator('div').nth(1)�[22m
1185:  �[2m    24 × locator resolved to <div class="ace-line" id="magicdomid20">…</div>�[22m
1186:  �[2m       - unexpected value "Second "�[22m
1187:  72 |     const second = padBody.locator('div').nth(1);
1188:  73 |     await expect(second.locator('h1')).toHaveCount(0);
1189:  > 74 |     await expect(second).toHaveText('Second Line');
1190:  |                          ^
1191:  75 |   });
1192:  76 | });
1193:  77 |
1194:  at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
1195:  Error Context: test-results/plugin_packages-.versions--8635e-ged-when-heading-is-changed-firefox-retry3/error-context.md
1196:  Retry #4 ───────────────────────────────────────────────────────────────────────────────────────
1197:  Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoHaveText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed
1198:  Locator:  locator('#innerdocbody').locator('div').nth(1)
...

1200:  Received: �[31m"Seco"�[39m
1201:  Timeout:  20000ms
1202:  Call log:
1203:  �[2m  - Expect "toHaveText" with timeout 20000ms�[22m
1204:  �[2m  - waiting for locator('#innerdocbody').locator('div').nth(1)�[22m
1205:  �[2m    23 × locator resolved to <div class="ace-line" id="magicdomid17">…</div>�[22m
1206:  �[2m       - unexpected value "Seco"�[22m
1207:  72 |     const second = padBody.locator('div').nth(1);
1208:  73 |     await expect(second.locator('h1')).toHaveCount(0);
1209:  > 74 |     await expect(second).toHaveText('Second Line');
1210:  |                          ^
1211:  75 |   });
1212:  76 | });
1213:  77 |
1214:  at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
1215:  Error Context: test-results/plugin_packages-.versions--8635e-ged-when-heading-is-changed-firefox-retry4/error-context.md
1216:  Retry #5 ───────────────────────────────────────────────────────────────────────────────────────
1217:  Error: �[2mexpect(�[22m�[31mlocator�[39m�[2m).�[22mtoHaveText�[2m(�[22m�[32mexpected�[39m�[2m)�[22m failed
1218:  Locator:  locator('#innerdocbody').locator('div').nth(1)
...

1220:  Received: �[31m"Seco"�[39m
1221:  Timeout:  20000ms
1222:  Call log:
1223:  �[2m  - Expect "toHaveText" with timeout 20000ms�[22m
1224:  �[2m  - waiting for locator('#innerdocbody').locator('div').nth(1)�[22m
1225:  �[2m    23 × locator resolved to <div class="ace-line" id="magicdomid17">…</div>�[22m
1226:  �[2m       - unexpected value "Seco"�[22m
1227:  72 |     const second = padBody.locator('div').nth(1);
1228:  73 |     await expect(second.locator('h1')).toHaveCount(0);
1229:  > 74 |     await expect(second).toHaveText('Second Line');
1230:  |                          ^
1231:  75 |   });
1232:  76 | });
1233:  77 |
1234:  at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:74:26
1235:  Error Context: test-results/plugin_packages-.versions--8635e-ged-when-heading-is-changed-firefox-retry5/error-context.md
1236:  2) [firefox] › plugin_packages/.versions/ep_markdown@11.0.17/static/tests/frontend-new/specs/markdown.spec.ts:10:7 › ep_markdown › Bold section renders the markdown class on body when "Show Markdown" is enabled 
1237:  �[31mTest timeout of 90000ms exceeded.�[39m
1238:  Error: locator.click: Test timeout of 90000ms exceeded.
1239:  Call log:
...

1257:  �[2m    171 × waiting for element to be visible, enabled and stable�[22m
1258:  �[2m        - element is visible, enabled and stable�[22m
1259:  �[2m        - scrolling into view if needed�[22m
1260:  �[2m        - done scrolling�[22m
1261:  �[2m        - <div id="toolbar-overlay"></div> intercepts pointer events�[22m
1262:  �[2m      - retrying click action�[22m
1263:  �[2m        - waiting 500ms�[22m
1264:  17 |
1265:  18 |         // Apply bold via the toolbar button.
1266:  > 19 |         await page.locator('.buttonicon-bold').click();
1267:  |                                                ^
1268:  20 |
1269:  21 |         // Toggle "Show Markdown" in pad settings.
1270:  22 |         // Settings popup must be open for #options-markdown to be clickable.
1271:  at /home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_markdown@11.0.17/static/tests/frontend-new/specs/markdown.spec.ts:19:48
1272:  Error Context: test-results/plugin_packages-.versions--eda5f-en-Show-Markdown-is-enabled-firefox/error-context.md
1273:  3) [firefox] › tests/frontend-new/specs/italic.spec.ts:10:7 › italic some text › makes text italic using button 
1274:  �[31mTest timeout of 90000ms exceeded.�[39m
1275:  Error: locator.click: Test timeout of 90000ms exceeded.
1276:  Call log:
...

1294:  �[2m    171 × waiting for element to be visible, enabled and stable�[22m
1295:  �[2m        - element is visible, enabled and stable�[22m
1296:  �[2m        - scrolling into view if needed�[22m
1297:  �[2m        - done scrolling�[22m
1298:  �[2m        - <div id="toolbar-overlay"></div> intercepts pointer events�[22m
1299:  �[2m      - retrying click action�[22m
1300:  �[2m        - waiting 500ms�[22m
1301:  24 |     // get the bold button and click it
1302:  25 |     const $boldButton = page.locator('.buttonicon-italic');
1303:  > 26 |     await $boldButton.click();
1304:  |                       ^
1305:  27 |
1306:  28 |     // ace creates a new dom element when you press a button, just get the first text element again
1307:  29 |     const $newFirstTextElement = padBody.locator('div').first();
1308:  at /home/runner/work/etherpad/etherpad/src/tests/frontend-new/specs/italic.spec.ts:26:23
1309:  Error Context: test-results/tests-frontend-new-specs-i-0bd4e-es-text-italic-using-button-firefox/error-context.md
1310:  1 failed
1311:  [firefox] › plugin_packages/.versions/ep_headings2@0.2.112/static/tests/frontend-new/specs/headings.spec.ts:44:7 › ep_headings2 - Set Heading and ensure its removed properly › Option select is changed when heading is changed 
1312:  2 flaky
1313:  [firefox] › plugin_packages/.versions/ep_markdown@11.0.17/static/tests/frontend-new/specs/markdown.spec.ts:10:7 › ep_markdown › Bold section renders the markdown class on body when "Show Markdown" is enabled 
1314:  [firefox] › tests/frontend-new/specs/italic.spec.ts:10:7 › italic some text › makes text italic using button 
1315:  67 skipped
1316:  95 passed (4.4m)
1317:  ELIFECYCLE  Command failed with exit code 1.
1318:  ##[error]Process completed with exit code 1.
1319:  ##[group]Run actions/upload-artifact@v7

@SamTV12345 SamTV12345 merged commit c550073 into develop Apr 28, 2026
38 of 44 checks passed
@SamTV12345 SamTV12345 deleted the feature/node-bump branch April 28, 2026 20:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant