Commit Graph

27161 Commits

Author SHA1 Message Date
Jamie Tanna 27875b6bf7 ci: don't gate build-docs on lint-docs
So we can run them both in parallel, speeding up the overall run time.

This may lead to a case where we run `build-docs` in the case a linting
failure is hit, but it also allows running them both in parallel which
could save ~1m of wasted waiting time.

Co-authored-by: Claude Fable 5 <jamie.tanna+claude-code@mend.io>
2026-08-18 11:04:13 +01:00
Jamie Tanna 97c10ffcc9 ci: add restore-keys fallback for tsbuildinfo cache
Like the vitest cache, the tsbuildinfo cache in `lint-other` can only
restore entries whose key contains the current
`hashFiles('pnpm-lock.yaml')` — its existing `restore-keys` prefix
still embeds the hash — so every lockfile change makes `type-check`
run a full, rather than incremental, `tsc`.

We can add a bare `tsbuildinfo-` fallback after the existing
same-hash prefix, restoring the newest cache from before the lockfile
bump. tsc records the version of every input file in the buildinfo
and recompiles whatever changed, so a stale restore is safe.

We intentionally leave the similarly-shaped prettier cache without a
cross-hash fallback: prettier can't detect plugin changes, so the
lockfile hash in its key is the only thing invalidating its cache
when a plugin updates — a cross-hash restore could wrongly skip
reformatting files.

Co-authored-by: Claude Fable 5 <jamie.tanna+claude-code@mend.io>
2026-08-18 11:04:13 +01:00
Jamie Tanna a265d4a56e ci: add restore-keys fallback for vitest cache
The vitest cache key in `test` embeds `hashFiles('pnpm-lock.yaml')`
and has no `restore-keys`, so every lockfile change starts each test
shard fully cold, re-transforming the whole codebase. As Renovate
updates its own lockfile near-daily, this is the common case rather
than the exception.

Because `restore-keys` performs prefix matching, it can only wildcard
the end of a key, so we first reorder the key to put
`matrix.cache-key` before the lockfile hash. The fallback then means
"same shard, any lockfile". vitest validates restored entries itself
(transforms are keyed by content hash), so a stale restore degrades
to a rebuild, never a wrong result.

Due to the reorder, the first run after this change won't match any
existing cache entry, so will start cold once.

Co-authored-by: Claude Fable 5 <jamie.tanna+claude-code@mend.io>
2026-08-18 11:04:13 +01:00
Jamie Tanna 6a7683b750 ci: correctly generate prefetch matrix cache key
As `setup-node` currently uses a hash based on
`hashFiles('pnpm-lock.yaml', 'package.json')`, but we weren't doing the
same here, we would always have a cache miss, and we would need to run
the macOS prefetch, regardless of whether the cache was warm or cold.

Co-authored-by: Claude Fable 5 <jamie.tanna+claude-code@mend.io>
2026-08-18 11:04:13 +01:00
Jamie Tanna 4dae13669d ci: don't gate lint-actions on setup-build
As `lint-actions` doesn't currently need any access to `pnpm` artifacts,
we can run this check earlier than needing to have `setup-build` (and a
cache hit or miss).

Co-authored-by: Claude Fable 5 <jamie.tanna+claude-code@mend.io>
2026-08-18 11:04:13 +01:00
Jamie Tanna d1073f0bc8 ci: remove duplicated markdown-lint step from lint-docs
As we run the command earlier in the job, too.

