ci(node): default every shared workflow to Node 22 - #450
Merged
Conversation
`@nextcloud/eslint-config@9` cannot run on Node 20. It declares `engines.node: ^22.14 || ^24 || >=26` and its `dist/plugins/nextcloud/utils/lib-version-parser.js` imports `findPackageJSON` from `node:module`, an API that first exists in 22.14. On Node 20.20.2 the eslint job dies before linting a single file: SyntaxError: The requested module 'node:module' does not provide an export named 'findPackageJSON' npm reports the mismatch only as an `EBADENGINE` warning that it then continues past, so the crash is the only signal an app gets. Verified at the runner's own layer before changing the default: `node:20-alpine npx eslint src` reproduces the identical SyntaxError and `node:22-alpine` exits 0, on larpingapp (the first app migrated — ConductionNL/larpingapp#325). quality.yml, release.yml and documentation.yml move together: an app whose devDependencies require Node 22 to lint must build its release artefact and its docs on the same major. Node 22 is what Nextcloud's own apps target, so this keeps the fleet matching the upstream toolchain rather than moving ahead of it. Apps still on eslint 8 run fine on 22 — nothing pins Node 20 except `engines` fields, which npm only warns about — and `node-version` remains an input, so any app that needs to stay behind can still say so explicitly.
This was referenced Aug 14, 2026
Merged
Merged
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps the
node-versioninput default from"20"to"22"inquality.yml,release.ymlanddocumentation.yml.Why
@nextcloud/eslint-config@9cannot run on Node 20: it declaresengines.node: ^22.14 || ^24 || >=26and importsfindPackageJSONfromnode:module, an API that first exists in 22.14. On Node 20.20.2 the eslint job dies before linting a single file:npm reports the mismatch only as an
EBADENGINEwarning it then continues past, so the crash is the only signal.Verified at the runner's own layer first
On larpingapp (ConductionNL/larpingapp#325, the first app migrated):
node:20-alpine npx eslint srcSyntaxErrornode:22-alpine npx eslint srcRisk
Apps still on eslint 8 run fine on Node 22 — nothing pins Node 20 except
enginesfields, which npm only warns about.node-versionstays an input, so any app that must remain behind can say so explicitly. Node 22 is also what Nextcloud's own apps target, so this keeps the fleet matching the upstream toolchain rather than moving ahead of it.