Commit Graph

60 Commits

Author SHA1 Message Date
Marius b22f58045e fix(manager): Handle variables with default values in registry aliases (#36293)
* fix(manager): handle registryAliases with shell variable defaults

Allows `registryAliases` keys to contain shell-style variables with
empty (or other) defaults, e.g. `${DEPENDENCY_PROXY:-}` or
`${CI_REGISTRY:-}`. The same image string is then resolved both
online (variable expanded) and offline (variable empty).

Changes in `dockerfile/extract.ts` (used by `gitlabci` too):
* Match the alias key as either `${name}/...` (existing) or `${name}...`
  when `name` already ends in a non-identifier boundary character such
  as `}`. Bare-identifier keys like `$CI_REGISTRY` continue to require
  the slash boundary so they no longer overmatch keys that begin with
  the same prefix (e.g. `$CI_REGISTRY` vs `$CI_REGISTRY_IMAGE`).
* Use `ensureTrailingSlash` to handle alias values that already include
  a trailing slash.
* Preserve the original `name` and path structure in `dep.depName`
  instead of substringing only after the alias `value`. This keeps the
  variable in the depName so it survives a `splitImageParts` round-trip
  and the resulting branch name comes out clean.

Adds `sanitizeDepName` regex passes in
`lib/workers/repository/updates/flatten.ts` so any leftover
`${VAR}`/`${VAR:-...}` placeholder is stripped from the depName before
it becomes a branch name (otherwise we'd get
`renovate/${dependency_proxy}python-3.x` instead of
`renovate/python-3.x`).

Tests cover:
* `${VAR:-}/image` (with slash) and `${VAR:-}image` (no slash, requires
  the boundary form).
* Overlapping prefixes: `$CI_REGISTRY` vs `$CI_REGISTRY_IMAGE`.
* Registry alias with port (`localhost:5000/repo`).
* `sanitizeDepName` strips `${VAR}` / `${VAR:-}` / bare `$VAR`.

Reproducer: https://github.com/Wayneoween/renovate-36293-repro

* revert(manager/gitlabci): keep regex group name as 'prefix'

Reverting the unrelated `prefix` -> `rawPrefix` rename in `depProxyRe`.
Per review on #36293, this rename is out of scope for the registry-alias
fix and just adds review surface.

* refactor(manager/dockerfile): narrow alias boundary check to '}'

Per review on #36293. The previous regex `/[^A-Za-z0-9_]$/` matched any
non-word ending, which is broader than the documented case (alias keys
ending in `}` from `${VAR}` / `${VAR:-...}`). Replace with a plain
`name.endsWith('}')` check, which also avoids re-building a regex on
every iteration of the alias loop.

Existing tests (`'variables with default and slash'`,
`'variables with default no slash'`, `'alias with digest only'`)
continue to exercise the `}`-boundary path; the `'overlapping prefixes'`
case continues to exercise the slash-only path.

* chore(manager/dockerfile): trim comment and TODO library/ strip edge

Per review on #36293:
* Drop the verbose explanation block above the depName-restore branch;
  the spec rows already document the expected shape.
* Add a TODO above the `dep.depName?.startsWith(valueWithSlash)` guard
  noting a pre-existing edge case: when the inner `getDep` strips a
  `library/` prefix (or similar) the depName no longer starts with
  `valueWithSlash`, so the alias-rooted depName is not restored. Out of
  scope for this PR.

* fix(manager/dockerfile): handle empty registry alias value

- strip trailing slash after ${VAR} placeholders in sanitizeDepName
- treat an empty registry alias value as Docker Hub instead of '/'
- clarify registry alias docs wording

* refactor(manager/dockerfile): drop redundant alias boundary guard

- `matchedAtBoundary` is only read behind `!matchedWithSlash`
- add docker-compose test for `${VAR:-}` registry aliases

* test(manager/dockerfile): pin special-prefix registry alias behavior

`getDep` strips `library/`, `amd64/` and `arm64/` as special prefixes, so
an alias whose value is one of those loses its alias-rooted `depName`.
Both the slash form and the variable form behave this way on `main`.
2026-09-03 12:43:47 +00:00
Sebastian Poxhofer 97327c3d28 refactor(linters): add prefer-coerce-array rule (#45492)
* refactor(linters): add prefer-coerce-array rule

Refs #45217

`x ?? []` and `coerceArray(x)` say the same thing, but only the second
one is searchable and consistent. The rule flags a `??` whose default is
a bare `[]` literal; a non-empty default or an asserted `([] as Foo[])`
still passes.

Applying it across `lib/` surfaced three spots the helper cannot cover,
which keep `?? []` with a disable comment or a narrower fix:

- `package-files.ts` destructures a tuple, which `coerceArray()` widens
- `generate.spec.ts` defaults `matchAll()`, an iterator rather than an array
- `mise/upgradeable-tooling.ts` declares a `Record` return, so its
  `?? []` fallback was wrong to begin with and becomes `coerceObject()`

* refactor(platform/github): hoist the GHE version header lookup

`Object.entries(...).find()` returns a tuple, and defaulting it with
`?? []` only to destructure the second element reads as an array
default when it is not one. Name the found entry instead, which drops
the `?? []` rather than routing a tuple through `coerceArray()`.
2026-08-28 09:27:58 +00:00
Sebastian Poxhofer 58771bb183 refactor(linters): enabled oxlints func-style (#44691)
* refactor(oxlint): enable func-style

Enable the built-in func-style rule as ["warn", "declaration"] so that
named functions are written as function declarations instead of arrow or
function expressions assigned to variables, matching the convention in
docs/development/best-practices.md (Functions section). Inline arrow
callbacks are unaffected; prefer-arrow-callback continues to cover the
callback direction.

Severity is "warn" instead of "error" as a fallback: a repo-wide run
found 196 pre-existing violations (70 in spec files, 126 in production
code), exceeding the 80-violation fix threshold for this change, so no
violations were fixed here. Follow-up work can convert the offenders
(largest clusters: lib/modules/versioning/ruby, lib/util/cache/package,
lib/modules/versioning/maven, lib/modules/versioning/gradle) and then
raise the rule to "error". Note oxlint 1.72 also supports an
allowTypeAnnotation option if typed consts should remain arrows.

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

* ci(linter): enforce func-style at error

* refactor(func-style): convert const-arrow functions to declarations in with-cache spec and ruby versioning

* refactor(func-style): convert const-arrow functions to declarations in maven/gradle modules

* refactor(func-style): convert const-arrow functions to declarations in remaining versioning modules

* refactor(func-style): convert const-arrow functions to declarations in platform modules

Discriminated-union closures (ensureCommentRemoval byTopic/byContent
helpers in github, gitlab, bitbucket, bitbucket-server) needed the
narrowed field passed explicitly as a parameter, since function
declarations are hoisted and lose the outer if-narrowing that inline
arrow-function closures previously relied on.

* refactor(func-style): convert const-arrow functions to declarations across util/manager/datasource modules

One case (logger/renovate-logger.ts logOnceFn) is kept as an arrow
function with a documented oxlint-disable: it is stored on
this.logger.once[level] and relies on lexically-bound this, which a
hoisted function declaration would not preserve.

* refactor(func-style): convert remaining const-arrow test helpers to declarations

get-updated.spec.ts: hoisted expectPipCompilePackageAndLockFile to
module scope (it only closes over the module-level pipCompile mock)
and added a documented oxlint-disable for vitest/expect-expect on its
caller test, since oxlint's expect-expect check does not trace
assertions through an externally-defined helper function.

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 11:14:22 +00:00
Sebastian Poxhofer 64e6a4c71f refactor(oxlint): enable unicorn/prefer-at (#44556)
Enable the unicorn/prefer-at rule as error in .oxlintrc.json and fix all
43 pre-existing violations (arr[arr.length - 1] -> arr.at(-1)) via oxlint
autofix. Where .at() widened the type to T | undefined, non-null
assertions were added at sites where surrounding logic guarantees the
element exists (length guards, split results), preserving the original
runtime behavior and typing.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 12:57:23 +00:00
Felipe Santos 3032c960b3 fix: avoid proposing replacements when the new dependency already exists (#40149)
* fix(npm): remove old dependency when replacement exists

* Add coverage ignore comments

* Simplify implementation

* Rename to removeAsString

* Move it after replaceAsString

* Improve test case

* Improve error message of replaceAsString

* Fix coverage

* Fix coverage again

* Only remove dependency at depType like replaceAsString

* Refactor tests

* Fix tsc

* fix(npm): skip update when replacement dependency already exists

* Simplify else

* Avoid returning an error

* fix(flatten): skip replacement updates when a sibling dependency already exists

* Revert the other changes

* Also handle it in the Dependency Dashboard

* Filter out earlier

* Try some other way

* Try fix dep dashboard

* Try fix again

* Extract helper

* Improve some stuff

* Improve assertion

* Remove misleading comment

* Address review comments
2026-07-13 18:13:53 +00:00
Jamie Tanna f8b4477335 fix(workers/repository): don't include skipReason'd dependencies in flattened updates (#42595)
When we're preparing the final, flattened, list of branches to prepare
updates for, we're not filtering out any dependencies that have a
`skipReason` in them.

In the case that, as part of future changes like #42510, a `skipReason`
may be added after the `lookup` phase, we can still get PRs raised even
when they shouldn't be.

We already filter out `enabled=false`, so we should make sure to also
filter anything with a `skipReason`.
2026-04-13 17:15:48 +00:00
Jamie Tanna 0b74302d3a fix: correctly warn when an attestation is missing (#42311)
* test: add additional case for attestation changes

* fix: correctly warn when an attestation is missing

As noted in #37258, when a package registry had previously seen an
attestation for authenticity of a given package release, Renovate should
warn if future updates then lose authenticity.

Our previous attempt at this didn't quite pass around the current
package's attestation, which results in no warnings.

Given recent supply chain attacks where an attestation was removed (such
as Axios in MSC-2026-3522), we should make sure that this logic does
work correctly, and flags to our users.

In the future, we'll add more checks and a failing status check.

By introducing `hasAttestation` in the `LookupUpdate`, this can now be
matched on with `matchJsonata`, as well as providing visibility in the
`packageFiles with updates` log line.

* fixup! fix: correctly warn when an attestation is missing

> Run `pnpm run jest
> lib/workers/repository/process/lookup/index.spec.ts` and handle any test
> failures - the implementation is correct, so update the tests

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

* test: clarify that we don't check for intermediate releases

Which we'll look to improve as part of future changes.

* chore: fix typo

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

---------

Co-authored-by: Claude Sonnet 4.6 <jamie.tanna+claude-code@mend.io>
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2026-04-01 15:00:08 +00:00
Sergei Zharinov 930cf6633c refactor: Rewrite imports with .ts extensions (#40700)
fix: Additional vi.mock path corrections and prettier formatting
2026-01-26 22:48:17 +00:00
renovate[bot] acacad57c6 chore(deps): update linters (main) (#40277)
* chore(deps): update linters

| datasource | package              | from   | to     |
| ---------- | -------------------- | ------ | ------ |
| npm        | eslint-plugin-oxlint | 1.36.0 | 1.38.0 |
| npm        | typescript-eslint    | 8.50.1 | 8.52.0 |

* chore: enable oxlint gha format

* chore: fix lint

* chore: fix lint

* chore: fix lint

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2026-01-14 15:32:48 +00:00
Michael Kriese c641239c19 fix: use stricter types for renovate config (#39594)
* fix: use stricter types for renovate config

* fix: revert changes

* Apply suggestions from code review
2025-11-28 13:16:27 +00:00
Rhys Arkins 17d35fd517 fix: log disabled updates count (#35024) 2025-03-27 11:23:31 +00:00
renovate[bot] 94c073ab6b chore(deps): update linters (main) (#34869)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: secustor <sebastian@poxhofer.at>
2025-03-23 17:57:04 +00:00
Michael Kriese b5ff90f2bd fix: improve coverage (#34667) 2025-03-06 17:05:19 +00:00
Rhys Arkins 3e7460238d fix: remove colons from depNameSanitized (#33672) 2025-01-17 21:23:31 +00:00
Adam Setch 74c87b41e9 feat: convert sourceDirectory to a template eligible config (#32701)
Signed-off-by: Adam Setch <adam.setch@outlook.com>
2024-11-26 05:43:20 +00:00
Rhys Arkins b6cff319d5 refactor(packageRules): allow async matchers (#31828) 2024-10-07 14:04:06 +00:00
Rhys Arkins b6b85eb69e feat(package-rules): set skipStage (#30264) 2024-07-21 10:29:13 +00:00
Sergei Zharinov b69416ce17 refactor(prettier): Force trailing commas (#25631) 2023-11-07 15:50:29 +00:00
Rhys Arkins 2f8aa56fd8 refactor(autoreplace): set depIndex during flatten (#20665) 2023-02-28 10:16:33 +00:00
Rhys Arkins 5ab1cefe2c fix(cache): set semanticCommits in each upgrade 2022-12-17 16:51:59 +01:00
Michael Kriese 8270d5512d refactor: fix lint issues (#16779)
* refactor: fix lint issues

* Update lib/renovate.ts

* chore: revert toplevel await for ts
2022-07-26 08:32:12 +00:00
Sergei Zharinov 0cf4f48842 refactor: Strict null checks for all files except tests (#16071)
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2022-06-20 11:47:07 +02:00
Rhys Arkins dca3418bbd refactor: lib/modules (#14488)
Moves datasource, manager, platform and versioning code from lib/ into new lib/modules/

BREAKING CHANGE: External tools must update paths to datasource, manager, platform and versioning
2022-03-04 09:04:02 +01:00
Florian Greinacher a989c78800 fix: do not interpret value as version during flattening (#14320) 2022-02-24 09:41:47 +00:00
Malte Swart 67524192a1 fix: populate isLockFileMaintenance (#14005)
Lock file maintenance was broken as various managers rely on the
`isLockFileMaintenance` update flag to be set. This was not the
case as its config is generated afterwards (without the is*
auto-propagation).
2022-02-05 07:35:46 +01:00
elmaso1620 49f5ac0b9b feat: expose sourceRepo, sourceRepoOrg and sourceRepoName (#13620)
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
Co-authored-by: Rhys Arkins <rhys@arkins.net>
2022-01-21 12:03:06 +00:00
RahulGautamSingh 4f65b57225 refactor: refactor static regex out of for loops (#13065) 2021-12-29 07:26:13 +01:00
Jamie Magee 98e7029090 feat: replace deprecated dependencies with their replacements (#5558)
Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2021-11-12 08:10:52 +00:00
RahulGautamSingh 91f067b39f fix: refactor regex to use re2 part3 (#12283)
Co-authored-by: Rhys Arkins <rhys@arkins.net>
2021-10-27 14:37:11 +00:00
Rhys Arkins 9aaadd1f4a feat: sourceRepoSlug (#9916) 2021-05-08 15:57:14 +02:00
Rhys Arkins 13bbc5d6a2 feat(config): remove manager additionalBranchPrefix defaults (#9373)
Resets any language or manager` additionalBranchPrefix` values to empty string. Add the `compatibility:additionalBranchPrefix` prefix to restore previous behavior.

BREAKING CHANGE: Removal of default `additionalBranchPrefix` values will cause branch names to change for docker/helm/buildkite/cargo/homebrew.
2021-04-22 08:47:58 +02:00
Sergei Zharinov b957d4afb7 refactor(config): Extract interfaces from "index.ts" to separate "types.ts" (#9629) 2021-04-20 10:52:57 +02:00
Rhys Arkins edfac73a08 refactor: remove depNameShort (#9114) 2021-03-13 14:28:46 +01:00
Rhys Arkins d1152e177b fix: delete vulnerabilityAlerts after merging 2021-03-13 10:08:26 +01:00
Rhys Arkins c8fc8ec736 fix: set enabled=true for remedations 2021-03-08 13:55:59 +01:00
Rhys Arkins d3808fbc3b refactor: log branchName for each update 2021-03-07 22:11:19 +01:00
Michael Kriese 74d7691bef refactor: optimize type usage (#8947) 2021-03-02 21:44:55 +01:00
Rhys Arkins 98d55394e6 feat: transitiveRemediation (#8883)
* save remediations

* enhance and export NpmResponse

* sort branch lists

* transitive remediation init

* update-lockfile not bump

* version not value

* remediate package.json

* isVulnerabilityAlert

* simplify config

* fix circular

* update snapshots

* add config and docs

* TODO

* flatten tests

* remediation -> update

* lots of renames

* improve readability

* refactor

* remove fetch

* more tests

* reduce fiixtures sizes

* more tests

* fix parent null

* remove exec

* explicit false

* fix

* Apply suggestions from code review

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

* use type-fest PackageJson

* more tests

* coverage

* Update lib/workers/branch/get-updated.ts

Co-authored-by: Michael Kriese <michael.kriese@visualon.de>
2021-03-01 07:59:57 +00:00
Rhys Arkins 2be25c4ae6 refactor: applyUpdateConfig 2021-02-22 12:48:00 +01:00
Michael Kriese 9a1c4fabb7 feat(gomod): do not shorten depName (#8758) 2021-02-18 16:27:47 +01:00
Rhys Arkins 32440f26a4 refactor: toVersion -> newVersion (#8711) 2021-02-16 12:33:44 +01:00
Rhys Arkins 0869d6e8d7 refactor: remove newVersion usage (#8710) 2021-02-16 11:26:46 +01:00
Rhys Arkins acf57144f8 refactor: remove currentVersion (#8708) 2021-02-16 09:43:38 +01:00
Rhys Arkins 855db036d5 fix: rename baseDir to packageFileDir for templating (#8625) 2021-02-10 23:39:06 +00:00
Rhys Arkins 3ff35656b3 refactor: add depNameShort during flatten (#8401) 2021-01-24 08:34:33 +01:00
Rhys Arkins e0a1064a37 fix: remove consecutive hyphens from depNameSanitized (#8400) 2021-01-24 07:22:28 +00:00
Rhys Arkins 4202be9ef0 fix: don’t prioritize updateTypes packageRules (#7897)
Removes code which ensured rules with updateTypes always ran last and therefore had higher priority.

Closes #4482

BREAKING CHANGE: Package Rules will be evaluated in the order they are configured, instead of evaluating rules with updateTypes last.
2020-12-11 10:10:12 +01:00
Rhys Arkins 7651d2e420 feat: additionalBranchPrefix 2020-09-01 14:36:10 +02:00
Rhys Arkins 0ce9837b9d fix: Revert "feat: additionalBranchPrefix"
This reverts commit 9385fb557b.
2020-08-31 09:33:34 +02:00
Rhys Arkins 9385fb557b feat: additionalBranchPrefix
Renamed from managerBranchPrefix
2020-08-31 07:47:24 +02:00