Co-authored-by: Claude Fable 5 <jamie.tanna+claude-code@mend.io>
2026-08-18 11:04:13 +01:00
renovate[bot] 1333d2c050 fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.87.3 (main) (#45332)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.87.3

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.87.2 | 13.87.3 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-18 09:52:24 +00:00
renovate[bot] 72f9949c9d chore(deps): update dependency @biomejs/biome to v2.5.8 (main) (#45329)
chore(deps): update dependency @biomejs/biome to v2.5.8

| datasource | package        | from  | to    |
| ---------- | -------------- | ----- | ----- |
| npm        | @biomejs/biome | 2.5.7 | 2.5.8 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-18 09:48:53 +00:00
RahulGautamSingh 37444eff27 fix(datasource): keep merged releases when a registry is rate-limited (#45299)
* fix(datasource): keep merged releases when a registry is rate-limited

* apply suggestions
44.33.1
2026-08-18 09:21:54 +00:00
Felipe Santos 2606ae2bd3 feat(pypi): add support for JSON-based Simple API (PEP 691) (#44222)
* feat(pypi): add support for JSON-based Simple API (PEP 691)

* Fix some stuff

* Clean some things up

* Fix coverage

* Simplify JSON parse

* Remove useless tests

* Align terminology

* Incorporate some changes from PR #44182

Co-authored-by: Andreas Hippler <andreas.hippler@goto.com>

* Use isNonEmptyString to filter requires_python

* Address review feedback

* Warn once actually

* fixup! review comments

Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>

* fixup! fixup! review comments

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>

* fixup! review comments

As the list of status codes we retry on was based on an unverified
claim that Artifactory, Nexus and devpi answer a rejected `Accept`
header with `400`/`403`/`415`, we should only retry on `406`, which is
what RFC 9110 specifies for a request whose `Accept` cannot be
satisfied.

Our `Accept` header ends with `text/html; q=0.01`, so any conforming
registry can satisfy it, `415` refers to the request body's
`Content-Type` rather than `Accept`, and retrying on `403` doubles the
requests for a registry we're not authenticated against.

The unwrapping of `ExternalHostError` is unaffected, as that's needed
for the `abortOnError` case regardless of which status codes we retry.

Co-Authored-By: Claude Opus 5 <claude-code@jamietanna.co.uk>

* fixup! review comments

As the note about `upload-time` sat in the paragraph about the Simple
API, it read as if `minimumReleaseAge` needs a registry which supports
the JSON-based Simple API (PEP 691).

That's only true of the Simple API. The JSON API has always exposed
`upload_time`, and as the default registry of `https://pypi.org/pypi/`
doesn't end in `/simple/`, that's the lookup most users get, so
`minimumReleaseAge` already works for them.

We can split the two apart, so that the guarantee for each API is
stated separately.

Co-Authored-By: Claude Opus 5 <claude-code@jamietanna.co.uk>

* reword

* fixup! review comments

As the JSON-based Simple API's release timestamps were only covered by
hand-written responses, we didn't have the equivalent of the real world
coverage added for the JSON API in
e942788539.

We can add a `numpy` fixture from PyPI's JSON-based Simple API, trimmed
to 1.5.0 and 1.5.1, so we assert against a response a registry has
actually served. 1.5.1 is the interesting case, as it was released in
2010 but gained a wheel in 2014 which PyPI lists first.

This also covers the `upload-time` format the Simple API uses, of
`2010-11-18T14:16:58.801332Z`, rather than the JSON API's
`2010-11-18T14:16:58`, so that we know `asTimestamp` normalises both.

Unlike the JSON API, there's no previous behaviour to characterise
first, as before these changes the Simple API exposed no timestamps at
all.

Co-Authored-By: Claude Opus 5 <claude-code@jamietanna.co.uk>

* fixup! fixup! review comments

* fixups

* fixups

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>

* fixup! comments

Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>

---------

Co-authored-by: Andreas Hippler <andreas.hippler@goto.com>
Co-authored-by: Jamie Tanna <jamie.tanna@mend.io>
Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>
Co-authored-by: Claude Opus 5 <claude-code@jamietanna.co.uk>
44.33.0
2026-08-18 09:03:12 +00:00
Gregor Zeitlinger a53aaf4141 refactor(java-version): extract adoptium HTTP logic from datasource class (#42604)
* refactor(java-version): extract adoptium HTTP logic from datasource class

Move getPageReleases and the Adoptium fetch logic out of the
JavaVersionDatasource class into a standalone adoptium.ts module.
This makes the code easier to test in isolation and decouples
Adoptium-specific logic from the datasource class.

No behavior change — customRegistrySupport remains false, and the
hardcoded adoptiumRegistryUrl replaces the previously injected
defaultRegistryUrl (which was always the same value).

* fix(java-version): remove unused adoptiumRegistryUrl import from test

* test(java-version): use partial helper in spec

* refactor(java-version): extract adoptium HTTP logic from datasource class

* fix(java-version): pass Adoptium schema to HTTP client

* test(java-version): move Adoptium test to module spec

* chore(ci): retrigger failed checks
2026-08-18 08:13:54 +00:00
Sebastian Poxhofer 41da033756 refactor: remove escapeRegExp and replace with RegExp.escape (#45322) 2026-08-18 06:24:47 +00:00
renovate[bot] 2fb8ad4da9 fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.87.2 (main) (#45323)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.87.2

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.87.1 | 13.87.2 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.32.6
2026-08-18 03:29:12 +00:00
renovate[bot] 803f154a6b fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.87.1 (main) (#45320)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.87.1

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.87.0 | 13.87.1 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.32.5
2026-08-17 20:31:54 +00:00
renovate[bot] 01a6df8204 chore(deps): update dependency memfs to v4.68.1 (main) (#45318)
chore(deps): update dependency memfs to v4.68.1

| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | memfs   | 4.68.0 | 4.68.1 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.32.4
2026-08-17 19:15:56 +00:00
renovate[bot] 0294dce9e2 build(deps): update dependency jsonc-weaver to v0.3.1 (main) (#45317)
build(deps): update dependency jsonc-weaver to v0.3.1

| datasource | package      | from  | to    |
| ---------- | ------------ | ----- | ----- |
| npm        | jsonc-weaver | 0.3.0 | 0.3.1 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-17 19:15:54 +00:00
Jamie Tanna d8705054b0 fix(datasource/go): prefer later releaseTimestamp from GitHub Releases (#45315)
As noted in #45314, there are cases where we may see as similar case to
the GitHub Releases datasource in #43451, where a Go module's published
`Time` matches the time that the commit the Git tag points to was
committed, rather than the time that the release was created.

If we do have a GitHub repository, we can look up the GitHub Releases
(or we'll get the Git Tags, if no Releases are present) and use the date
if it's /newer/

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>
44.32.3
2026-08-17 19:01:23 +00:00
Aleksandr Mezin 5e8bf3c010 fix(github): recognize another "needs approving review" message (#45052)
* fix(github): recognize another "needs approving review" message

    "response": {
      "message": "Repository rule violations found\n\nNew changes require approval from someone other than the last pusher.\n\n",
      "documentation_url": "https://docs.github.com/rest/pulls/pulls#merge-a-pull-request",
      "status": "405"
    }

* Add tests

* Include message in test name
2026-08-17 13:47:53 +00:00
Jamie Tanna e942788539 fix(datasource/pypi): use the earliest upload_time of a version (#45313)
* test(datasource/pypi): cover which `upload_time` a version reports

As part of future changes to how we calculate the `releaseTimestamp`, it
was clear we don't have as much coverage of this logic.

To make this more explicit, we can add new test coverage.

Additionally, we can introduce a new example from a package to guide
this.

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>

* fix(datasource/pypi): use the earliest `upload_time` of a version

When calculating the `releaseTimestamp` for the PyPI datasource, we've
been looking at the first entry in the response, which isn't always
the first time this package existed.

In the case that a Wheel is uploaded after the package first was
released - for instance, to support a new version of Python, at an
existing pinned version of the package - this would lead to a
potentially incorrect calculation for the `releaseTimestamp`.

This can lead to Renovate seeing a package as newer than it is, which
can mean that i.e. `minimumReleaseAge` can show as pending for a package
that shouldn't be.

As part of upstream changes[0], this should be less frequent in the
ecosystem, but existing packages still exist with this behaviour.

To fix this, we can make sure that we filter a given Release's
to find the earliest `upload_time`.

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>

[0]: https://blog.pypi.org/posts/2026-07-22-releases-now-reject-new-files-after-14-days/

---------

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>
44.32.2
2026-08-17 11:01:26 +00:00
Jamie Tanna 5e93fc225d test(datasource/pypi): add regression test for constraintsFiltering=strict (#45312)
test(datasource/pypi): add regression

As per changes suggested by Claude Opus 5 in a commit in #44222, a
regression could be triggered with our handling of
`constraintsFiltering=strict`, breaking a key piece of functionality.

To prevent this, we can add a regression test for this functionality.

Co-authored-by: Claude Opus 5 <jamie.tanna+claude-code@mend.io>
2026-08-17 10:05:26 +00:00
Jamie Tanna 116c3d610c fix(datasource/npm): handle absent homepages (#45219)
* fix(datasource/npm): handle absent `homepage`s

As a follow-up to 89f526e0b1, this handles
it at the response from the npm registry.

Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>

* fixup! fix(datasource/npm): handle absent `homepage`s

* fixup! fix(datasource/npm): handle absent `homepage`s

---------

Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>
44.32.1
2026-08-17 09:34:29 +00:00
renovate[bot] a429936763 chore(deps): update dependency protobufjs@8.0.1 to v8.7.2 (main) (#45297)
chore(deps): update dependency protobufjs@8.0.1 to v8.7.2

| datasource | package    | from  | to    |
| ---------- | ---------- | ----- | ----- |
| npm        | protobufjs | 8.7.1 | 8.7.2 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-17 09:30:40 +00:00
Jamie Tanna 65be1c5cee test(git): disable Git's maintenance in test repositories (#45310)
We periodically see test flakiness in the `git` functionality, where
we're trying to clean up our temporary directories, and see i.e. [0]:

```
FAIL  lib/util/git/index.spec.ts > util/git/index > ...
Error: ENOTEMPTY: directory not empty, rmdir '/tmp/tmp-2701-SIDrNnhWZmc7/.git/objects'
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/4]⎯

 FAIL  lib/util/git/index.spec.ts > util/git/index > ...
Error: ENOTEMPTY: directory not empty, rmdir '/tmp/tmp-2701-8p6HvIMqwS4k/.git/info'
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/4]⎯

 FAIL  lib/util/git/index.spec.ts > util/git/index > ...
Error: ENOTEMPTY: directory not empty, rmdir '/tmp/tmp-2701-Q6gACVUhHYu1/.git/objects/pack'
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/4]⎯

 FAIL  lib/util/git/index.spec.ts > util/git/index > ...
Error: ENOTEMPTY: directory not empty, rmdir '/tmp/tmp-2701-5VelWdq8M1Iy/.git/objects/pack'
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/4]⎯
```

Investigating this with Claude Sonnet, it appears that this /could be/
down to Git's automated garbage collection processes.

The infrequency of the failures makes this less straightforward to
investigate the issue, but it seems like this may be the likely culprit.

We had enabled this on `base` and `origin` repos, but never the `local`
client which runs against `tmpDir`.

We can make sure that this is applied, and this should reduce the
flakiness.

Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>

[0]: https://github.com/renovatebot/renovate/actions/runs/32008122699/job/95322113612
2026-08-17 09:28:50 +00:00
Jamie Tanna a07a59812b chore(AGENTS.md): tune the PR template + PR raising etiquette (#45311)
As a way to hopefully reduce incorrectly raised PRs.

Co-authored-by: Claude Sonnet 5 <jamie.tanna+claude-code@mend.io>
2026-08-17 09:27:34 +00:00
renovate[bot] a1453aed50 feat(deps): update ghcr.io/renovatebot/base-image docker tag to v13.87.0 (main) (#45309)
feat(deps): update ghcr.io/renovatebot/base-image docker tag to v13.87.0

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.86.6 | 13.87.0 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.32.0
2026-08-17 08:43:22 +00:00
renovate[bot] d87e46e17d build(deps): update dependency jsonc-weaver to v0.3.0 (main) (#45308)
build(deps): update dependency jsonc-weaver to v0.3.0

| datasource | package      | from  | to    |
| ---------- | ------------ | ----- | ----- |
| npm        | jsonc-weaver | 0.2.4 | 0.3.0 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-17 08:42:50 +00:00
renovate[bot] dfde7f21ed build(deps): update dependency protobufjs to v8.7.2 (main) (#45296)
build(deps): update dependency protobufjs to v8.7.2

| datasource | package    | from  | to    |
| ---------- | ---------- | ----- | ----- |
| npm        | protobufjs | 8.7.1 | 8.7.2 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-17 08:21:29 +00:00
renovate[bot] d1360ed56a chore(deps): update dependency @containerbase/istanbul-reports-html to v2.0.16 (main) (#45305)
chore(deps): update dependency @containerbase/istanbul-reports-html to v2.0.16

| datasource | package                              | from   | to     |
| ---------- | ------------------------------------ | ------ | ------ |
| npm        | @containerbase/istanbul-reports-html | 2.0.15 | 2.0.16 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-17 08:21:20 +00:00
renovate[bot] 367ab09a05 chore(deps): update dependency pnpm to v11.21.0 (main) (#45306)
chore(deps): update dependency pnpm to v11.21.0

| datasource | package | from    | to      |
| ---------- | ------- | ------- | ------- |
| npm        | pnpm    | 11.20.0 | 11.21.0 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-17 08:21:13 +00:00
Jamie Tanna 183fc14673 docs: clarify GHSA publishing timelines and CVE IDs (#45307)
* docs: clarify GHSA publishing timelines and CVE IDs

Via #43729.

* fixup! docs: clarify GHSA publishing timelines and CVE IDs

With some suggestions from Copilot.

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-08-17 08:08:58 +00:00
github-actions[bot] abd9125174 feat(data): automatic update of static data (#45301)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
44.31.0
2026-08-16 21:24:45 +00:00
renovate[bot] 24830638be build(deps): update dependency @renovatebot/pgp to v1.3.17 (main) (#45302)
build(deps): update dependency @renovatebot/pgp to v1.3.17

| datasource | package          | from   | to     |
| ---------- | ---------------- | ------ | ------ |
| npm        | @renovatebot/pgp | 1.3.16 | 1.3.17 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.30.4
2026-08-16 05:27:38 +00:00
renovate[bot] c0b96b071d chore(deps): update dependency esbuild to v0.28.2 (main) (#45300)
chore(deps): update dependency esbuild to v0.28.2

| datasource | package | from   | to     |
| ---------- | ------- | ------ | ------ |
| npm        | esbuild | 0.28.1 | 0.28.2 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-15 20:28:04 +00:00
renovate[bot] bf865fe721 fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.6 (main) (#45293)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.6

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.86.5 | 13.86.6 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.30.3
2026-08-15 00:29:31 +00:00
renovate[bot] 1e108a071f fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.5 (main) (#45292)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.5

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.86.4 | 13.86.5 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.30.2
2026-08-14 21:27:44 +00:00
renovate[bot] e22af568ac chore(deps): update dependency uv to v0.12.5 (main) (#45289)
chore(deps): update dependency uv to v0.12.5

| datasource      | package      | from   | to     |
| --------------- | ------------ | ------ | ------ |
| github-releases | astral-sh/uv | 0.12.4 | 0.12.5 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-14 20:27:08 +00:00
renovate[bot] fb225aa09f chore(deps): update dependency astral-sh/uv to v0.12.5 (main) (#45288)
chore(deps): update dependency astral-sh/uv to v0.12.5

| datasource      | package      | from   | to     |
| --------------- | ------------ | ------ | ------ |
| github-releases | astral-sh/uv | 0.12.4 | 0.12.5 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-14 20:26:56 +00:00
Sebastian Poxhofer a1971afa78 fix(linters): add linting rule to enforce usage of our regEx utility (#44690)
* ci(linter): add renovate/require-regex-util rule

Adds a custom oxlint rule that flags raw RegExp usage in lib/
production code: any `new RegExp(...)` call and any regex literal
that is not the direct first argument of `regEx(...)`. The regEx()
helper from lib/util/regex.ts uses the RE2 engine for ReDoS-safe
matching and caches compiled patterns. lib/util/regex.ts itself is
exempt.

The rule is disabled for **/*.spec.ts, test/**, and tools/** via
config overrides, because vitest APIs such as expect.stringMatching
need bare RegExp instances (a past commit reverted regEx() there).

Severity is set to "warn" instead of "error": the repo currently has
197 pre-existing violations (above the agreed mechanical-fix
threshold of 80), and a number of them are deliberately
RE2-incompatible patterns (lookahead/lookbehind/named backreferences,
see TODO #12872/#12875 markers in e.g. lib/modules/versioning/rez/
pattern.ts and lib/modules/manager/dockerfile/extract.ts) that need
per-site judgment before they can be wrapped in regEx() or suppressed
with a justified disable comment. No violation fixes are included in
this commit.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* ci(linter): enforce renovate/require-regex-util at error

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: use regEx() for regex literals and RegExp construction in lib

Burn down all renovate/require-regex-util violations (197):

- wrap RE2-compatible regex literals and RegExp constructions in regEx()
- rewrite lookaround patterns where behavior is provably preserved:
  goproxy separator split, sbt-package link extraction, leiningen
  comment stripping and keyword search, npm GitHub owner validation
  (unit-count bound replaced by an explicit length check)
- keep native RegExp with disable comments where RE2 cannot be used:
  moo / good-enough-parser lexer patterns (moo rejects RE2 instances),
  MigrationsService propertyName (matched via isRegExp, which RE2
  instances fail), rez named backreferences and lookaheads, GitHub
  markdown link negative lookbehind, emoji astral-plane matching
- drop stale TODO #12875 comments for patterns current re2 handles

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: reduce require-regex-util disable comments

Rewrite the github massage-markdown-links URL regex to capture an
optional `api.` prefix in a named group (skipped in code) instead of
relying on a negative lookbehind, so both the base and global variants
can use regEx()/RE2 and their two disable comments are removed. Add
spec cases for api-prefixed URLs that match the URL shape.

Consolidate the four related line disables in rez/pattern.ts (bound and
range patterns emulating Python conditional patterns via named
backreferences and lookaheads, which RE2 cannot express) into a single
block disable/enable pair, matching the treatment of the lexer files.

Disable comment count drops from 13 to 8.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(datasource/sbt-package): use named capture group in link regex

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(manager/cake): restore original multiLineComment regex spelling

The [^] -> [\\s\\S] rewrite was only needed for an RE2 wrap that was
later reverted; keep the diff minimal.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(datasource/go): skip empty GOPROXY segments

The switch from a lookahead split to a capture-group split (needed because
RE2 has no lookahead support) changed how empty GOPROXY segments parse:
`a|,b` yielded `{ url: ',', fallback: '|' }` before and
`{ url: '', fallback: ',' }` after. The comma fallback only continues on
404/410, so a failing proxy ahead of an empty segment silently stopped the
lookup instead of falling through to the remaining proxies.

Empty segments carry no url to query, so drop them.

* refactor(datasource/go): use isTruthy for empty segment filter

* fix(datasource/go): filter empty segments before mapping

Filtering after the map broke the contextual typing from the
GoproxyItem[] annotation, widening fallback to string.

* refactor(platform/github): use regEx() for merge queue query stripping

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
44.30.1
2026-08-14 14:30:46 +00:00
Arnaud Dezandee 6a782d3a18 feat(terraform-provider): use OpenTofu packages API for lockfile hashes (#43573)
* feat(terraform-provider): use OpenTofu packages API for lockfile hashes

* refactor(terraform-provider): reuse OpenTofu registry constant

* refactor(terraform-provider): test file structure consistency

* refactor(terraform-provider): simplify hashes with flatMap

Co-authored-by: Michael Kriese <michael.kriese@gmx.de>

* fix(terraform-provider): handle OpenTofu API URL for lockfile hashes

* perf(terraform-provider): skip /versions request for OpenTofu lockfile hashes

* refactor(terraform-provider): improve function return flow

Co-authored-by: RahulGautamSingh <rahultesnik@gmail.com>

* docs(terraform-provider): clarify OpenTofu packages endpoint behavior

* test(terraform-provider): add message to toThrow assertion

* fix(terraform-provider): wrap OpenTofu packages errors in ExternalHostError

* test(terraform-provider): cover OpenTofu package errors

* refactor(terraform-provider): use async/await for provider packages

* refactor(terraform-provider): use LooseRecord for schema packages prop

Co-authored-by: Sergei Zharinov <zharinov@users.noreply.github.com>

* fix(terraform-provider): import LooseRecord in schema

---------

Co-authored-by: Michael Kriese <michael.kriese@gmx.de>
Co-authored-by: RahulGautamSingh <rahultesnik@gmail.com>
Co-authored-by: Sergei Zharinov <zharinov@users.noreply.github.com>
44.30.0
2026-08-14 09:51:00 +00:00
Tizian Adam fc9e453170 feat(presets): add jsonforms monorepo (#45280)
* add jsonforms to repoGroups to enable grouped update

* fix missing comma
2026-08-14 09:48:43 +00:00
Michael Kriese c953fafcdc fix(platform/github): abort branch update when PR is in merge queue (#45252)
* fix(platform/github): skip PR update when PR is in merge queue

Updating a PR that is queued for merging can remove it from the merge
queue. Check the PR's merge queue status via GraphQL before updating
and skip the update if it is queued. The check is skipped on GHES
<3.12.0 and fails open on errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(platform/github): dequeue PR from merge queue instead of skipping update

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(platform/github): note re-queue behavior after dequeue

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(platform/github): dequeue merge queue PR in commitAndPush

Dequeue on push instead of on PR metadata update, since pushing to the
branch is what invalidates the queued merge result.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor(platform/github): extract dequeuePr to pr.ts

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(platform/github): abort branch update when PR is in merge queue

Instead of dequeueing the PR, throw PR_ALREADY_IN_MERGE_QUEUE from
commitAndPush and handle it gracefully in processBranch.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(platform/github): check merge queue enablement per base branch

Cache merge queue enablement per base branch like branchForceRebase and
skip the per-PR merge queue check when the base branch has no merge
queue. Errors are treated as enabled.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(platform/github): fetch default branch merge queue status in initRepo

Include mergeQueue in repoInfoQuery so no extra query is needed for the
default branch, stripping it on GHES <3.12.0 like other unsupported
fields.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
44.29.5
2026-08-14 07:05:12 +00:00
renovate[bot] 7e82bd7e13 chore(deps): update dependency astral-sh/uv to v0.12.4 (main) (#45275)
chore(deps): update dependency astral-sh/uv to v0.12.4

| datasource      | package      | from   | to     |
| --------------- | ------------ | ------ | ------ |
| github-releases | astral-sh/uv | 0.12.3 | 0.12.4 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-14 06:12:12 +00:00
Jamie Tanna eba4b3eed4 ci: auto-label PRs that have been dequeued from the Merge Queue (#45270)
As a way to get better visibility for - predominantly - transient issues
GitHub are having, via [0] we can auto-label PRs, so they can then be
picked up by a maintainer.

We can use the `-slim` runners, as this doesn't need much compute, and
it reduces ours and GitHub's costs.

[0]: https://www.jvt.me/posts/2026/08/11/github-merge-queue-prs/

Co-authored-by: Sonnet 5 <claude-code@jamietanna.co.uk>
2026-08-14 05:05:42 +00:00
renovate[bot] 72266403b6 fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.4 (main) (#45277)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.4

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.86.3 | 13.86.4 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.29.4
2026-08-13 22:28:47 +00:00
renovate[bot] 4b81aa83f6 chore(deps): update dependency uv to v0.12.4 (main) (#45276)
chore(deps): update dependency uv to v0.12.4

| datasource      | package      | from   | to     |
| --------------- | ------------ | ------ | ------ |
| github-releases | astral-sh/uv | 0.12.3 | 0.12.4 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.29.3
2026-08-13 21:28:44 +00:00
renovate[bot] 00daaeedd7 fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.3 (main) (#45274)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.3

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.86.2 | 13.86.3 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-13 19:31:46 +00:00
renovate[bot] 184f31d8fb fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.2 (main) (#45271)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.2

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.86.1 | 13.86.2 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.29.2
2026-08-13 17:32:46 +00:00
renovate[bot] 14604aee77 fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.1 (main) (#45255)
fix(deps): update ghcr.io/renovatebot/base-image docker tag to v13.86.1

| datasource | package                        | from    | to      |
| ---------- | ------------------------------ | ------- | ------- |
| docker     | ghcr.io/renovatebot/base-image | 13.86.0 | 13.86.1 |

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
44.29.1
2026-08-13 16:09:51 +00:00
Sebastian Poxhofer c2785bc5a4 refactor(oxlint): scope custom JS rules via config overrides (#45266)
Move the file-path filtering of the custom lint rules out of the rule
implementations and into .oxlintrc.json overrides. Previously every JS
plugin rule was enabled globally and returned early for non-matching
files, which still paid the oxlint->Node plugin bridge cost for every
linted file. With config scoping the rules are not invoked at all
outside their target paths.
2026-08-13 15:38:08 +00:00
Sebastian Poxhofer 16ef1715e9 refactor(linters): add rules for @sindresorhus/is helpers (#45229)
* feat(lint): add renovate/prefer-is-helpers and renovate/prefer-is-object rules

Flag ad-hoc type checks that have @sindresorhus/is equivalents:
- .filter(Boolean) -> .filter(isTruthy)
- typeof x === 'string' -> isString(x)
- x === null || x === undefined -> isNullOrUndefined(x) (and negation)

The typeof x === 'object' shape lives in a separate suggestion-only rule
(renovate/prefer-is-object, kept at warn) because isObject()/isPlainObject()
are not drop-in equivalents: null, arrays and functions behave differently.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: fix renovate/prefer-is-helpers violations

Replace ad-hoc type checks with @sindresorhus/is helpers across lib/:
- 13x .filter(Boolean) -> .filter(isTruthy)
- 36x typeof x ==/!== 'string' -> isString(x) / !isString(x)
- 6x x === null || x === undefined -> isNullOrUndefined(x) (and negation)

Promote renovate/prefer-is-helpers to error now that the codebase is clean.
renovate/prefer-is-object stays at warn: its 15 remaining sites guard
parsed YAML/JSON or unknown values where isObject()/isPlainObject() are
not provably equivalent (null/array/function semantics).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: enforce renovate/prefer-is-object at error level

Resolve the 15 remaining warnings and raise the rule from warn to error:

- Migrate 10 sites to isObject() where the guarded value provably cannot
  be a function (parsed YAML/JSON, typed exec command arguments, or
  test-controlled fixtures): helm-values, woodpecker, bun, pre-commit
  managers, exec utils, file package cache, and the github http spec.
  In the bun manager this also fixes a latent crash where a null
  `workspaces` value would throw on the `in` operator.
- Keep 5 sites as reasoned oxlint-disable comments where excluding
  functions is load-bearing: the byte-exact fingerprint canonicalizer
  (2), the circularity walker, the zod result guard, and the generic
  hasKey helper.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-08-13 14:22:03 +00:00