diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index dcf83c5037b3a0..c8ffecbdfd78b5 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -1 +1,5 @@
-FROM ghcr.io/containerbase/devcontainer:13.7.2
+FROM ghcr.io/containerbase/devcontainer:13.7.5
+
+# https://github.com/pnpm/pnpm/issues/8971
+# renovate: datasource=npm
+RUN install-tool pnpm 9.15.4
diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh
index eae5da872d27d6..f368a583156f47 100755
--- a/.devcontainer/post-create.sh
+++ b/.devcontainer/post-create.sh
@@ -7,4 +7,4 @@ if [[ "${CODESPACES}" == true ]]; then
sudo chmod 1777 /tmp
fi
-COREPACK_ENABLE_DOWNLOAD_PROMPT=0 pnpm install
+pnpm install --reporter append-only --aggregate-output
diff --git a/.github/label-actions.yml b/.github/label-actions.yml
index d19aae3bbf4636..21115a3b3f0635 100644
--- a/.github/label-actions.yml
+++ b/.github/label-actions.yml
@@ -100,16 +100,6 @@
- ### Insufficient logs
-
- Select me to read instructions
-
-
- If you already gave us a log, and the Renovate team said it's not enough, then follow the instructions from the **No logs at all** section.
-
-
-
-
### Formatting your logs
Select me to read instructions
@@ -137,12 +127,31 @@
The Renovate team
+'auto:logs-insufficient':
+ comment: >
+ Hi there,
+
+
+ The logs you provided are insufficient to help you.
+
+
+ Please provide more logs, or more detailed logs, so we can help you. Be sure to include _DEBUG_ logs, and don't excessively redact or truncate them.
+
+
+ If you feel the logs are too large to paste here, please use a service like [GitHub Gist](https://gist.github.com/) and paste the link here.
+
+
+ Read the [Renovate docs, Troubleshooting](https://docs.renovatebot.com/troubleshooting/) to learn more about getting the correct logs.
+
+
+ Thanks, the Renovate team
+
'auto:logs-packages':
comment: >
Hi there,
- A maintainer wants you to find and share a specific log message (`packageFiles with updates`) from your repository or environment.
+ Please locate the debug message `packageFiles with updates` in your logs and paste the contents here. Depending on your question, we may need the full list of packages or only one.
If you self-host Renovate: make sure you run Renovate with `LOG_LEVEL=debug` to get the debug log messages! Next, open the debug-level logs and search for `packageFiles with updates`. This text marks the start of a structured log message that shows every package file, dependency, and update that Renovate found.
@@ -531,3 +540,25 @@
Thanks, the Renovate team
+
+'auto:inactive-pr':
+ comment: >
+ Hi there,
+
+
+ This PR appears to have been inactive for a while. Please let us know if you are still working on it, or if we can close it for now.
+
+
+ Thanks, the Renovate team
+
+'auto:close-inactive-pr':
+ comment: >
+ Hi there,
+
+
+ We're closing this PR due to inactivity, but we are happy for you, or others, to finish the PR if time allows.
+
+
+ Thanks, the Renovate team
+
+ close: true
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 13ee0ce1e9472e..61bf9af519c178 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -690,7 +690,7 @@ jobs:
show-progress: false
- name: docker-config
- uses: containerbase/internal-tools@1d0c5b3aabe4a10a264d309f65ecbbd83d0e672e # v3.5.21
+ uses: containerbase/internal-tools@bbbf98bb61968071a4052c89fccd25a292d69c73 # v3.5.22
with:
command: docker-config
diff --git a/docs/development/local-development.md b/docs/development/local-development.md
index 43e0b0ae7f513d..5bdfdef3dcc18f 100644
--- a/docs/development/local-development.md
+++ b/docs/development/local-development.md
@@ -12,7 +12,7 @@ You need the following dependencies for local development:
- Git `>=2.45.1`
- Node.js `^20.15.1`
-- pnpm `^9.0.0` (use corepack)
+- pnpm `^9.0.0`
- C++ compiler
We recommend you use the version of Node.js defined in the repository's `.nvmrc` or use [Volta](https://volta.sh/) to manage your tool versions.
@@ -26,12 +26,12 @@ You can use the following commands on Ubuntu.
curl -sL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt-get update
sudo apt-get install -y git build-essential nodejs
-corepack enable
+npm install -g pnpm@latest-10
```
#### Nix
-To enter a development shell with the necessary packages, run `nix-shell --packages gcc gitFull nodejs` and then `corepack enable`.
+To enter a development shell with the necessary packages, run `nix-shell --packages gcc gitFull nodejs` and then `npm install -global pnpm@latest-10`.
#### Windows
@@ -41,7 +41,7 @@ If you already installed a part, skip the corresponding step.
- Install [Git](https://git-scm.com/downloads). Make sure you've [configured your username and email](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup)
- Install [Node.js LTS](https://nodejs.org/en/download/)
- In an Administrator PowerShell prompt, run `npm install -global npm` and then `npm --debug install --global windows-build-tools`
-- Enable corepack with: `corepack enable`
+- Install pnpm with: `npm install -global pnpm@latest-10`
You can see what versions you're using like this:
diff --git a/docs/usage/configuration-options.md b/docs/usage/configuration-options.md
index 02f3d42056f266..042dc89b930e53 100644
--- a/docs/usage/configuration-options.md
+++ b/docs/usage/configuration-options.md
@@ -724,7 +724,7 @@ The `matchStrings` must capture/extract the following three fields:
- `depName` and / or `packageName`
- `currentValue`
-Alteratively, you could also use corresponding templates (e.g. `depNameTemplate`) for these fields.
+Alternatively, you could also use corresponding templates (e.g. `depNameTemplate`) for these fields.
But, we recommend you use only _one_ of these methods, or you'll get confused.
Also, we recommend you explicitly set which `versioning` Renovate should use.
@@ -849,7 +849,8 @@ It will be compiled using Handlebars and the regex `groups` result.
It specifies the syntax of the package file that's managed by the custom `jsonata` manager.
This setting helps the system correctly parse and interpret the configuration file's contents.
-Only the `json` format is supported.
+Only the `json` and `yaml` formats are supported.
+`yaml` files are parsed as multi document YAML files.
```json title="Parsing a JSON file with a custom manager"
{
@@ -866,6 +867,21 @@ Only the `json` format is supported.
}
```
+```json title="Parsing a YAML file with a custom manager"
+{
+ "customManagers": [
+ {
+ "customType": "jsonata",
+ "fileFormat": "yaml",
+ "fileMatch": ["file.yml"],
+ "matchStrings": [
+ "packages.{ \"depName\": package, \"currentValue\": version }"
+ ]
+ }
+ ]
+}
+```
+
### matchStrings
Each `matchStrings` must be one of the following:
@@ -2471,7 +2487,7 @@ When in `silent` mode Renovate will:
- _not_ create or update any Issue: even the Dependency Dashboard or Config Warning Issues will stay as-is
- _not_ prune or close any existing Issues
-- _not_ create any Config Migration PRs, even if you explictly enabled Config Migration PRs in your Renovate config
+- _not_ create any Config Migration PRs, even if you explicitly enabled Config Migration PRs in your Renovate config
## npmToken
diff --git a/docs/usage/docker.md b/docs/usage/docker.md
index d43678fde413c5..6a9a9f2b973be7 100644
--- a/docs/usage/docker.md
+++ b/docs/usage/docker.md
@@ -300,7 +300,7 @@ Renovate will get the credentials with the [`google-auth-library`](https://www.n
```yaml title="Example for Workload Identity plus Renovate host rules"
- name: authenticate to google cloud
id: auth
- uses: google-github-actions/auth@v2.1.7
+ uses: google-github-actions/auth@v2.1.8
with:
token_format: 'access_token'
workload_identity_provider: ${{ env.WORKLOAD_IDENTITY_PROVIDER }}
@@ -478,7 +478,7 @@ Make sure to install the Google Cloud SDK into the custom image, as you need the
For example:
```Dockerfile
-FROM renovate/renovate:39.134.0
+FROM renovate/renovate:39.156.2
# Include the "Docker tip" which you can find here https://cloud.google.com/sdk/docs/install
# under "Installation" for "Debian/Ubuntu"
RUN ...
@@ -501,7 +501,7 @@ hostRules: [
One way to give Renovate the short-lived Google Access Token is to:
1. Write a script that generates a `config.js` file, with the token, in your `gitlab-ci.yml` file
-1. Run the `config.js` creation scrip just before you start Renovate
+1. Run the `config.js` creation script just before you start Renovate
For example:
diff --git a/docs/usage/examples/self-hosting.md b/docs/usage/examples/self-hosting.md
index a333b13848e609..95360482f062d7 100644
--- a/docs/usage/examples/self-hosting.md
+++ b/docs/usage/examples/self-hosting.md
@@ -25,8 +25,8 @@ It builds `latest` based on the `main` branch and all SemVer tags are published
```sh title="Example of valid tags"
docker run --rm renovate/renovate
docker run --rm renovate/renovate:39
-docker run --rm renovate/renovate:39.134
-docker run --rm renovate/renovate:39.134.0
+docker run --rm renovate/renovate:39.156
+docker run --rm renovate/renovate:39.156.2
```
@@ -62,7 +62,7 @@ spec:
- name: renovate
# Update this to the latest available and then enable Renovate on
# the manifest
- image: renovate/renovate:39.134.0
+ image: renovate/renovate:39.156.2
args:
- user/repo
# Environment Variables
@@ -121,7 +121,7 @@ spec:
template:
spec:
containers:
- - image: renovate/renovate:39.134.0
+ - image: renovate/renovate:39.156.2
name: renovate-bot
env: # For illustration purposes, please use secrets.
- name: RENOVATE_PLATFORM
@@ -367,7 +367,7 @@ spec:
containers:
- name: renovate
# Update this to the latest available and then enable Renovate on the manifest
- image: renovate/renovate:39.134.0
+ image: renovate/renovate:39.156.2
volumeMounts:
- name: ssh-key-volume
readOnly: true
diff --git a/docs/usage/getting-started/installing-onboarding.md b/docs/usage/getting-started/installing-onboarding.md
index d800c131a9356c..0f32f1c0345edf 100644
--- a/docs/usage/getting-started/installing-onboarding.md
+++ b/docs/usage/getting-started/installing-onboarding.md
@@ -5,7 +5,7 @@
Read the [Security and Permissions](../security-and-permissions.md) page to learn more about:
- Renovate's security stance
-- What do if you need to use certificed software
+- What do if you need to use certified software
- The security/disclosure process
- Permissions
- Privacy
diff --git a/docs/usage/language-constraints-and-upgrading.md b/docs/usage/language-constraints-and-upgrading.md
index 3f1e4501451904..e74960af29f581 100644
--- a/docs/usage/language-constraints-and-upgrading.md
+++ b/docs/usage/language-constraints-and-upgrading.md
@@ -68,7 +68,7 @@ In short, users who set `constraintsFiltering=strict` often do not understand ho
## Transitive constraint limitations
-Often a library sets language constraints (like the `engines` examples above), and then depend on libraries with _narrower_ contraints, like `"node": "^20.0.0"`.
+Often a library sets language constraints (like the `engines` examples above), and then depend on libraries with _narrower_ constraints, like `"node": "^20.0.0"`.
In cases like these, Renovate "trusts" the declaration of the library and may create a update, even _with_ strict constraints filtering.
For some package managers, like `npm`, this incompatibility will _not_ be detected or warned about (even during lock file generation), but this may not be a problem for your application.
diff --git a/docs/usage/python.md b/docs/usage/python.md
index 6b3751c2134360..66a027f6adc27c 100644
--- a/docs/usage/python.md
+++ b/docs/usage/python.md
@@ -26,7 +26,7 @@ Legacy versions with the `===` prefix are ignored.
## Package name matching
Your `matchPackageName` or `matchPackagePattern` rules will be matching against normalized names.
-So if you have specified package `some.package` or `ANOTHER_DEP` in your package files (`requirements.txt`, `pyproject.toml`), they will be treated as `some-package` and `another-dep` respecitvely.
+So if you have specified package `some.package` or `ANOTHER_DEP` in your package files (`requirements.txt`, `pyproject.toml`), they will be treated as `some-package` and `another-dep` respectively.
Not only they will be case insensitive but will replace any amount `._-` to a single `-`.
[Consult Python packaging documentation for the specification](https://packaging.python.org/en/latest/specifications/name-normalization/).
diff --git a/docs/usage/release-notes-for-major-versions.md b/docs/usage/release-notes-for-major-versions.md
index 5a1241fdc27d88..87aaa3cdc37b2d 100644
--- a/docs/usage/release-notes-for-major-versions.md
+++ b/docs/usage/release-notes-for-major-versions.md
@@ -64,7 +64,7 @@ Read the [GitHub Docs, Signature verification for rebase and merge](https://docs
#### Why we change branch names with multiple slashes
-Branches with mutiple slashes (`/`) are not wanted, this was a bug.
+Branches with multiple slashes (`/`) are not wanted, this was a bug.
We are changing it in a major release out of politeness to all our users.
If you enabled `branchNameStrict`, you can expect some branch names to change.
diff --git a/docs/usage/self-hosted-experimental.md b/docs/usage/self-hosted-experimental.md
index 78ea76a020dba6..a16acf51baf1d3 100644
--- a/docs/usage/self-hosted-experimental.md
+++ b/docs/usage/self-hosted-experimental.md
@@ -61,6 +61,15 @@ The formula for the delay between attempts is `RENOVATE_X_GITLAB_MERGE_REQUEST_D
Default value: `5` (attempts results in max. 13.75 seconds timeout).
+## `RENOVATE_X_GITLAB_BRANCH_STATUS_CHECK_ATTEMPTS`
+
+If set to a positive integer, Renovate will use this as the number of attempts to check branch status before trying to add a status check.
+The delay between attempts is `RENOVATE_X_GITLAB_BRANCH_STATUS_DELAY` milliseconds.
+
+Default value: `2` (attempts results in maximum 2 seconds timeout).
+
+!!! warning Increasing this value too much penalizes projects that do not have defined pipelines, Renovate will systematically wait `RENOVATE_X_GITLAB_BRANCH_STATUS_CHECK_ATTEMPTS * RENOVATE_X_GITLAB_BRANCH_STATUS_DELAY` milliseconds on these projects and slow down the Renovate analyzes.
+
## `RENOVATE_X_GITLAB_BRANCH_STATUS_DELAY`
Adjust default time (in milliseconds) given to GitLab to create pipelines for a commit pushed by Renovate.
diff --git a/docs/usage/string-pattern-matching.md b/docs/usage/string-pattern-matching.md
index 90a855558ab3fc..4de49faef82961 100644
--- a/docs/usage/string-pattern-matching.md
+++ b/docs/usage/string-pattern-matching.md
@@ -30,7 +30,7 @@ It is not valid to combine `*` with any other positive or negative match.
}
```
-In the latter case, the `*` can be ommitted and achieve the same thing.
+In the latter case, the `*` can be omitted and achieve the same thing.
## Regex matching
@@ -47,7 +47,7 @@ To ignore case sensitivity you must set the `i` flag, see the regex patterns tab
### Renovate uses re2 syntax
Renovate uses the [`re2` library](https://github.com/google/re2) for regex matching.
-`re2` is different from the full regex specification, because `re2` has a different sytax/support.
+`re2` is different from the full regex specification, because `re2` has a different syntax/support.
For the full `re2` syntax, read [the `re2` syntax wiki page](https://github.com/google/re2/wiki/Syntax).
diff --git a/docs/usage/templates.md b/docs/usage/templates.md
index d9eabfd55bd8bc..3135d99e23d93f 100644
--- a/docs/usage/templates.md
+++ b/docs/usage/templates.md
@@ -130,7 +130,7 @@ Splits a string into an array of substrings.
This example splits a package name by `-` and gets the second part:
`{{ lookup (split packageName '-') 1 }}`
-An input of `foo-bar-test` therefor would return `bar`.
+An input of `foo-bar-test` therefore would return `bar`.
### stringToPrettyJSON
diff --git a/lib/config/options/index.ts b/lib/config/options/index.ts
index 9aabdf41b45501..c5ad124c28110c 100644
--- a/lib/config/options/index.ts
+++ b/lib/config/options/index.ts
@@ -2745,7 +2745,7 @@ const options: RenovateOptions[] = [
description:
'It specifies the syntax of the package file being managed by the custom JSONata manager.',
type: 'string',
- allowedValues: ['json'],
+ allowedValues: ['json', 'yaml'],
parents: ['customManagers'],
cli: false,
env: false,
diff --git a/lib/config/presets/internal/global.ts b/lib/config/presets/internal/global.ts
index ce8240fcf131d8..a541fad0b910b6 100644
--- a/lib/config/presets/internal/global.ts
+++ b/lib/config/presets/internal/global.ts
@@ -4,7 +4,7 @@ import type { Preset } from '../types';
export const presets: Record = {
safeEnv: {
- allowedEnv: ['GO*', 'RUSTC_BOOTSTRAP'],
+ allowedEnv: ['GO*', 'GRADLE_OPTS', 'RUSTC_BOOTSTRAP'],
description:
'Hopefully safe environment variables to allow users to configure.',
},
diff --git a/lib/data/monorepo.json b/lib/data/monorepo.json
index abaa1647bce13b..0ab42cab1780e9 100644
--- a/lib/data/monorepo.json
+++ b/lib/data/monorepo.json
@@ -374,6 +374,7 @@
"kotlin": "https://github.com/JetBrains/kotlin",
"kotlinx-coroutines": "https://github.com/Kotlin/kotlinx.coroutines",
"kroki": "https://github.com/yuzutech/kroki",
+ "ksp": "https://github.com/google/ksp",
"ktor": "https://github.com/ktorio/ktor",
"lamar": "https://github.com/JasperFx/lamar",
"lerna": "https://github.com/lerna/lerna",
@@ -462,6 +463,7 @@
"orleans": "https://github.com/dotnet/orleans",
"panda-css": "https://github.com/chakra-ui/panda",
"parcel": "https://github.com/parcel-bundler/parcel",
+ "payloadcms": "https://github.com/payloadcms/payload",
"percy-cli": "https://github.com/percy/cli",
"picassojs": "https://github.com/qlik-oss/picasso.js",
"pixijs": [
@@ -493,6 +495,7 @@
"https://github.com/ReactTraining/react-router",
"https://github.com/remix-run/react-router"
],
+ "react-spectrum": "https://github.com/adobe/react-spectrum",
"reactivestack-cookies": "https://github.com/reactivestack/cookies",
"reakit": "https://github.com/reakit/reakit",
"redwood": "https://github.com/redwoodjs/redwood",
diff --git a/lib/logger/index.spec.ts b/lib/logger/index.spec.ts
index 6fc7c67dead27d..236e9a54080e10 100644
--- a/lib/logger/index.spec.ts
+++ b/lib/logger/index.spec.ts
@@ -17,6 +17,7 @@ import {
removeMeta,
setContext,
setMeta,
+ withMeta,
} from '.';
const initialContext = 'initial_context';
@@ -121,6 +122,43 @@ describe('logger/index', () => {
);
expect(bunyanDebugSpy).toHaveBeenCalledTimes(2);
});
+
+ it('withMeta adds and removes metadata correctly', () => {
+ const logMeta = { foo: 'foo' };
+ const tempMeta = { bar: 'bar' };
+
+ withMeta(tempMeta, () => {
+ logger.debug(logMeta, '');
+ expect(bunyanDebugSpy).toHaveBeenCalledWith(
+ { logContext: initialContext, ...tempMeta, ...logMeta },
+ '',
+ );
+ });
+
+ logger.debug(logMeta, '');
+ expect(bunyanDebugSpy).toHaveBeenCalledWith(
+ { logContext: initialContext, ...logMeta },
+ '',
+ );
+ });
+
+ it('withMeta handles cleanup when callback throws', () => {
+ const logMeta = { foo: 'foo' };
+ const tempMeta = { bar: 'bar' };
+
+ expect(() =>
+ withMeta(tempMeta, () => {
+ logger.debug(logMeta, '');
+ throw new Error('test error');
+ }),
+ ).toThrow('test error');
+
+ logger.debug(logMeta, '');
+ expect(bunyanDebugSpy).toHaveBeenCalledWith(
+ { logContext: initialContext, ...logMeta },
+ '',
+ );
+ });
});
it('sets level', () => {
diff --git a/lib/logger/index.ts b/lib/logger/index.ts
index a120c4a4584b2f..301fdb323da990 100644
--- a/lib/logger/index.ts
+++ b/lib/logger/index.ts
@@ -126,6 +126,15 @@ export function removeMeta(fields: string[]): void {
loggerInternal.removeMeta(fields);
}
+export function withMeta(obj: Record, cb: () => T): T {
+ setMeta(obj);
+ try {
+ return cb();
+ } finally {
+ removeMeta(Object.keys(obj));
+ }
+}
+
export /* istanbul ignore next */ function addStream(
stream: bunyan.Stream,
): void {
diff --git a/lib/modules/datasource/gitea-releases/readme.md b/lib/modules/datasource/gitea-releases/readme.md
index 7ad6f52c7e467b..e0d122fdfa27c3 100644
--- a/lib/modules/datasource/gitea-releases/readme.md
+++ b/lib/modules/datasource/gitea-releases/readme.md
@@ -1,3 +1,3 @@
-This datasource allows to lookup releases from a [Gitea](https://about.gitea.com/) or [Forjeo](https://forgejo.org/) repositories.
+This datasource allows to lookup releases from a [Gitea](https://about.gitea.com/) or [Forgejo](https://forgejo.org/) repositories.
By default it will use `https://gitea.com` to lookup releases.
diff --git a/lib/modules/datasource/gitea-tags/readme.md b/lib/modules/datasource/gitea-tags/readme.md
index 8fe820ca3357a5..570dd40a5d7672 100644
--- a/lib/modules/datasource/gitea-tags/readme.md
+++ b/lib/modules/datasource/gitea-tags/readme.md
@@ -1,3 +1,3 @@
-This datasource allows to lookup git tags from a [Gitea](https://about.gitea.com/) or [Forjeo](https://forgejo.org/) repositories.
+This datasource allows to lookup git tags from a [Gitea](https://about.gitea.com/) or [Forgejo](https://forgejo.org/) repositories.
By default it will use `https://gitea.com` to lookup tags.
diff --git a/lib/modules/manager/api.ts b/lib/modules/manager/api.ts
index 573fcf95375e93..259f893928a03c 100644
--- a/lib/modules/manager/api.ts
+++ b/lib/modules/manager/api.ts
@@ -28,6 +28,7 @@ import * as copier from './copier';
import * as cpanfile from './cpanfile';
import * as crossplane from './crossplane';
import * as depsEdn from './deps-edn';
+import * as devbox from './devbox';
import * as devContainer from './devcontainer';
import * as dockerCompose from './docker-compose';
import * as dockerfile from './dockerfile';
@@ -135,6 +136,7 @@ api.set('copier', copier);
api.set('cpanfile', cpanfile);
api.set('crossplane', crossplane);
api.set('deps-edn', depsEdn);
+api.set('devbox', devbox);
api.set('devcontainer', devContainer);
api.set('docker-compose', dockerCompose);
api.set('dockerfile', dockerfile);
diff --git a/lib/modules/manager/argocd/extract.ts b/lib/modules/manager/argocd/extract.ts
index 520415366891b0..4ff2de9418bbf6 100644
--- a/lib/modules/manager/argocd/extract.ts
+++ b/lib/modules/manager/argocd/extract.ts
@@ -2,8 +2,8 @@ import is from '@sindresorhus/is';
import { logger } from '../../../logger';
import { coerceArray } from '../../../util/array';
import { regEx } from '../../../util/regex';
+import { withDebugMessage } from '../../../util/schema-utils';
import { trimTrailingSlash } from '../../../util/url';
-import { parseYaml } from '../../../util/yaml';
import { DockerDatasource } from '../../datasource/docker';
import { GitTagsDatasource } from '../../datasource/git-tags';
import { HelmDatasource } from '../../datasource/helm';
@@ -15,7 +15,8 @@ import type {
PackageFileContent,
} from '../types';
import {
- ApplicationDefinition,
+ type ApplicationDefinition,
+ ApplicationDefinitionSchema,
type ApplicationSource,
type ApplicationSpec,
} from './schema';
@@ -36,11 +37,9 @@ export function extractPackageFile(
return null;
}
- const definitions = parseYaml(content, {
- customSchema: ApplicationDefinition,
- failureBehaviour: 'filter',
- removeTemplates: true,
- });
+ const definitions = ApplicationDefinitionSchema.catch(
+ withDebugMessage([], `error parsing ${packageFile}`),
+ ).parse(content);
const deps = definitions.flatMap(processAppSpec);
diff --git a/lib/modules/manager/argocd/schema.ts b/lib/modules/manager/argocd/schema.ts
index 4fb8e636829282..395f7f9a9d6ec2 100644
--- a/lib/modules/manager/argocd/schema.ts
+++ b/lib/modules/manager/argocd/schema.ts
@@ -1,5 +1,5 @@
import { z } from 'zod';
-import { LooseArray } from '../../../util/schema-utils';
+import { LooseArray, multidocYaml } from '../../../util/schema-utils';
export const KubernetesResource = z.object({
apiVersion: z.string(),
@@ -38,3 +38,7 @@ export const ApplicationSet = KubernetesResource.extend({
export const ApplicationDefinition = Application.or(ApplicationSet);
export type ApplicationDefinition = z.infer;
+
+export const ApplicationDefinitionSchema = multidocYaml({
+ removeTemplates: true,
+}).pipe(LooseArray(ApplicationDefinition));
diff --git a/lib/modules/manager/cloudbuild/extract.ts b/lib/modules/manager/cloudbuild/extract.ts
index 92f08454da77de..9fa9500fe1a160 100644
--- a/lib/modules/manager/cloudbuild/extract.ts
+++ b/lib/modules/manager/cloudbuild/extract.ts
@@ -1,49 +1,25 @@
-import is from '@sindresorhus/is';
import { logger } from '../../../logger';
-import { parseSingleYaml } from '../../../util/yaml';
import { getDep } from '../dockerfile/extract';
-import type { PackageDependency, PackageFileContent } from '../types';
+import type { PackageFileContent } from '../types';
+import { CloudbuildSteps } from './schema';
export function extractPackageFile(
content: string,
packageFile?: string,
): PackageFileContent | null {
- const deps: PackageDependency[] = [];
- try {
- // TODO: fix types
- const doc: any = parseSingleYaml(content);
- if (doc?.steps && is.array(doc.steps)) {
- for (const step of doc.steps) {
- if (step.name) {
- const dep = getDep(step.name);
- logger.trace(
- {
- depName: dep.depName,
- currentValue: dep.currentValue,
- currentDigest: dep.currentDigest,
- },
- 'Cloud Build docker image',
- );
+ const deps = CloudbuildSteps.catch(({ error: err }) => {
+ logger.debug(
+ { err, packageFile },
+ 'Cloud Build: error extracting Docker images from a configuration file.',
+ );
+ return [];
+ })
+ .transform((steps) => steps.map((step) => getDep(step)))
+ .parse(content);
- deps.push(dep);
- }
- }
- }
- } catch (err) /* istanbul ignore next */ {
- if (err.stack?.startsWith('YAMLException:')) {
- logger.debug(
- { err, packageFile },
- 'YAML exception extracting Docker images from a Cloud Build configuration file.',
- );
- } else {
- logger.debug(
- { err, packageFile },
- 'Error extracting Docker images from a Cloud Build configuration file.',
- );
- }
- }
if (!deps.length) {
return null;
}
+
return { deps };
}
diff --git a/lib/modules/manager/cloudbuild/schema.ts b/lib/modules/manager/cloudbuild/schema.ts
new file mode 100644
index 00000000000000..46cad9b327457c
--- /dev/null
+++ b/lib/modules/manager/cloudbuild/schema.ts
@@ -0,0 +1,12 @@
+import { z } from 'zod';
+import { LooseArray, Yaml } from '../../../util/schema-utils';
+
+export const CloudbuildSteps = Yaml.pipe(
+ z
+ .object({
+ steps: LooseArray(
+ z.object({ name: z.string() }).transform(({ name }) => name),
+ ),
+ })
+ .transform(({ steps }) => steps),
+);
diff --git a/lib/modules/manager/composer/schema.ts b/lib/modules/manager/composer/schema.ts
index e1d9ffa47fd455..4fabd2eaa4fb2f 100644
--- a/lib/modules/manager/composer/schema.ts
+++ b/lib/modules/manager/composer/schema.ts
@@ -2,7 +2,12 @@ import { z } from 'zod';
import { logger } from '../../../logger';
import { readLocalFile } from '../../../util/fs';
import { regEx } from '../../../util/regex';
-import { Json, LooseArray, LooseRecord } from '../../../util/schema-utils';
+import {
+ Json,
+ LooseArray,
+ LooseRecord,
+ withDebugMessage,
+} from '../../../util/schema-utils';
import { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags';
import { GitTagsDatasource } from '../../datasource/git-tags';
import { GithubTagsDatasource } from '../../datasource/github-tags';
@@ -126,10 +131,7 @@ export type ReposArray = z.infer;
export const Repos = z
.union([ReposRecord, ReposArray])
.default([]) // Prevents warnings for packages without repositories field
- .catch(({ error: err }) => {
- logger.debug({ err }, 'Composer: invalid "repositories" field');
- return [];
- })
+ .catch(withDebugMessage([], 'Composer: invalid "repositories" field'))
.transform((repos) => {
let packagist = true;
const repoUrls: string[] = [];
@@ -242,10 +244,9 @@ export const ComposerExtract = z
.pipe(Json)
.pipe(Lockfile)
.nullable()
- .catch(({ error: err }) => {
- logger.debug({ err }, 'Composer: lockfile parsing error');
- return null;
- }),
+ .catch(
+ withDebugMessage(null, 'Composer: lockfile parsing error'),
+ ),
]),
),
}),
diff --git a/lib/modules/manager/custom/jsonata/index.spec.ts b/lib/modules/manager/custom/jsonata/index.spec.ts
index 9237ba21b62dbf..8c958ff2eaf25b 100644
--- a/lib/modules/manager/custom/jsonata/index.spec.ts
+++ b/lib/modules/manager/custom/jsonata/index.spec.ts
@@ -67,6 +67,60 @@ describe('modules/manager/custom/jsonata/index', () => {
const res = await extractPackageFile(json, 'unused', config);
expect(res).toMatchObject({
+ ...config,
+ deps: [
+ {
+ depName: 'foo',
+ packageName: 'fii',
+ currentValue: '1.2.3',
+ currentDigest: '1234',
+ datasource: 'nuget',
+ versioning: 'maven',
+ extractVersion: 'custom-extract-version',
+ registryUrls: ['https://registry.npmjs.org/'],
+ depType: 'dev',
+ },
+ ],
+ });
+ });
+
+ it('extracts yaml', async () => {
+ const json = codeBlock`
+ ---
+ packages:
+ -
+ "dep_name": "foo"
+ "package_name": "fii"
+ "current_value": "1.2.3"
+ "current_digest": "1234"
+ "data_source": "nuget"
+ "versioning": "maven"
+ "extract_version": "custom-extract-version"
+ "registry_url": "https://registry.npmjs.org"
+ "dep_type": "dev"
+ ---
+ some: true
+ `;
+ const config = {
+ fileFormat: 'yaml',
+ matchStrings: [
+ `packages.{
+ "depName": dep_name,
+ "packageName": package_name,
+ "currentValue": current_value,
+ "currentDigest": current_digest,
+ "datasource": data_source,
+ "versioning": versioning,
+ "extractVersion": extract_version,
+ "registryUrl": registry_url,
+ "depType": dep_type
+ }`,
+ ],
+ };
+ const res = await extractPackageFile(json, 'unused', config);
+
+ expect(res).toMatchObject({
+ ...config,
deps: [
{
depName: 'foo',
@@ -138,6 +192,7 @@ describe('modules/manager/custom/jsonata/index', () => {
const res = await extractPackageFile(json, 'unused', config);
expect(res).toMatchObject({
+ ...config,
deps: [
{
depName: 'foo',
@@ -261,6 +316,7 @@ describe('modules/manager/custom/jsonata/index', () => {
};
const res = await extractPackageFile('{}', 'unused', config);
expect(res).toMatchObject({
+ ...config,
deps: [
{
depName: 'foo',
@@ -275,4 +331,35 @@ describe('modules/manager/custom/jsonata/index', () => {
],
});
});
+
+ it('populates manager config and jsonata manager template fields in extract result', async () => {
+ const config = {
+ fileFormat: 'json',
+ matchStrings: [`{"depName": "foo"}`, `{"depName": "bar"}`],
+ currentValueTemplate: '1.0.0',
+ datasourceTemplate: 'npm',
+ // should be included present extract result as it is not valid jsonata manager template
+ // adding here for testing
+ autoReplaceStringTemplate: `{{{depName}}}:{{{newValue}}}`,
+ };
+ const res = await extractPackageFile('{}', 'unused', config);
+ expect(res).toMatchObject({
+ deps: [
+ {
+ depName: 'foo',
+ currentValue: '1.0.0',
+ datasource: 'npm',
+ },
+ {
+ depName: 'bar',
+ currentValue: '1.0.0',
+ datasource: 'npm',
+ },
+ ],
+ fileFormat: 'json',
+ matchStrings: [`{"depName": "foo"}`, `{"depName": "bar"}`],
+ currentValueTemplate: '1.0.0',
+ datasourceTemplate: 'npm',
+ });
+ });
});
diff --git a/lib/modules/manager/custom/jsonata/index.ts b/lib/modules/manager/custom/jsonata/index.ts
index cd63c0c0081534..5c212da17ba11e 100644
--- a/lib/modules/manager/custom/jsonata/index.ts
+++ b/lib/modules/manager/custom/jsonata/index.ts
@@ -2,8 +2,10 @@ import is from '@sindresorhus/is';
import type { Category } from '../../../../constants';
import { logger } from '../../../../logger';
import { parseJson } from '../../../../util/common';
+import { parseYaml } from '../../../../util/yaml';
import type { PackageFileContent } from '../../types';
-import type { JsonataExtractConfig } from './types';
+import { validMatchFields } from '../utils';
+import type { JSONataManagerTemplates, JsonataExtractConfig } from './types';
import { handleMatching } from './utils';
export const categories: Category[] = ['custom'];
@@ -25,6 +27,9 @@ export async function extractPackageFile(
case 'json':
json = parseJson(content, packageFile);
break;
+ case 'yaml':
+ json = parseYaml(content);
+ break;
}
} catch (err) {
logger.debug(
@@ -43,7 +48,20 @@ export async function extractPackageFile(
return null;
}
- return {
+ const res: PackageFileContent & JSONataManagerTemplates = {
deps,
+ matchStrings: config.matchStrings,
+ fileFormat: config.fileFormat,
};
+
+ // copy over templates for autoreplace
+ for (const field of validMatchFields.map(
+ (f) => `${f}Template` as keyof JSONataManagerTemplates,
+ )) {
+ if (config[field]) {
+ res[field] = config[field];
+ }
+ }
+
+ return res;
}
diff --git a/lib/modules/manager/custom/jsonata/readme.md b/lib/modules/manager/custom/jsonata/readme.md
index e388f2936fe6f9..257b173b8edb58 100644
--- a/lib/modules/manager/custom/jsonata/readme.md
+++ b/lib/modules/manager/custom/jsonata/readme.md
@@ -1,6 +1,6 @@
-With `customManagers` using `JSONata` queries you can configure Renovate so it finds dependencies in JSON files, that are not detected by its other built-in package managers.
+With `customManagers` using `JSONata` queries you can configure Renovate so it finds dependencies in JSON or YAML files, that are not detected by its other built-in package managers.
-Renovate uses the `jsonata` package to process the `json` file content using the queries.
+Renovate uses the `jsonata` package to process the `json` or `yaml` file content using the queries.
For more on the jsonata query language, read the [jsonata query language site](https://docs.jsonata.org/overview.html).
@@ -87,6 +87,8 @@ We recommend you follow these steps:
Alternatively you can "try and error" to a working config, by adjusting our examples.
+YAML files are parsed as multi document files.
+
#### Example queries
Below are some example queries for the generic JSON manager.
@@ -201,3 +203,31 @@ $map($map(packages, function ($v) { $split($v, "@") }), function ($v) { { "depNa
"datasourceTemplate": "npm"
}
```
+
+```yaml title="Dependencies in a single node, and we want to extract all of them"
+packages:
+ - version: 1.2.3
+ package: foo
+```
+
+Query:
+
+```
+packages.{ "depName": package, "currentValue": version }
+```
+
+```yaml title="Dependencies in a single node in a multi document yaml, and we want to extract all of them"
+packages:
+ - version: 1.2.3
+ package: foo
+---
+packages:
+ - version: 1.2.5
+ package: bar
+```
+
+Query:
+
+```
+packages.{ "depName": package, "currentValue": version }
+```
diff --git a/lib/modules/manager/devbox/artifacts.spec.ts b/lib/modules/manager/devbox/artifacts.spec.ts
new file mode 100644
index 00000000000000..f2ffbd4dcfc2de
--- /dev/null
+++ b/lib/modules/manager/devbox/artifacts.spec.ts
@@ -0,0 +1,243 @@
+import { codeBlock } from 'common-tags';
+import { mockExecAll } from '../../../../test/exec-util';
+import { fs, git, partial } from '../../../../test/util';
+import { GlobalConfig } from '../../../config/global';
+import type { RepoGlobalConfig } from '../../../config/types';
+import type { StatusResult } from '../../../util/git/types';
+import type { UpdateArtifact } from '../types';
+import { updateArtifacts } from './artifacts';
+
+jest.mock('../../../util/exec/env');
+jest.mock('../../../util/git');
+jest.mock('../../../util/fs');
+
+const globalConfig: RepoGlobalConfig = {
+ localDir: '',
+};
+
+const devboxJson = codeBlock`
+ {
+ "$schema": "https://raw.githubusercontent.com/jetpack-io/devbox/0.10.1/.schema/devbox.schema.json",
+ "packages": ["nodejs@20", "metabase@0.49.1", "postgresql@latest", "gh@latest"],
+ }
+`;
+
+describe('modules/manager/devbox/artifacts', () => {
+ describe('updateArtifacts()', () => {
+ let updateArtifact: UpdateArtifact;
+
+ beforeEach(() => {
+ GlobalConfig.set(globalConfig);
+ updateArtifact = {
+ config: {},
+ newPackageFileContent: '',
+ packageFileName: '',
+ updatedDeps: [],
+ };
+ });
+
+ it('skips if no updatedDeps and no lockFileMaintenance', async () => {
+ expect(await updateArtifacts(updateArtifact)).toBeNull();
+ });
+
+ it('skips if no lock file in config', async () => {
+ updateArtifact.updatedDeps = [{}];
+ expect(await updateArtifacts(updateArtifact)).toBeNull();
+ });
+
+ it('skips if cannot read lock file', async () => {
+ updateArtifact.updatedDeps = [
+ { manager: 'devbox', lockFiles: ['devbox.lock'] },
+ ];
+ expect(await updateArtifacts(updateArtifact)).toBeNull();
+ });
+
+ it('returns installed devbox.lock', async () => {
+ fs.getSiblingFileName.mockReturnValueOnce('devbox.lock');
+ fs.readLocalFile.mockResolvedValueOnce(codeBlock`{}`);
+ const execSnapshots = mockExecAll();
+ const oldLockFileContent = Buffer.from('Old devbox.lock');
+ const newLockFileContent = Buffer.from('New devbox.lock');
+ fs.readLocalFile.mockResolvedValueOnce(oldLockFileContent as never);
+ fs.readLocalFile.mockResolvedValueOnce(newLockFileContent as never);
+ expect(
+ await updateArtifacts({
+ packageFileName: 'devbox.json',
+ newPackageFileContent: devboxJson,
+ updatedDeps: [{ manager: 'devbox', lockFiles: ['devbox.lock'] }],
+ config: {},
+ }),
+ ).toEqual([
+ {
+ file: {
+ type: 'addition',
+ path: 'devbox.lock',
+ contents: newLockFileContent,
+ },
+ },
+ ]);
+ expect(execSnapshots).toMatchObject([
+ {
+ cmd: 'devbox install',
+ options: {
+ cwd: '.',
+ encoding: 'utf-8',
+ env: {},
+ maxBuffer: 10485760,
+ timeout: 900000,
+ },
+ },
+ ]);
+ });
+
+ it('returns updated devbox.lock', async () => {
+ fs.getSiblingFileName.mockReturnValueOnce('devbox.lock');
+ fs.readLocalFile.mockResolvedValueOnce(codeBlock`{}`);
+ const execSnapshots = mockExecAll();
+ git.getRepoStatus.mockResolvedValueOnce(
+ partial({
+ modified: ['devbox.lock'],
+ }),
+ );
+ const oldLockFileContent = Buffer.from('old devbox.lock');
+ const newLockFileContent = Buffer.from('New devbox.lock');
+ fs.readLocalFile.mockResolvedValueOnce(oldLockFileContent as never);
+ fs.readLocalFile.mockResolvedValueOnce(newLockFileContent as never);
+ expect(
+ await updateArtifacts({
+ packageFileName: 'devbox.json',
+ newPackageFileContent: devboxJson,
+ updatedDeps: [{}],
+ config: {
+ isLockFileMaintenance: true,
+ },
+ }),
+ ).toEqual([
+ {
+ file: {
+ type: 'addition',
+ path: 'devbox.lock',
+ contents: newLockFileContent,
+ },
+ },
+ ]);
+ expect(execSnapshots).toMatchObject([
+ {
+ cmd: 'devbox update',
+ options: {
+ cwd: '.',
+ encoding: 'utf-8',
+ env: {},
+ maxBuffer: 10485760,
+ timeout: 900000,
+ },
+ },
+ ]);
+ });
+
+ it('returns null if no changes are found', async () => {
+ fs.getSiblingFileName.mockReturnValueOnce('devbox.lock');
+ fs.readLocalFile.mockResolvedValueOnce(codeBlock`{}`);
+ git.getRepoStatus.mockResolvedValueOnce(
+ partial({
+ modified: [],
+ }),
+ );
+ mockExecAll();
+ expect(
+ await updateArtifacts({
+ packageFileName: 'devbox.json',
+ newPackageFileContent: devboxJson,
+ updatedDeps: [],
+ config: {},
+ }),
+ ).toBeNull();
+ });
+
+ it('returns null if devbox.lock not found after update', async () => {
+ fs.getSiblingFileName.mockReturnValueOnce('devbox.lock');
+ fs.readLocalFile.mockResolvedValueOnce(codeBlock`{}`);
+ git.getRepoStatus.mockResolvedValueOnce(
+ partial({
+ modified: [],
+ }),
+ );
+ mockExecAll();
+ const oldLockFileContent = Buffer.from('Old devbox.lock');
+ fs.readLocalFile.mockResolvedValueOnce(oldLockFileContent as never);
+ expect(
+ await updateArtifacts({
+ packageFileName: 'devbox.json',
+ newPackageFileContent: devboxJson,
+ updatedDeps: [{}],
+ config: {},
+ }),
+ ).toBeNull();
+ });
+
+ it('returns null if devbox.lock not found', async () => {
+ fs.getSiblingFileName.mockReturnValueOnce('devbox.lock');
+ fs.readLocalFile.mockResolvedValueOnce(codeBlock`{}`);
+ git.getRepoStatus.mockResolvedValueOnce(
+ partial({
+ modified: [],
+ }),
+ );
+ mockExecAll();
+ fs.readLocalFile.mockResolvedValueOnce(null);
+ expect(
+ await updateArtifacts({
+ packageFileName: 'devbox.json',
+ newPackageFileContent: devboxJson,
+ updatedDeps: [{}],
+ config: {},
+ }),
+ ).toBeNull();
+ });
+
+ it('returns null if no lock file changes are found', async () => {
+ fs.getSiblingFileName.mockReturnValueOnce('devbox.lock');
+ fs.readLocalFile.mockResolvedValueOnce(codeBlock`{}`);
+ git.getRepoStatus.mockResolvedValueOnce(
+ partial({
+ modified: [],
+ }),
+ );
+ mockExecAll();
+ const oldLockFileContent = Buffer.from('Old devbox.lock');
+ fs.readLocalFile.mockResolvedValueOnce(oldLockFileContent as never);
+ fs.readLocalFile.mockResolvedValueOnce(oldLockFileContent as never);
+ expect(
+ await updateArtifacts({
+ packageFileName: 'devbox.json',
+ newPackageFileContent: devboxJson,
+ updatedDeps: [{}],
+ config: {},
+ }),
+ ).toBeNull();
+ });
+
+ it('returns an artifact error on failure', async () => {
+ fs.getSiblingFileName.mockReturnValueOnce('devbox.lock');
+ const newLockFileContent = codeBlock`{}`;
+ const oldLockFileContent = Buffer.from('New devbox.lock');
+ fs.readLocalFile.mockResolvedValueOnce(oldLockFileContent as never);
+ fs.readLocalFile.mockResolvedValueOnce(newLockFileContent as never);
+ expect(
+ await updateArtifacts({
+ packageFileName: 'devbox.json',
+ newPackageFileContent: devboxJson,
+ updatedDeps: [{}],
+ config: {},
+ }),
+ ).toEqual([
+ {
+ artifactError: {
+ lockFile: 'devbox.lock',
+ stderr: "Cannot read properties of undefined (reading 'stdout')",
+ },
+ },
+ ]);
+ });
+ });
+});
diff --git a/lib/modules/manager/devbox/artifacts.ts b/lib/modules/manager/devbox/artifacts.ts
new file mode 100644
index 00000000000000..c90c6faa3345e6
--- /dev/null
+++ b/lib/modules/manager/devbox/artifacts.ts
@@ -0,0 +1,82 @@
+import is from '@sindresorhus/is';
+import { logger } from '../../../logger';
+import { exec } from '../../../util/exec';
+import type { ExecOptions } from '../../../util/exec/types';
+import { getSiblingFileName, readLocalFile } from '../../../util/fs';
+import type { UpdateArtifact, UpdateArtifactsResult } from '../types';
+
+export async function updateArtifacts(
+ updateConfig: UpdateArtifact,
+): Promise {
+ const lockFileName = getSiblingFileName(
+ updateConfig.packageFileName,
+ 'devbox.lock',
+ );
+ const existingLockFileContent = await readLocalFile(lockFileName, 'utf8');
+ if (!existingLockFileContent) {
+ logger.debug('No devbox.lock found');
+ return null;
+ }
+ const execOptions: ExecOptions = {
+ cwdFile: updateConfig.packageFileName,
+ toolConstraints: [
+ {
+ toolName: 'devbox',
+ constraint: updateConfig.config.constraints?.devbox,
+ },
+ ],
+ docker: {},
+ userConfiguredEnv: updateConfig.config.env,
+ };
+
+ let cmd = '';
+ if (
+ updateConfig.config.isLockFileMaintenance ||
+ updateConfig.config.updateType === 'lockFileMaintenance'
+ ) {
+ cmd += 'devbox update';
+ } else if (is.nonEmptyArray(updateConfig.updatedDeps)) {
+ cmd += 'devbox install';
+ } else {
+ logger.trace('No updated devbox packages - returning null');
+ return null;
+ }
+
+ const oldLockFileContent = await readLocalFile(lockFileName);
+ if (!oldLockFileContent) {
+ logger.trace(`No ${lockFileName} found`);
+ return null;
+ }
+
+ try {
+ await exec(cmd, execOptions);
+ const newLockFileContent = await readLocalFile(lockFileName);
+
+ if (
+ !newLockFileContent ||
+ Buffer.compare(oldLockFileContent, newLockFileContent) === 0
+ ) {
+ return null;
+ }
+ logger.trace('Returning updated devbox.lock');
+ return [
+ {
+ file: {
+ type: 'addition',
+ path: lockFileName,
+ contents: newLockFileContent,
+ },
+ },
+ ];
+ } catch (err) {
+ logger.warn({ err }, 'Error updating devbox.lock');
+ return [
+ {
+ artifactError: {
+ lockFile: lockFileName,
+ stderr: err.message,
+ },
+ },
+ ];
+ }
+}
diff --git a/lib/modules/manager/devbox/extract.spec.ts b/lib/modules/manager/devbox/extract.spec.ts
new file mode 100644
index 00000000000000..ba295b3a5ca43c
--- /dev/null
+++ b/lib/modules/manager/devbox/extract.spec.ts
@@ -0,0 +1,291 @@
+import { codeBlock } from 'common-tags';
+import { extractPackageFile } from '.';
+
+describe('modules/manager/devbox/extract', () => {
+ describe('extractPackageFile', () => {
+ it('returns null when the devbox JSON file is empty', () => {
+ const result = extractPackageFile('', 'devbox.lock');
+ expect(result).toBeNull();
+ });
+
+ it('returns null when the devbox JSON file is malformed', () => {
+ const result = extractPackageFile('malformed json}}}}}', 'devbox.lock');
+ expect(result).toBeNull();
+ });
+
+ it('returns null when the devbox JSON file has no packages', () => {
+ const result = extractPackageFile('{}', 'devbox.lock');
+ expect(result).toBeNull();
+ });
+
+ it('returns a package dependency when the devbox JSON file has a single package', () => {
+ const result = extractPackageFile(
+ codeBlock`
+ {
+ "packages": ["nodejs@20.1.8"]
+ }
+ `,
+ 'devbox.lock',
+ );
+ expect(result).toEqual({
+ deps: [
+ {
+ depName: 'nodejs',
+ currentValue: '20.1.8',
+ datasource: 'devbox',
+ },
+ ],
+ });
+ });
+
+ it('returns a package dependency when the devbox JSON file has a single package with a version object', () => {
+ const result = extractPackageFile(
+ codeBlock`
+ {
+ "packages": {
+ "nodejs": "20.1.8"
+ }
+ }
+ `,
+ 'devbox.lock',
+ );
+ expect(result).toEqual({
+ deps: [
+ {
+ depName: 'nodejs',
+ currentValue: '20.1.8',
+ datasource: 'devbox',
+ },
+ ],
+ });
+ });
+
+ it('returns invalid-version when the devbox JSON file has a single package with an invalid version', () => {
+ const result = extractPackageFile(
+ codeBlock`
+ {
+ "packages": {
+ "nodejs": "^20.1.8"
+ }
+ }
+ `,
+ 'devbox.lock',
+ );
+ expect(result).toEqual({
+ deps: [
+ {
+ currentValue: '^20.1.8',
+ datasource: 'devbox',
+ depName: 'nodejs',
+ skipReason: 'invalid-version',
+ },
+ ],
+ });
+ });
+
+ it('returns a package dependency when the devbox JSON file has multiple packages', () => {
+ const result = extractPackageFile(
+ codeBlock`
+ {
+ "packages": ["nodejs@20.1.8", "yarn@1.22.10"]
+ }
+ `,
+ 'devbox.lock',
+ );
+ expect(result).toEqual({
+ deps: [
+ {
+ depName: 'nodejs',
+ currentValue: '20.1.8',
+ datasource: 'devbox',
+ },
+ {
+ depName: 'yarn',
+ currentValue: '1.22.10',
+ datasource: 'devbox',
+ },
+ ],
+ });
+ });
+
+ it('returns a package dependency when the devbox JSON file has multiple packages with in a packages object', () => {
+ const result = extractPackageFile(
+ codeBlock`
+ {
+ "packages": {
+ "nodejs": "20.1.8",
+ "yarn": "1.22.10"
+ }
+ }
+ `,
+ 'devbox.lock',
+ );
+ expect(result).toEqual({
+ deps: [
+ {
+ depName: 'nodejs',
+ currentValue: '20.1.8',
+ datasource: 'devbox',
+ },
+ {
+ depName: 'yarn',
+ currentValue: '1.22.10',
+ datasource: 'devbox',
+ },
+ ],
+ });
+ });
+
+ it('returns a package dependency when the devbox JSON file has multiple packages with package objects', () => {
+ const result = extractPackageFile(
+ codeBlock`
+ {
+ "packages": {
+ "nodejs": {
+ "version": "20.1.8"
+ },
+ "yarn": {
+ "version": "1.22.10"
+ }
+ }
+ }
+ `,
+ 'devbox.lock',
+ );
+ expect(result).toEqual({
+ deps: [
+ {
+ depName: 'nodejs',
+ currentValue: '20.1.8',
+ datasource: 'devbox',
+ },
+ {
+ depName: 'yarn',
+ currentValue: '1.22.10',
+ datasource: 'devbox',
+ },
+ ],
+ });
+ });
+
+ it('returns invalid dependencies', () => {
+ const result = extractPackageFile(
+ codeBlock`
+ {
+ "packages": {
+ "nodejs": "20.1.8",
+ "yarn": "1.22.10",
+ "invalid": "invalid"
+ }
+ }
+ `,
+ 'devbox.lock',
+ );
+ expect(result).toEqual({
+ deps: [
+ {
+ depName: 'nodejs',
+ currentValue: '20.1.8',
+ datasource: 'devbox',
+ },
+ {
+ depName: 'yarn',
+ currentValue: '1.22.10',
+ datasource: 'devbox',
+ },
+ {
+ currentValue: 'invalid',
+ datasource: 'devbox',
+ depName: 'invalid',
+ skipReason: 'invalid-version',
+ },
+ ],
+ });
+ });
+
+ it('returns invalid dependencies with package objects', () => {
+ const result = extractPackageFile(
+ codeBlock`
+ {
+ "packages": {
+ "nodejs": "20.1.8",
+ "yarn": "1.22.10",
+ "invalid": {
+ "version": "invalid"
+ }
+ }
+ }
+ `,
+ 'devbox.lock',
+ );
+ expect(result).toEqual({
+ deps: [
+ {
+ depName: 'nodejs',
+ currentValue: '20.1.8',
+ datasource: 'devbox',
+ },
+ {
+ depName: 'yarn',
+ currentValue: '1.22.10',
+ datasource: 'devbox',
+ },
+ {
+ currentValue: 'invalid',
+ datasource: 'devbox',
+ depName: 'invalid',
+ skipReason: 'invalid-version',
+ },
+ ],
+ });
+ });
+
+ it('returns invalid dependencies from the packages array', () => {
+ const result = extractPackageFile(
+ codeBlock`
+ {
+ "packages": ["nodejs@20.1.8", "yarn@1.22.10", "invalid@invalid", "invalid2"]
+ }
+ `,
+ 'devbox.lock',
+ );
+ expect(result).toEqual({
+ deps: [
+ {
+ depName: 'nodejs',
+ currentValue: '20.1.8',
+ datasource: 'devbox',
+ },
+ {
+ depName: 'yarn',
+ currentValue: '1.22.10',
+ datasource: 'devbox',
+ },
+ {
+ currentValue: 'invalid',
+ datasource: 'devbox',
+ depName: 'invalid',
+ skipReason: 'invalid-version',
+ },
+ {
+ datasource: 'devbox',
+ depName: 'invalid2',
+ skipReason: 'not-a-version',
+ },
+ ],
+ });
+ });
+
+ it('returns null if there are no dependencies', () => {
+ const result = extractPackageFile(
+ codeBlock`
+ {
+ "packages": []
+ }
+ `,
+ 'devbox.lock',
+ );
+ expect(result).toBeNull();
+ });
+ });
+});
diff --git a/lib/modules/manager/devbox/extract.ts b/lib/modules/manager/devbox/extract.ts
new file mode 100644
index 00000000000000..1703779ea89ed4
--- /dev/null
+++ b/lib/modules/manager/devbox/extract.ts
@@ -0,0 +1,17 @@
+import { logger, withMeta } from '../../../logger';
+import type { PackageFileContent } from '../types';
+import { DevboxSchema } from './schema';
+
+export function extractPackageFile(
+ content: string,
+ packageFile: string,
+): PackageFileContent | null {
+ logger.trace('devbox.extractPackageFile()');
+
+ const deps = withMeta({ packageFile }, () => DevboxSchema.parse(content));
+ if (!deps.length) {
+ return null;
+ }
+
+ return { deps };
+}
diff --git a/lib/modules/manager/devbox/index.ts b/lib/modules/manager/devbox/index.ts
new file mode 100644
index 00000000000000..d6764af34e43ef
--- /dev/null
+++ b/lib/modules/manager/devbox/index.ts
@@ -0,0 +1,12 @@
+import { DevboxDatasource } from '../../datasource/devbox';
+
+export { extractPackageFile } from './extract';
+export { updateArtifacts } from './artifacts';
+
+export const supportsLockFileMaintenance = true;
+
+export const defaultConfig = {
+ fileMatch: ['(^|/)devbox\\.json$'],
+};
+
+export const supportedDatasources = [DevboxDatasource.id];
diff --git a/lib/modules/manager/devbox/readme.md b/lib/modules/manager/devbox/readme.md
new file mode 100644
index 00000000000000..5b91520f9fed8b
--- /dev/null
+++ b/lib/modules/manager/devbox/readme.md
@@ -0,0 +1,5 @@
+Used for updating [devbox](https://www.jetify.com/devbox) projects.
+
+Devbox is a tool for creating isolated, reproducible development environments that run anywhere.
+
+It uses nix packages sourced from the devbox package registry.
diff --git a/lib/modules/manager/devbox/schema.ts b/lib/modules/manager/devbox/schema.ts
new file mode 100644
index 00000000000000..77f88ee8f18dc5
--- /dev/null
+++ b/lib/modules/manager/devbox/schema.ts
@@ -0,0 +1,63 @@
+import { z } from 'zod';
+import { logger } from '../../../logger';
+import {
+ Jsonc,
+ LooseArray,
+ LooseRecord,
+ withDebugMessage,
+} from '../../../util/schema-utils';
+import { DevboxDatasource } from '../../datasource/devbox';
+import { api as devboxVersioning } from '../../versioning/devbox';
+import type { PackageDependency } from '../types';
+
+const DevboxEntry = z
+ .array(z.string())
+ .min(1)
+ .transform(([depName, currentValue]) => {
+ const dep: PackageDependency = {
+ datasource: DevboxDatasource.id,
+ depName,
+ };
+
+ if (!currentValue) {
+ logger.trace(
+ { depName },
+ 'Devbox: skipping invalid devbox dependency in devbox JSON file.',
+ );
+ dep.skipReason = 'not-a-version';
+ return dep;
+ }
+
+ dep.currentValue = currentValue;
+
+ if (!devboxVersioning.isValid(currentValue)) {
+ logger.debug(
+ { depName },
+ 'Devbox: skipping invalid devbox dependency in devbox JSON file.',
+ );
+ dep.skipReason = 'invalid-version';
+ return dep;
+ }
+
+ return dep;
+ });
+
+export const DevboxSchema = Jsonc.pipe(
+ z.object({
+ packages: z
+ .union([
+ LooseArray(z.string().transform((pkg) => pkg.split('@'))),
+ LooseRecord(
+ z.union([
+ z.string(),
+ z
+ .object({ version: z.string() })
+ .transform(({ version }) => version),
+ ]),
+ ).transform((obj) => Object.entries(obj)),
+ ])
+ .pipe(LooseArray(DevboxEntry)),
+ }),
+)
+ .transform(({ packages }) => packages)
+ .catch(withDebugMessage([], 'Devbox: error parsing file'));
diff --git a/lib/modules/manager/nix/extract.spec.ts b/lib/modules/manager/nix/extract.spec.ts
index 9645744c2a9208..035a495eb0670f 100644
--- a/lib/modules/manager/nix/extract.spec.ts
+++ b/lib/modules/manager/nix/extract.spec.ts
@@ -1,74 +1,603 @@
+import { fs } from '../../../../test/util';
import { GitRefsDatasource } from '../../datasource/git-refs';
import { id as nixpkgsVersioning } from '../../versioning/nixpkgs';
import { extractPackageFile } from '.';
+jest.mock('../../../util/fs');
+
describe('modules/manager/nix/extract', () => {
- it('returns null when no nixpkgs', () => {
- const content = `{
- inputs = {};
-}`;
- const res = extractPackageFile(content);
+ const flake1Lock = `{
+ "nodes": {
+ "root": {}
+ },
+ "root": "root",
+ "version": 7
+ }`;
+ const flake1Nix = `{
+ inputs = {};
+ }`;
- expect(res).toBeNull();
+ it('returns null when no nixpkgs input exists', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake1Lock);
+ expect(await extractPackageFile(flake1Nix, 'flake.nix')).toBeNull();
});
- it('returns nixpkgs', () => {
- const content = `{
- inputs = {
- nixpkgs.url = "github:nixos/nixpkgs/nixos-21.11";
- };
-}`;
+ const flake2Nix = `{
+ inputs = {
+ nixpkgs.url = "github:nixos/nixpkgs/nixos-21.11";
+ };
+ }`;
+
+ it('match nixpkgs input', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake1Lock);
+ expect(await extractPackageFile(flake2Nix, 'flake.nix')).toEqual({
+ deps: [
+ {
+ depName: 'nixpkgs',
+ currentValue: 'nixos-21.11',
+ datasource: GitRefsDatasource.id,
+ packageName: 'https://github.com/NixOS/nixpkgs',
+ versioning: nixpkgsVersioning,
+ },
+ ],
+ });
+ });
- const res = extractPackageFile(content);
+ const flake3Nix = `{
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs/nixos-21.11";
+ };
+ }`;
- expect(res?.deps).toEqual([
- {
- depName: 'nixpkgs',
- currentValue: 'nixos-21.11',
- datasource: GitRefsDatasource.id,
- packageName: 'https://github.com/NixOS/nixpkgs',
- versioning: nixpkgsVersioning,
+ it('match nixpkgs input case insensitive', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake1Lock);
+ expect(await extractPackageFile(flake3Nix, 'flake.nix')).toEqual({
+ deps: [
+ {
+ depName: 'nixpkgs',
+ currentValue: 'nixos-21.11',
+ datasource: GitRefsDatasource.id,
+ packageName: 'https://github.com/NixOS/nixpkgs',
+ versioning: nixpkgsVersioning,
+ },
+ ],
+ });
+ });
+
+ const flake4Nix = `{
+ inputs = {
+ nixpkgs.url = "github:NixOS/nixpkgs";
+ };
+ }`;
+
+ it('includes nixpkgs input with no explicit ref', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake1Lock);
+ expect(await extractPackageFile(flake4Nix, 'flake.nix')).toEqual({
+ deps: [
+ {
+ currentValue: undefined,
+ datasource: 'git-refs',
+ depName: 'nixpkgs',
+ packageName: 'https://github.com/NixOS/nixpkgs',
+ versioning: 'nixpkgs',
+ },
+ ],
+ });
+ });
+
+ it('returns null when no inputs', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake1Lock);
+ expect(await extractPackageFile('', 'flake.nix')).toBeNull();
+ });
+
+ const flake2Lock = `{
+ "nodes": {
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1720031269,
+ "narHash": "sha256-rwz8NJZV+387rnWpTYcXaRNvzUSnnF9aHONoJIYmiUQ=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "9f4128e00b0ae8ec65918efeba59db998750ead6",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
},
- ]);
+ "root": {
+ "inputs": {
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+ }`;
+
+ it('returns nixpkgs input', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake2Lock);
+ expect(await extractPackageFile('', 'flake.nix')).toEqual({
+ deps: [
+ {
+ depName: 'nixpkgs',
+ currentDigest: '9f4128e00b0ae8ec65918efeba59db998750ead6',
+ currentValue: 'nixos-unstable',
+ datasource: GitRefsDatasource.id,
+ packageName: 'https://github.com/NixOS/nixpkgs',
+ },
+ ],
+ });
});
- it('is case insensitive', () => {
- const content = `{
- inputs = {
- nixpkgs.url = "github:NixOS/nixpkgs/nixos-21.11";
- };
-}`;
+ const flake3Lock = `{
+ "nodes": {
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1728650607,
+ "narHash": "sha256-0lOnVTzRXzpk5uxbHLm3Ti3tyPAvirAIQDfwEUd8arg=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "612ee628421ba2c1abca4c99684862f76cb3b089",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+ }`;
- const res = extractPackageFile(content);
+ it('includes nixpkgs with no explicit ref', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake3Lock);
+ expect(await extractPackageFile('', 'flake.nix')).toMatchObject({
+ deps: [
+ {
+ currentDigest: '612ee628421ba2c1abca4c99684862f76cb3b089',
+ datasource: 'git-refs',
+ depName: 'nixpkgs',
+ packageName: 'https://github.com/NixOS/nixpkgs',
+ },
+ ],
+ });
+ });
- expect(res?.deps).toEqual([
- {
- depName: 'nixpkgs',
- currentValue: 'nixos-21.11',
- datasource: GitRefsDatasource.id,
- packageName: 'https://github.com/NixOS/nixpkgs',
- versioning: nixpkgsVersioning,
+ const flake4Lock = `{
+ "nodes": {
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1672057183,
+ "narHash": "sha256-GN7/10DNNvs1FPj9tlZA2qgNdFuYKKuS3qlHTqAxasQ=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "b139e44d78c36c69bcbb825b20dbfa51e7738347",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "ref": "nixpkgs-unstable",
+ "type": "indirect"
+ }
},
- ]);
+ "patchelf": {
+ "inputs": {
+ "nixpkgs": "nixpkgs"
+ },
+ "locked": {
+ "lastModified": 1718457448,
+ "narHash": "sha256-FSoxTcRZMGHNJh8dNtKOkcUtjhmhU6yQXcZZfUPLhQM=",
+ "ref": "refs/heads/master",
+ "rev": "a0f54334df36770b335c051e540ba40afcbf8378",
+ "revCount": 844,
+ "type": "git",
+ "url": "https://github.com/NixOS/patchelf.git"
+ },
+ "original": {
+ "type": "git",
+ "url": "https://github.com/NixOS/patchelf.git"
+ }
+ },
+ "root": {
+ "inputs": {
+ "patchelf": "patchelf"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+ }`;
+
+ it('includes patchelf from HEAD', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake4Lock);
+ expect(await extractPackageFile('', 'flake.nix')).toMatchObject({
+ deps: [
+ {
+ currentDigest: 'a0f54334df36770b335c051e540ba40afcbf8378',
+ datasource: 'git-refs',
+ depName: 'patchelf',
+ packageName: 'https://github.com/NixOS/patchelf.git',
+ },
+ ],
+ });
});
- it('includes nixpkgs with no explicit ref', () => {
- const content = `{
- inputs = {
- nixpkgs.url = "github:NixOS/nixpkgs";
- };
-}`;
+ const flake5Lock = `{
+ "nodes": {
+ "ijq": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1723569650,
+ "narHash": "sha256-Ho/sAhEUeSug52JALgjrKVUPCBe8+PovbJj/lniKxp8=",
+ "owner": "~gpanders",
+ "repo": "ijq",
+ "rev": "88f0d9ae98942bf49cba302c42b2a0f6e05f9b58",
+ "type": "sourcehut"
+ },
+ "original": {
+ "owner": "~gpanders",
+ "repo": "ijq",
+ "type": "sourcehut"
+ }
+ },
+ "root": {
+ "inputs": {
+ "ijq": "ijq"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+ }`;
- const res = extractPackageFile(content);
+ it('includes ijq from sourcehut without a flake', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake5Lock);
+ expect(await extractPackageFile('', 'flake.nix')).toMatchObject({
+ deps: [
+ {
+ currentDigest: '88f0d9ae98942bf49cba302c42b2a0f6e05f9b58',
+ datasource: 'git-refs',
+ depName: 'ijq',
+ packageName: 'https://git.sr.ht/~gpanders/ijq',
+ },
+ ],
+ });
+ });
- expect(res).toMatchObject({
+ const flake6Lock = `{
+ "nodes": {
+ "home-manager": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1728650932,
+ "narHash": "sha256-mGKzqdsRyLnGNl6WjEr7+sghGgBtYHhJQ4mjpgRTCsU=",
+ "owner": "rycee",
+ "repo": "home-manager",
+ "rev": "65ae9c147349829d3df0222151f53f79821c5134",
+ "type": "gitlab"
+ },
+ "original": {
+ "owner": "rycee",
+ "repo": "home-manager",
+ "type": "gitlab"
+ }
+ },
+ "root": {
+ "inputs": {
+ "home-manager": "home-manager"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+ }`;
+
+ it('includes home-manager from gitlab', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake6Lock);
+ expect(await extractPackageFile('', 'flake.nix')).toMatchObject({
deps: [
{
- currentValue: undefined,
+ currentDigest: '65ae9c147349829d3df0222151f53f79821c5134',
+ datasource: 'git-refs',
+ depName: 'home-manager',
+ packageName: 'https://gitlab.com/rycee/home-manager',
+ },
+ ],
+ });
+ });
+
+ const flake7Lock = `{
+ "nodes": {
+ "root": {}
+ },
+ "root": "root",
+ "version": 6
+ }`;
+
+ it('test other version', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake7Lock);
+ expect(await extractPackageFile('', 'flake.nix')).toBeNull();
+ });
+
+ const flake8Lock = `{
+ "nodes": {
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1728492678,
+ "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=",
+ "ref": "nixos-unstable",
+ "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7",
+ "shallow": true,
+ "type": "git",
+ "url": "https://github.com/NixOS/nixpkgs"
+ },
+ "original": {
+ "ref": "nixos-unstable",
+ "shallow": true,
+ "type": "git",
+ "url": "https://github.com/NixOS/nixpkgs"
+ }
+ },
+ "root": {
+ "inputs": {
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+ }`;
+
+ it('includes nixpkgs with ref and shallow arguments', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake8Lock);
+ expect(await extractPackageFile('', 'flake.nix')).toMatchObject({
+ deps: [
+ {
+ currentDigest: '5633bcff0c6162b9e4b5f1264264611e950c8ec7',
datasource: 'git-refs',
depName: 'nixpkgs',
packageName: 'https://github.com/NixOS/nixpkgs',
- versioning: 'nixpkgs',
+ },
+ ],
+ });
+ });
+
+ const flake9Lock = `{
+ "nodes": {
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1728538411,
+ "narHash": "sha256-f0SBJz1eZ2yOuKUr5CA9BHULGXVSn6miBuUWdTyhUhU=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "b69de56fac8c2b6f8fd27f2eca01dcda8e0a4221",
+ "type": "github"
+ },
+ "original": {
+ "id": "nixpkgs",
+ "type": "indirect"
+ }
+ },
+ "root": {
+ "inputs": {
+ "nixpkgs": "nixpkgs"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+ }`;
+
+ it('includes nixpkgs but using indirect type that cannot be updated', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake9Lock);
+ expect(await extractPackageFile('', 'flake.nix')).toBeNull();
+ });
+
+ const flake10Lock = `{
+ "nodes": {
+ "flake-utils": {
+ "inputs": {
+ "systems": "systems"
+ },
+ "locked": {
+ "lastModified": 1726560853,
+ "narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "flake-utils",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1728492678,
+ "narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs-extra-pkgs": {
+ "inputs": {
+ "flake-utils": "flake-utils",
+ "nixpkgs": "nixpkgs"
+ },
+ "locked": {
+ "host": "github.corp.example.com",
+ "lastModified": 1728666512,
+ "narHash": "sha256-p+l16Zzyl2DXG695yks6KQP7NkjsnEksu5GBvtL1QYg=",
+ "owner": "my-org",
+ "repo": "nixpkgs-extra-pkgs",
+ "rev": "6bf2706348447df6f8b86b1c3e54f87b0afda84f",
+ "type": "github"
+ },
+ "original": {
+ "host": "github.corp.example.com",
+ "owner": "my-org",
+ "repo": "nixpkgs-extra-pkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "nixpkgs-extra-pkgs": "nixpkgs-extra-pkgs"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+ }`;
+
+ it('includes flake from GitHub Enterprise', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake10Lock);
+ expect(await extractPackageFile('', 'flake.nix')).toMatchObject({
+ deps: [
+ {
+ currentDigest: '6bf2706348447df6f8b86b1c3e54f87b0afda84f',
+ datasource: 'git-refs',
+ depName: 'nixpkgs-extra-pkgs',
+ packageName:
+ 'https://github.corp.example.com/my-org/nixpkgs-extra-pkgs',
+ },
+ ],
+ });
+ });
+
+ const flake11Lock = `{
+ "nodes": {
+ "data-mesher": {
+ "inputs": {
+ "flake-parts": "flake-parts",
+ "nixpkgs": "nixpkgs",
+ "treefmt-nix": "treefmt-nix"
+ },
+ "locked": {
+ "lastModified": 1727355895,
+ "narHash": "sha256-grZIaLgk5GgoDuTt49RTCLBh458H4YJdIAU4B3onXRw=",
+ "rev": "c7e39452affcc0f89e023091524e38b3aaf109e9",
+ "type": "tarball",
+ "url": "https://git.clan.lol/api/v1/repos/clan/data-mesher/archive/c7e39452affcc0f89e023091524e38b3aaf109e9.tar.gz"
+ },
+ "original": {
+ "type": "tarball",
+ "url": "https://git.clan.lol/clan/data-mesher/archive/main.tar.gz"
+ }
+ },
+ "flake-parts": {
+ "inputs": {
+ "nixpkgs-lib": [
+ "data-mesher",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1726153070,
+ "narHash": "sha256-HO4zgY0ekfwO5bX0QH/3kJ/h4KvUDFZg8YpkNwIbg1U=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "bcef6817a8b2aa20a5a6dbb19b43e63c5bf8619a",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1726871744,
+ "narHash": "sha256-V5LpfdHyQkUF7RfOaDPrZDP+oqz88lTJrMT1+stXNwo=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "a1d92660c6b3b7c26fb883500a80ea9d33321be2",
+ "type": "github"
+ },
+ "original": {
+ "owner": "NixOS",
+ "ref": "nixpkgs-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "data-mesher": "data-mesher"
+ }
+ },
+ "treefmt-nix": {
+ "inputs": {
+ "nixpkgs": [
+ "data-mesher",
+ "nixpkgs"
+ ]
+ },
+ "locked": {
+ "lastModified": 1726734507,
+ "narHash": "sha256-VUH5O5AcOSxb0uL/m34dDkxFKP6WLQ6y4I1B4+N3L2w=",
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "rev": "ee41a466c2255a3abe6bc50fc6be927cdee57a9f",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+ }`;
+
+ it('includes flake with tarball type', async () => {
+ fs.readLocalFile.mockResolvedValueOnce(flake11Lock);
+ expect(await extractPackageFile('', 'flake.nix')).toMatchObject({
+ deps: [
+ {
+ currentDigest: 'c7e39452affcc0f89e023091524e38b3aaf109e9',
+ datasource: 'git-refs',
+ depName: 'data-mesher',
+ packageName: 'https://git.clan.lol/clan/data-mesher',
},
],
});
diff --git a/lib/modules/manager/nix/extract.ts b/lib/modules/manager/nix/extract.ts
index 5170e23a07dfe0..cfe99ead002906 100644
--- a/lib/modules/manager/nix/extract.ts
+++ b/lib/modules/manager/nix/extract.ts
@@ -1,11 +1,28 @@
+import { logger } from '../../../logger';
+import { getSiblingFileName, readLocalFile } from '../../../util/fs';
import { regEx } from '../../../util/regex';
import { GitRefsDatasource } from '../../datasource/git-refs';
import { id as nixpkgsVersioning } from '../../versioning/nixpkgs';
import type { PackageDependency, PackageFileContent } from '../types';
+import { NixFlakeLock } from './schema';
const nixpkgsRegex = regEx(/"github:nixos\/nixpkgs(\/(?[[a-z0-9-.]+))?"/i);
-export function extractPackageFile(content: string): PackageFileContent | null {
+// as documented upstream
+// https://github.com/NixOS/nix/blob/master/doc/manual/source/protocols/tarball-fetcher.md#gitea-and-forgejo-support
+const lockableHTTPTarballProtocol = regEx(
+ '^https://(?[^/]+)/(?[^/]+)/(?[^/]+)/archive/(?.+).tar.gz$',
+);
+
+export async function extractPackageFile(
+ content: string,
+ packageFile: string,
+): Promise {
+ const packageLockFile = getSiblingFileName(packageFile, 'flake.lock');
+ const lockContents = await readLocalFile(packageLockFile, 'utf8');
+
+ logger.trace(`nix.extractPackageFile(${packageLockFile})`);
+
const deps: PackageDependency[] = [];
const match = nixpkgsRegex.exec(content);
@@ -20,6 +37,118 @@ export function extractPackageFile(content: string): PackageFileContent | null {
});
}
+ const flakeLockParsed = NixFlakeLock.safeParse(lockContents);
+ if (!flakeLockParsed.success) {
+ logger.debug(
+ { packageLockFile, error: flakeLockParsed.error },
+ `invalid flake.lock file`,
+ );
+ return null;
+ }
+
+ const flakeLock = flakeLockParsed.data;
+ const rootInputs = flakeLock.nodes['root'].inputs;
+
+ if (!rootInputs) {
+ logger.debug(
+ { packageLockFile, error: flakeLockParsed.error },
+ `flake.lock is missing "root" node`,
+ );
+
+ if (deps.length) {
+ return { deps };
+ }
+ return null;
+ }
+
+ for (const [depName, flakeInput] of Object.entries(flakeLock.nodes)) {
+ // the root input is a magic string for the entrypoint and only references other flake inputs
+ if (depName === 'root') {
+ continue;
+ }
+
+ // skip all locked and transitivie nodes as they cannot be updated by regular means
+ if (!(depName in rootInputs)) {
+ continue;
+ }
+
+ const flakeLocked = flakeInput.locked;
+ const flakeOriginal = flakeInput.original;
+
+ // istanbul ignore if: if we are not in a root node then original and locked always exist which cannot be easily expressed in the type
+ if (flakeLocked === undefined || flakeOriginal === undefined) {
+ logger.debug(
+ { packageLockFile, flakeInput },
+ `Found empty flake input, skipping`,
+ );
+ continue;
+ }
+
+ // indirect inputs cannot be reliable updated because they depend on the flake registry
+ if (flakeOriginal.type === 'indirect') {
+ continue;
+ }
+
+ switch (flakeLocked.type) {
+ case 'github':
+ deps.push({
+ depName,
+ currentValue: flakeOriginal.ref,
+ currentDigest: flakeLocked.rev,
+ datasource: GitRefsDatasource.id,
+ packageName: `https://${flakeOriginal.host ?? 'github.com'}/${flakeOriginal.owner}/${flakeOriginal.repo}`,
+ });
+ break;
+ case 'gitlab':
+ deps.push({
+ depName,
+ currentValue: flakeOriginal.ref,
+ currentDigest: flakeLocked.rev,
+ datasource: GitRefsDatasource.id,
+ packageName: `https://${flakeOriginal.host ?? 'gitlab.com'}/${flakeOriginal.owner}/${flakeOriginal.repo}`,
+ });
+ break;
+ case 'git':
+ deps.push({
+ depName,
+ currentValue: flakeOriginal.ref,
+ currentDigest: flakeLocked.rev,
+ datasource: GitRefsDatasource.id,
+ packageName: flakeOriginal.url,
+ });
+ break;
+ case 'sourcehut':
+ deps.push({
+ depName,
+ currentValue: flakeOriginal.ref,
+ currentDigest: flakeLocked.rev,
+ datasource: GitRefsDatasource.id,
+ packageName: `https://${flakeOriginal.host ?? 'git.sr.ht'}/${flakeOriginal.owner}/${flakeOriginal.repo}`,
+ });
+ break;
+ case 'tarball':
+ deps.push({
+ depName,
+ currentValue: flakeLocked.ref,
+ currentDigest: flakeLocked.rev,
+ datasource: GitRefsDatasource.id,
+ // type tarball always contains this link
+ packageName: flakeOriginal.url!.replace(
+ lockableHTTPTarballProtocol,
+ 'https://$/$/$',
+ ),
+ });
+ break;
+ // istanbul ignore next: just a safeguard
+ default:
+ logger.debug(
+ { packageLockFile },
+ `Unknown flake.lock type "${flakeLocked.type}", skipping`,
+ );
+ break;
+ }
+ }
+
if (deps.length) {
return { deps };
}
diff --git a/lib/modules/manager/nix/index.ts b/lib/modules/manager/nix/index.ts
index 35fa06494f17eb..abbe3e6ec3e84f 100644
--- a/lib/modules/manager/nix/index.ts
+++ b/lib/modules/manager/nix/index.ts
@@ -9,7 +9,7 @@ export const url = 'https://nix.dev';
export const defaultConfig = {
fileMatch: ['(^|/)flake\\.nix$'],
- commitMessageTopic: 'nixpkgs',
+ commitMessageTopic: 'nix',
commitMessageExtra: 'to {{newValue}}',
enabled: false,
};
diff --git a/lib/modules/manager/nix/readme.md b/lib/modules/manager/nix/readme.md
index 3a196a34445c0e..af3d80c5b0b05e 100644
--- a/lib/modules/manager/nix/readme.md
+++ b/lib/modules/manager/nix/readme.md
@@ -1,4 +1,9 @@
The [`nix`](https://github.com/NixOS/nix) manager supports:
- [`lockFileMaintenance`](../../../configuration-options.md#lockfilemaintenance) updates for `flake.lock`
-- [nixpkgs](https://github.com/NixOS/nixpkgs) updates
+- input updates for `flake.lock`
+
+For specifying `packageRules` it is important to know how `depName` and `packageName` are defined for nix updates:
+
+- The `depName` field is equal to the nix flake input name, eg. `nix.inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";` would have the `depName` of `nixpkgs`
+- The `packageName` field is equal to the fully-qualified root URL of the package source, eg. `https://github.com/NixOS/nixpkgs` for the above example.
diff --git a/lib/modules/manager/nix/schema.ts b/lib/modules/manager/nix/schema.ts
new file mode 100644
index 00000000000000..af8e0e33e95dbf
--- /dev/null
+++ b/lib/modules/manager/nix/schema.ts
@@ -0,0 +1,41 @@
+import { z } from 'zod';
+import { Json } from '../../../util/schema-utils';
+
+const InputType = z.enum([
+ 'git',
+ 'github',
+ 'gitlab',
+ 'indirect',
+ 'sourcehut',
+ 'tarball',
+]);
+
+const LockedInput = z.object({
+ ref: z.string().optional(),
+ rev: z.string(),
+ type: InputType,
+});
+
+const OriginalInput = z.object({
+ host: z.string().optional(),
+ owner: z.string().optional(),
+ repo: z.string().optional(),
+ ref: z.string().optional(),
+ type: InputType,
+ url: z.string().optional(),
+});
+
+const NixInput = z.object({
+ inputs: z.record(z.string(), z.string().or(z.array(z.string()))).optional(),
+ locked: LockedInput.optional(),
+ original: OriginalInput.optional(),
+});
+
+export const NixFlakeLock = Json.pipe(
+ z.object({
+ nodes: z.record(z.string(), NixInput),
+ version: z.literal(7),
+ }),
+);
+
+export type NixFlakeLock = z.infer;
diff --git a/lib/modules/manager/types.ts b/lib/modules/manager/types.ts
index 0937191789a0b6..28ede22bda9518 100644
--- a/lib/modules/manager/types.ts
+++ b/lib/modules/manager/types.ts
@@ -71,6 +71,7 @@ export interface PackageFileContent>
skipInstalls?: boolean | null;
matchStrings?: string[];
matchStringsStrategy?: MatchStringsStrategy;
+ fileFormat?: string;
}
export interface PackageFile>
diff --git a/lib/modules/platform/gitlab/index.spec.ts b/lib/modules/platform/gitlab/index.spec.ts
index 6eb62b886f7c40..6d1176dbcbbc4e 100644
--- a/lib/modules/platform/gitlab/index.spec.ts
+++ b/lib/modules/platform/gitlab/index.spec.ts
@@ -51,6 +51,7 @@ describe('modules/platform/gitlab/index', () => {
token: '123test',
});
delete process.env.GITLAB_IGNORE_REPO_URL;
+ delete process.env.RENOVATE_X_GITLAB_BRANCH_STATUS_CHECK_ATTEMPTS;
delete process.env.RENOVATE_X_GITLAB_BRANCH_STATUS_DELAY;
delete process.env.RENOVATE_X_GITLAB_AUTO_MERGEABLE_CHECK_ATTEMPS;
delete process.env.RENOVATE_X_GITLAB_MERGE_REQUEST_DELAY;
@@ -1058,6 +1059,51 @@ describe('modules/platform/gitlab/index', () => {
describe('setBranchStatus', () => {
const states: BranchStatus[] = ['green', 'yellow', 'red'];
+ it('should log message that branch commit SHA not found', async () => {
+ git.getBranchCommit.mockReturnValue(null);
+ await gitlab.setBranchStatus({
+ branchName: 'some-branch',
+ context: 'some-context',
+ description: 'some-description',
+ state: 'green',
+ url: 'some-url',
+ });
+ expect(logger.warn).toHaveBeenCalledWith(
+ 'Failed to get the branch commit SHA',
+ );
+ });
+
+ it('should log message that failed to retrieve commit pipeline', async () => {
+ const scope = await initRepo();
+ scope
+ .post(
+ '/api/v4/projects/some%2Frepo/statuses/0d9c7726c3d628b7e28af234595cfd20febdbf8e',
+ )
+ .reply(200, {})
+ .get(
+ '/api/v4/projects/some%2Frepo/repository/commits/0d9c7726c3d628b7e28af234595cfd20febdbf8e/statuses',
+ )
+ .reply(200, [])
+ .get(
+ '/api/v4/projects/some%2Frepo/repository/commits/0d9c7726c3d628b7e28af234595cfd20febdbf8e',
+ )
+ .reply(200, {});
+
+ timers.setTimeout.mockImplementation(() => {
+ throw new Error();
+ });
+ await gitlab.setBranchStatus({
+ branchName: 'some-branch',
+ context: 'some-context',
+ description: 'some-description',
+ state: 'green',
+ url: 'some-url',
+ });
+ expect(logger.warn).toHaveBeenCalledWith(
+ 'Failed to retrieve commit pipeline',
+ );
+ });
+
it.each(states)('sets branch status %s', async (state) => {
const scope = await initRepo();
scope
@@ -1072,7 +1118,8 @@ describe('modules/platform/gitlab/index', () => {
.get(
'/api/v4/projects/some%2Frepo/repository/commits/0d9c7726c3d628b7e28af234595cfd20febdbf8e',
)
- .reply(200, []);
+ .times(3)
+ .reply(200, {});
await expect(
gitlab.setBranchStatus({
@@ -1099,7 +1146,8 @@ describe('modules/platform/gitlab/index', () => {
.get(
'/api/v4/projects/some%2Frepo/repository/commits/0d9c7726c3d628b7e28af234595cfd20febdbf8e',
)
- .reply(200, []);
+ .times(3)
+ .reply(200, {});
await gitlab.setBranchStatus({
branchName: 'some-branch',
@@ -1109,7 +1157,7 @@ describe('modules/platform/gitlab/index', () => {
url: 'some-url',
});
- expect(timers.setTimeout.mock.calls).toHaveLength(1);
+ expect(timers.setTimeout.mock.calls).toHaveLength(3);
expect(timers.setTimeout.mock.calls[0][0]).toBe(1000);
});
@@ -1131,6 +1179,10 @@ describe('modules/platform/gitlab/index', () => {
.get(
'/api/v4/projects/some%2Frepo/repository/commits/0d9c7726c3d628b7e28af234595cfd20febdbf8e',
)
+ .reply(200, {})
+ .get(
+ '/api/v4/projects/some%2Frepo/repository/commits/0d9c7726c3d628b7e28af234595cfd20febdbf8e',
+ )
.reply(200, { last_pipeline: { id: 123 } });
await expect(
@@ -1146,6 +1198,7 @@ describe('modules/platform/gitlab/index', () => {
it('waits for RENOVATE_X_GITLAB_BRANCH_STATUS_DELAY ms when set', async () => {
const delay = 5000;
+ const retry = 2;
process.env.RENOVATE_X_GITLAB_BRANCH_STATUS_DELAY = String(delay);
const scope = await initRepo();
@@ -1161,7 +1214,50 @@ describe('modules/platform/gitlab/index', () => {
.get(
'/api/v4/projects/some%2Frepo/repository/commits/0d9c7726c3d628b7e28af234595cfd20febdbf8e',
)
- .reply(200, []);
+ .times(3)
+ .reply(200, {});
+
+ await gitlab.setBranchStatus({
+ branchName: 'some-branch',
+ context: 'some-context',
+ description: 'some-description',
+ state: 'green',
+ url: 'some-url',
+ });
+
+ expect(timers.setTimeout.mock.calls).toHaveLength(retry + 1);
+ expect(timers.setTimeout.mock.calls[0][0]).toBe(delay);
+ expect(logger.debug).toHaveBeenCalledWith(
+ `Pipeline not yet created. Retrying 1`,
+ );
+ expect(logger.debug).toHaveBeenCalledWith(
+ `Pipeline not yet created. Retrying 2`,
+ );
+ expect(logger.debug).toHaveBeenCalledWith(
+ `Pipeline not yet created after 3 attempts`,
+ );
+ });
+
+ it('do RENOVATE_X_GITLAB_BRANCH_STATUS_CHECK_ATTEMPTS attemps when set', async () => {
+ const delay = 1000;
+ const retry = 5;
+ process.env.RENOVATE_X_GITLAB_BRANCH_STATUS_CHECK_ATTEMPTS = `${retry}`;
+
+ const scope = await initRepo();
+ scope
+ .post(
+ '/api/v4/projects/some%2Frepo/statuses/0d9c7726c3d628b7e28af234595cfd20febdbf8e',
+ )
+ .reply(200, {})
+ .get(
+ '/api/v4/projects/some%2Frepo/repository/commits/0d9c7726c3d628b7e28af234595cfd20febdbf8e/statuses',
+ )
+ .reply(200, [])
+ .get(
+ '/api/v4/projects/some%2Frepo/repository/commits/0d9c7726c3d628b7e28af234595cfd20febdbf8e',
+ )
+ .times(retry + 1)
+ .reply(200, {});
await gitlab.setBranchStatus({
branchName: 'some-branch',
@@ -1171,7 +1267,7 @@ describe('modules/platform/gitlab/index', () => {
url: 'some-url',
});
- expect(timers.setTimeout.mock.calls).toHaveLength(1);
+ expect(timers.setTimeout.mock.calls).toHaveLength(retry + 1);
expect(timers.setTimeout.mock.calls[0][0]).toBe(delay);
});
});
diff --git a/lib/modules/platform/gitlab/index.ts b/lib/modules/platform/gitlab/index.ts
index 64ed26afd3a3d1..20e5b1bb9ba134 100644
--- a/lib/modules/platform/gitlab/index.ts
+++ b/lib/modules/platform/gitlab/index.ts
@@ -994,9 +994,12 @@ export async function setBranchStatus({
}: BranchStatusConfig): Promise {
// First, get the branch commit SHA
const branchSha = git.getBranchCommit(branchName);
+ if (!branchSha) {
+ logger.warn('Failed to get the branch commit SHA');
+ return;
+ }
// Now, check the statuses for that commit
- // TODO: types (#22198)
- const url = `projects/${config.repository}/statuses/${branchSha!}`;
+ const url = `projects/${config.repository}/statuses/${branchSha}`;
let state = 'success';
if (renovateState === 'yellow') {
state = 'pending';
@@ -1013,21 +1016,38 @@ export async function setBranchStatus({
options.target_url = targetUrl;
}
- if (branchSha) {
- const commitUrl = `projects/${config.repository}/repository/commits/${branchSha}`;
- await gitlabApi
- .getJsonSafe(commitUrl, LastPipelineId)
- .onValue((pipelineId) => {
- options.pipeline_id = pipelineId;
- });
- }
+ const retryTimes = parseInteger(
+ process.env.RENOVATE_X_GITLAB_BRANCH_STATUS_CHECK_ATTEMPTS,
+ 2,
+ );
try {
- // give gitlab some time to create pipelines for the sha
- await setTimeout(
- parseInteger(process.env.RENOVATE_X_GITLAB_BRANCH_STATUS_DELAY, 1000),
- );
+ for (let attempt = 1; attempt <= retryTimes + 1; attempt += 1) {
+ const commitUrl = `projects/${config.repository}/repository/commits/${branchSha}`;
+ await gitlabApi
+ .getJsonSafe(commitUrl, { memCache: false }, LastPipelineId)
+ .onValue((pipelineId) => {
+ options.pipeline_id = pipelineId;
+ });
+ if (options.pipeline_id !== undefined) {
+ break;
+ }
+ if (attempt >= retryTimes + 1) {
+ logger.debug(`Pipeline not yet created after ${attempt} attempts`);
+ } else {
+ logger.debug(`Pipeline not yet created. Retrying ${attempt}`);
+ }
+ // give gitlab some time to create pipelines for the sha
+ await setTimeout(
+ parseInteger(process.env.RENOVATE_X_GITLAB_BRANCH_STATUS_DELAY, 1000),
+ );
+ }
+ } catch (err) {
+ logger.debug({ err });
+ logger.warn('Failed to retrieve commit pipeline');
+ }
+ try {
await gitlabApi.postJson(url, { body: options });
// update status cache
diff --git a/lib/modules/versioning/api.ts b/lib/modules/versioning/api.ts
index 454d0f631ade1a..10bae3b202c4cb 100644
--- a/lib/modules/versioning/api.ts
+++ b/lib/modules/versioning/api.ts
@@ -1,3 +1,4 @@
+import * as awsEksAddon from './aws-eks-addon';
import * as amazonMachineImage from './aws-machine-image';
import * as azureRestApi from './azure-rest-api';
import * as bazelModule from './bazel-module';
@@ -45,6 +46,7 @@ import * as unity3d from './unity3d';
const api = new Map();
export default api;
+api.set(awsEksAddon.id, awsEksAddon.api);
api.set(amazonMachineImage.id, amazonMachineImage.api);
api.set(azureRestApi.id, azureRestApi.api);
api.set(bazelModule.id, bazelModule.api);
diff --git a/lib/modules/versioning/aws-eks-addon/index.spec.ts b/lib/modules/versioning/aws-eks-addon/index.spec.ts
new file mode 100644
index 00000000000000..f7c559ae87da0f
--- /dev/null
+++ b/lib/modules/versioning/aws-eks-addon/index.spec.ts
@@ -0,0 +1,146 @@
+import aws from '.';
+
+describe('modules/versioning/aws-eks-addon/index', () => {
+ describe('parse(version)', () => {
+ it('should return 1.23.7 and release version', () => {
+ expect(aws.getMajor('v1.20.7-eksbuild.1')).toBe(1);
+ expect(aws.getMinor('v1.23.7-eksbuild.1')).toBe(23);
+ expect(aws.getPatch('v1.20.7-eksbuild.1')).toBe(7);
+ });
+ });
+
+ describe('isValid(version)', () => {
+ it.each`
+ input | expected
+ ${''} | ${false}
+ ${'.1..'} | ${false}
+ ${'abrakadabra'} | ${false}
+ ${'v1'} | ${false}
+ ${'v1.'} | ${false}
+ ${'v1...-eksbuild.1'} | ${false}
+ ${'v1-eksbuild.1'} | ${false}
+ ${'v1.a-eksbuild.1'} | ${false}
+ ${'v1.23-eksbuild.1'} | ${false}
+ ${'1.23.1-eksbuild.a'} | ${false}
+ ${'v1.11.7'} | ${false}
+ ${'v1.11.7.6'} | ${false}
+ ${'v1.11.7-noneksbuild'} | ${false}
+ ${'v1.11.7-noneksbuild.1'} | ${false}
+ ${'v1.11.7-eksbuild'} | ${false}
+ ${'v1.11.7.3-eksbuild.1'} | ${false}
+ ${'v1.23.1-eksbuild.1'} | ${true}
+ ${'1.23.1-eksbuild.1'} | ${true}
+ ${'v1.23.1-eksbuild.11'} | ${true}
+ `('isValid("$input") === $expected', ({ input, expected }) => {
+ const actual = aws.isValid(input);
+ expect(actual).toBe(expected);
+ });
+ });
+
+ describe('isVersion(version)', () => {
+ it.each`
+ input | expected
+ ${''} | ${false}
+ ${'abrakadabra'} | ${false}
+ ${'v1'} | ${false}
+ ${'v1.'} | ${false}
+ ${'v1-eksbuild.1'} | ${false}
+ ${'v1.a-eksbuild.1'} | ${false}
+ ${'v1.23-eksbuild.1'} | ${false}
+ ${'1.23.1-eksbuild.a'} | ${false}
+ ${'v1.11.7'} | ${false}
+ ${'v1.11.7.6'} | ${false}
+ ${'v1.11.7-noneksbuild'} | ${false}
+ ${'v1.11.7-noneksbuild.1'} | ${false}
+ ${'v1.11.7-eksbuild'} | ${false}
+ ${'v1.11.7.3-eksbuild.1'} | ${false}
+ ${'v1.23.1-eksbuild.1'} | ${true}
+ ${'1.23.1-eksbuild.1'} | ${true}
+ ${'v1.23.1-eksbuild.11'} | ${true}
+ `('isValid("$input") === $expected', ({ input, expected }) => {
+ const actual = aws.isVersion(input);
+ expect(actual).toBe(expected);
+ });
+ });
+
+ describe('isCompatible(version)', () => {
+ it.each`
+ input | expected
+ ${''} | ${false}
+ ${'abrakadabra'} | ${false}
+ ${'v1'} | ${false}
+ ${'v1.'} | ${false}
+ ${'v1-eksbuild.1'} | ${false}
+ ${'v1.a-eksbuild.1'} | ${false}
+ ${'v1.23-eksbuild.1'} | ${false}
+ ${'1.23.1-eksbuild.1'} | ${false}
+ ${'1.23.1-eksbuild.a'} | ${false}
+ ${'v1.11.7'} | ${false}
+ ${'v1.11.7.6'} | ${false}
+ ${'v1.11.7-noneksbuild'} | ${false}
+ ${'v1.11.7-noneksbuild.1'} | ${false}
+ ${'v1.11.7-eksbuild'} | ${false}
+ ${'v1.11.7.3-eksbuild.1'} | ${false}
+ `('isCompatible("$input") === $expected', ({ input, expected }) => {
+ const actual = aws.isCompatible(input);
+ expect(actual).toBe(expected);
+ });
+ });
+
+ describe('isCompatible(version,range)', () => {
+ it.each`
+ version | current | expected
+ ${'1.23.1-eksbuild.1'} | ${'1.23.1-eksbuild.2'} | ${true}
+ ${'v1.23.1-eksbuild.1'} | ${'1.23.1-eksbuild.2'} | ${true}
+ ${'v1.23.1-eksbuild.1'} | ${'1.23.1-eksbuild.21'} | ${true}
+ ${'v1.11.7-eksbuild.1'} | ${'v1.11.7-noneksbuild.1'} | ${false}
+ ${'v1.11.7'} | ${'v1.11.7-noneksbuild.1'} | ${false}
+ ${'v1-eksbuild.1'} | ${'artful'} | ${false}
+ ${'v1.11.7.1-eksbuild.1'} | ${'v1.11.7-eksbuild.1'} | ${false}
+ `(
+ 'isCompatible($version, $current) === $expected',
+ ({ version, current, expected }) => {
+ const actual = aws.isCompatible(version, current);
+ expect(actual).toBe(expected);
+ },
+ );
+ });
+
+ describe('isGreaterThan(version1, version2)', () => {
+ it.each`
+ version | other | expected
+ ${'v1.11.7-eksbuild.1'} | ${'v1.11.7-eksbuild.0'} | ${true}
+ ${'v1.11.7-eksbuild.11'} | ${'v1.11.7-eksbuild.1'} | ${true}
+ ${'v1.22.7-eksbuild.2'} | ${'v1.20.7-eksbuild.1'} | ${true}
+ ${'v1.22.7-eksbuild.2'} | ${'v1.22.7'} | ${true}
+ ${'v1.20.7-eksbuild.1'} | ${'v2.0.0'} | ${true}
+ ${'v1.20.7-eksbuild.1'} | ${'v1.20.7-eksbuild.2'} | ${false}
+ ${'v1.20.6-eksbuild.1'} | ${'v1.20.7-eksbuild.2'} | ${false}
+ ${'v1.20.7-eksbuild.1'} | ${'v2.0.0-eksbuild.1'} | ${false}
+ `(
+ 'isGreaterThan($version, $other) === $expected',
+ ({ version, other, expected }) => {
+ const actual = aws.isGreaterThan(version, other);
+ expect(actual).toBe(expected);
+ },
+ );
+ });
+
+ it('getSatisfyingVersion', () => {
+ expect(
+ aws.getSatisfyingVersion(['v1.20.7-eksbuild.1'], 'v1.20.7-eksbuild.1'),
+ ).toBe('v1.20.7-eksbuild.1');
+ expect(
+ aws.getSatisfyingVersion(
+ ['v1.20.7-eksbuild.1', 'v1.20.7-eksbuild.2', 'v1.20.7-eksbuild.7'],
+ 'v1.20.7-eksbuild.3',
+ ),
+ ).toBeNull();
+ expect(
+ aws.getSatisfyingVersion(
+ ['v1.20.7-eksbuild.1', 'v1.20.7-eksbuild.2'],
+ 'v1.20.7-eksbuild.3',
+ ),
+ ).toBeNull();
+ });
+});
diff --git a/lib/modules/versioning/aws-eks-addon/index.ts b/lib/modules/versioning/aws-eks-addon/index.ts
new file mode 100644
index 00000000000000..c004bb1dc66ff6
--- /dev/null
+++ b/lib/modules/versioning/aws-eks-addon/index.ts
@@ -0,0 +1,20 @@
+import { RegExpVersioningApi } from '../regex';
+import type { VersioningApi } from '../types';
+
+export const id = 'aws-eks-addon';
+export const displayName = 'aws-eks-addon';
+export const urls = [];
+export const supportsRanges = false;
+
+export class AwsEKSAddonVersioningApi extends RegExpVersioningApi {
+ static versionRegex =
+ '^v?(?\\d+)\\.(?\\d+)\\.(?\\d+)(?-eksbuild\\.)(?\\d+)$';
+
+ public constructor() {
+ super(AwsEKSAddonVersioningApi.versionRegex);
+ }
+}
+
+export const api: VersioningApi = new AwsEKSAddonVersioningApi();
+
+export default api;
diff --git a/lib/modules/versioning/aws-eks-addon/readme.md b/lib/modules/versioning/aws-eks-addon/readme.md
new file mode 100644
index 00000000000000..4b1fbc6fdaae6a
--- /dev/null
+++ b/lib/modules/versioning/aws-eks-addon/readme.md
@@ -0,0 +1,18 @@
+AWS versioning syntax is used for EKS Addon updates.
+
+It is based off [Semantic Versioning 2.0](https://semver.org) but with a subset of addon `build metadata` syntax.
+
+At the moment every ESK Addon that matches the regex `^v?\d+\.\d+\.\d+-eksbuild\.\d+$` is considered a valid "release".
+
+**Key Points about EKS Addon Versioning**
+
+1. Versioning Scheme: Add-ons typically follow a semantic versioning scheme (e.g., Major.Minor.Patch). This helps in understanding the significance of changes between versions:
+
+ - `Major`: Indicates significant changes or breaking API changes for plugin version.
+ - `Minor`: Introduces new features or enhancements for plugin version.
+ - `Patch`: Includes bug fixes and minor improvements for plugin version.
+ - `Build Metadata` : It helps differentiate this particular release from others that might have been built independently.
+
+2. Default Versions: When creating a new EKS cluster, AWS often selects a default version for each addon based on the cluster's Kubernetes version and other factors. This default version is usually the most stable and recommended for the specific cluster configuration
+
+3. Build metadata. Example `eksbuild.1`. The `eksbuild.1` part signifies a specific build or release within the `1.19.0` version, likely managed by the EKS build system. It helps differentiate this particular release from others that might have been built independently. The build metadata provides additional context about the specific release, which can be useful for tracking and troubleshooting.
diff --git a/lib/modules/versioning/versioning-metadata.spec.ts b/lib/modules/versioning/versioning-metadata.spec.ts
index 2e66857240749c..e7cd9705ecc383 100644
--- a/lib/modules/versioning/versioning-metadata.spec.ts
+++ b/lib/modules/versioning/versioning-metadata.spec.ts
@@ -1,42 +1,51 @@
-import { readFile, readdir } from 'fs-extra';
+import { readdirSync } from 'node:fs';
+import { readFile } from 'fs-extra';
describe('modules/versioning/versioning-metadata', () => {
- it('readme no markdown headers', async () => {
- const allVersioning = (await readdir('lib/modules/versioning')).filter(
- (item) => !item.includes('.'),
- );
- for (const versioning of allVersioning) {
- let readme: string | undefined;
+ const allVersioning = readdirSync('lib/modules/versioning', {
+ withFileTypes: true,
+ })
+ .filter((item) => item.isDirectory())
+ .map((item) => item.name);
+
+ describe.each(allVersioning)('%s', (versioning) => {
+ it('readme with no h1 or h2 markdown headers', async () => {
+ let readme = '';
try {
readme = await readFile(
- 'lib/modules/versioning/' + versioning + '/readme.md',
+ `lib/modules/versioning/${versioning}/readme.md`,
'utf8',
);
} catch {
// ignore missing file
}
- if (readme) {
- // eslint-disable-next-line jest/no-conditional-expect
- expect(RegExp(/(^|\n)#+ /).exec(readme)).toBeNull();
+ const lines = readme.split('\n');
+ let isCode = false;
+ const res: string[] = [];
+
+ for (const line of lines) {
+ if (line.startsWith('```')) {
+ isCode = !isCode;
+ } else if (!isCode) {
+ res.push(line);
+ }
}
- }
- });
- it('contains mandatory fields', async () => {
- const allVersioning = (await readdir('lib/modules/versioning')).filter(
- (item) => !item.includes('.') && !item.startsWith('_'),
- );
+ expect(
+ res.some((line) => line.startsWith('# ') || line.startsWith('## ')),
+ ).toBeFalse();
+ });
- for (const versioning of allVersioning) {
+ it('contains mandatory fields', async () => {
const versioningObj = await import(`./${versioning}`);
expect(versioningObj.id).toEqual(versioning);
expect(versioningObj.displayName).toBeDefined();
- expect(versioningObj.urls).toBeDefined();
- expect(versioningObj.supportsRanges).toBeDefined();
+ expect(versioningObj.urls).toBeArray();
+ expect(versioningObj.supportsRanges).toBeBoolean();
if (versioningObj.supportsRanges === true) {
// eslint-disable-next-line jest/no-conditional-expect
- expect(versioningObj.supportedRangeStrategies).toBeDefined();
+ expect(versioningObj.supportedRangeStrategies).toBeArrayOfStrings();
}
- }
+ });
});
});
diff --git a/lib/util/schema-utils.spec.ts b/lib/util/schema-utils.spec.ts
index ccca2f70b9e8e1..7561b17287c81f 100644
--- a/lib/util/schema-utils.spec.ts
+++ b/lib/util/schema-utils.spec.ts
@@ -1,5 +1,6 @@
import { codeBlock } from 'common-tags';
import { z } from 'zod';
+import { logger } from '../../test/util';
import {
Json,
Json5,
@@ -10,6 +11,9 @@ import {
Toml,
UtcDate,
Yaml,
+ multidocYaml,
+ withDebugMessage,
+ withTraceMessage,
} from './schema-utils';
describe('util/schema-utils', () => {
@@ -444,6 +448,26 @@ describe('util/schema-utils', () => {
});
});
+ describe('multidocYaml()', () => {
+ const Schema = multidocYaml().pipe(
+ z.array(
+ z.object({
+ foo: z.number(),
+ }),
+ ),
+ );
+
+ it('parses valid yaml', () => {
+ expect(
+ Schema.parse(codeBlock`
+ foo: 111
+ ---
+ foo: 222
+ `),
+ ).toEqual([{ foo: 111 }, { foo: 222 }]);
+ });
+ });
+
describe('Toml', () => {
const Schema = Toml.pipe(
z.object({ foo: z.object({ bar: z.literal('baz') }) }),
@@ -494,4 +518,34 @@ describe('util/schema-utils', () => {
});
});
});
+
+ describe('logging utils', () => {
+ it('logs debug message and returns fallback value', () => {
+ const Schema = z
+ .string()
+ .catch(withDebugMessage('default string', 'Debug message'));
+
+ const result = Schema.parse(42);
+
+ expect(result).toBe('default string');
+ expect(logger.logger.debug).toHaveBeenCalledWith(
+ { err: expect.any(z.ZodError) },
+ 'Debug message',
+ );
+ });
+
+ it('logs trace message and returns fallback value', () => {
+ const Schema = z
+ .string()
+ .catch(withTraceMessage('default string', 'Trace message'));
+
+ const result = Schema.parse(42);
+
+ expect(result).toBe('default string');
+ expect(logger.logger.trace).toHaveBeenCalledWith(
+ { err: expect.any(z.ZodError) },
+ 'Trace message',
+ );
+ });
+ });
});
diff --git a/lib/util/schema-utils.ts b/lib/util/schema-utils.ts
index 5acc34f01553b8..4143400106c921 100644
--- a/lib/util/schema-utils.ts
+++ b/lib/util/schema-utils.ts
@@ -2,9 +2,17 @@ import JSON5 from 'json5';
import * as JSONC from 'jsonc-parser';
import { DateTime } from 'luxon';
import type { JsonArray, JsonValue } from 'type-fest';
-import { type ZodEffects, type ZodType, type ZodTypeDef, z } from 'zod';
+import {
+ type ZodEffects,
+ type ZodString,
+ type ZodType,
+ type ZodTypeDef,
+ z,
+} from 'zod';
+import { logger } from '../logger';
import type { PackageDependency } from '../modules/manager/types';
import { parse as parseToml } from './toml';
+import type { YamlOptions } from './yaml';
import { parseSingleYaml, parseYaml } from './yaml';
interface ErrorContext {
@@ -256,6 +264,19 @@ export const MultidocYaml = z.string().transform((str, ctx): JsonArray => {
}
});
+export function multidocYaml(
+ opts?: Omit,
+): ZodEffects {
+ return z.string().transform((str, ctx): JsonArray => {
+ try {
+ return parseYaml(str, opts) as JsonArray;
+ } catch {
+ ctx.addIssue({ code: 'custom', message: 'Invalid YAML' });
+ return z.NEVER;
+ }
+ });
+}
+
export const Toml = z.string().transform((str, ctx) => {
try {
return parseToml(str);
@@ -278,3 +299,23 @@ export function withDepType<
return deps;
});
}
+
+export function withDebugMessage(
+ value: Output,
+ msg: string,
+): (ctx: { error: z.ZodError; input: Input }) => Output {
+ return ({ error: err }) => {
+ logger.debug({ err }, msg);
+ return value;
+ };
+}
+
+export function withTraceMessage(
+ value: Output,
+ msg: string,
+): (ctx: { error: z.ZodError; input: Input }) => Output {
+ return ({ error: err }) => {
+ logger.trace({ err }, msg);
+ return value;
+ };
+}
diff --git a/lib/util/yaml.ts b/lib/util/yaml.ts
index c0de0ede60feda..ff78f31db54246 100644
--- a/lib/util/yaml.ts
+++ b/lib/util/yaml.ts
@@ -11,7 +11,7 @@ import type { ZodType } from 'zod';
import { logger } from '../logger';
import { regEx } from './regex';
-interface YamlOptions<
+export interface YamlOptions<
ResT = unknown,
Schema extends ZodType = ZodType,
> extends ParseOptions,
@@ -28,7 +28,7 @@ interface YamlParseDocumentOptions
removeTemplates?: boolean;
}
-interface YamlOptionsMultiple<
+export interface YamlOptionsMultiple<
ResT = unknown,
Schema extends ZodType = ZodType,
> extends YamlOptions {
diff --git a/lib/workers/repository/process/libyear.spec.ts b/lib/workers/repository/process/libyear.spec.ts
index c8e32d80bb8e11..bf30b5ab9f4c28 100644
--- a/lib/workers/repository/process/libyear.spec.ts
+++ b/lib/workers/repository/process/libyear.spec.ts
@@ -18,6 +18,7 @@ describe('workers/repository/process/libyear', () => {
deps: [
{
depName: 'some/image',
+ datasource: 'docker',
currentVersion: '1.0.0',
updates: [{ newVersion: '2.0.0' }],
},
@@ -30,6 +31,7 @@ describe('workers/repository/process/libyear', () => {
deps: [
{
depName: 'dep1',
+ datasource: 'npm',
currentVersion: '0.1.0',
currentVersionTimestamp: '2019-07-01T00:00:00Z' as Timestamp,
updates: [
@@ -56,6 +58,7 @@ describe('workers/repository/process/libyear', () => {
{
depName: 'dep2',
currentVersion: '1.0.0',
+ datasource: 'rubygems',
currentVersionTimestamp: '2019-07-01T00:00:00Z' as Timestamp,
updates: [
{
@@ -67,6 +70,7 @@ describe('workers/repository/process/libyear', () => {
{
depName: 'dep3',
currentVersion: '1.0.0',
+ datasource: 'rubygems',
updates: [
{
newVersion: '2.0.0',
@@ -76,6 +80,8 @@ describe('workers/repository/process/libyear', () => {
},
{
depName: 'dep4',
+ datasource: 'rubygems',
+ currentValue: '1.0.0', // coverage
},
],
},
@@ -83,11 +89,14 @@ describe('workers/repository/process/libyear', () => {
};
calculateLibYears(packageFiles);
expect(logger.logger.debug).toHaveBeenCalledWith(
- 'No releaseTimestamp for some/image update to 2.0.0',
+ 'No currentVersionTimestamp for some/image',
);
expect(logger.logger.debug).toHaveBeenCalledWith(
'No releaseTimestamp for dep1 update to 3.0.0',
);
+ expect(logger.logger.debug).toHaveBeenCalledWith(
+ 'No currentVersionTimestamp for dep3',
+ );
expect(logger.logger.debug).toHaveBeenCalledWith(
{
managerLibYears: {
@@ -97,6 +106,83 @@ describe('workers/repository/process/libyear', () => {
},
// eslint-disable-next-line no-loss-of-precision
totalLibYears: 1.5027322404371585,
+ totalDepsCount: 5,
+ outdatedDepsCount: 4,
+ },
+ 'Repository libYears',
+ );
+ });
+
+ it('de-duplicates if same dep found in different files', () => {
+ // there are three package files with the same dependency + version but mixed datasources
+ const packageFiles = {
+ npm: [
+ {
+ packageFile: 'folder1/package.json',
+ deps: [
+ {
+ depName: 'dep1',
+ currentVersion: '0.1.0',
+ datasource: 'npm',
+ currentVersionTimestamp: '2019-07-01T00:00:00Z' as Timestamp,
+ updates: [
+ {
+ newVersion: '1.0.0',
+ releaseTimestamp: '2020-07-01T00:00:00Z' as Timestamp,
+ },
+ ],
+ },
+ ],
+ },
+ {
+ packageFile: 'folder2/package.json',
+ deps: [
+ {
+ depName: 'dep1',
+ currentVersion: '0.1.0',
+ datasource: 'npm',
+ currentVersionTimestamp: '2019-07-01T00:00:00Z' as Timestamp,
+ updates: [
+ {
+ newVersion: '1.0.0',
+ releaseTimestamp: '2020-07-01T00:00:00Z' as Timestamp,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ regex: [
+ {
+ packageFile: 'folder3/package.json',
+ deps: [
+ {
+ depName: 'dep1',
+ currentVersion: '0.1.0',
+ datsource: 'docker',
+ currentVersionTimestamp: '2019-07-01T00:00:00Z' as Timestamp,
+ updates: [
+ {
+ newVersion: '1.0.0',
+ releaseTimestamp: '2020-07-01T00:00:00Z' as Timestamp,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ };
+ calculateLibYears(packageFiles);
+ expect(logger.logger.debug).toHaveBeenCalledWith(
+ {
+ managerLibYears: {
+ npm: 1,
+ regex: 1,
+ },
+ // eslint-disable-next-line no-loss-of-precision
+ totalLibYears: 2,
+ totalDepsCount: 2,
+ outdatedDepsCount: 2,
},
'Repository libYears',
);
diff --git a/lib/workers/repository/process/libyear.ts b/lib/workers/repository/process/libyear.ts
index f2bf607b2aa1e9..9b2932ccb69ae9 100644
--- a/lib/workers/repository/process/libyear.ts
+++ b/lib/workers/repository/process/libyear.ts
@@ -2,58 +2,129 @@ import { DateTime } from 'luxon';
import { logger } from '../../../logger';
import type { PackageFile } from '../../../modules/manager/types';
+interface DepInfo {
+ depName: string;
+ manager: string;
+ datasource: string;
+ version: string;
+ file: string;
+ outdated?: boolean;
+ libYear?: number;
+}
export function calculateLibYears(
packageFiles?: Record,
): void {
if (!packageFiles) {
return;
}
- const managerLibYears: Record = {};
+ const allDeps: DepInfo[] = [];
for (const [manager, files] of Object.entries(packageFiles)) {
for (const file of files) {
- let fileLibYears = 0;
for (const dep of file.deps) {
- if (dep.updates?.length) {
- for (const update of dep.updates) {
- if (!update.releaseTimestamp) {
- logger.debug(
- `No releaseTimestamp for ${dep.depName} update to ${update.newVersion}`,
- );
- continue;
- }
- if (!dep.currentVersionTimestamp) {
- logger.debug(`No currentVersionTimestamp for ${dep.depName}`);
- continue;
- }
- // timestamps are in ISO format
- const currentVersionDate = DateTime.fromISO(
- dep.currentVersionTimestamp,
+ const depInfo: DepInfo = {
+ depName: dep.depName!,
+ manager,
+ file: file.packageFile,
+ datasource: dep.datasource!,
+ version: (dep.currentVersion ?? dep.currentValue)!,
+ };
+
+ if (!dep.updates?.length) {
+ allDeps.push(depInfo);
+ continue;
+ }
+
+ depInfo.outdated = true;
+ if (!dep.currentVersionTimestamp) {
+ logger.debug(`No currentVersionTimestamp for ${dep.depName}`);
+ allDeps.push(depInfo);
+ continue;
+ }
+ // timestamps are in ISO format
+ const currentVersionDate = DateTime.fromISO(
+ dep.currentVersionTimestamp,
+ );
+
+ for (const update of dep.updates) {
+ if (!update.releaseTimestamp) {
+ logger.debug(
+ `No releaseTimestamp for ${dep.depName} update to ${update.newVersion}`,
);
- const releaseDate = DateTime.fromISO(update.releaseTimestamp);
- const libYears = releaseDate.diff(
- currentVersionDate,
- 'years',
- ).years;
- if (libYears >= 0) {
- update.libYears = libYears;
- }
+ continue;
+ }
+ const releaseDate = DateTime.fromISO(update.releaseTimestamp);
+ const libYears = releaseDate.diff(currentVersionDate, 'years').years;
+ if (libYears >= 0) {
+ update.libYears = libYears;
}
- // Set the highest libYears for the dep
- const depLibYears = Math.max(
- ...dep.updates.map((update) => update.libYears ?? 0),
- 0,
- );
- fileLibYears += depLibYears;
}
+ // Set the highest libYears for the dep
+ const depLibYears = Math.max(
+ ...dep.updates.map((update) => update.libYears ?? 0),
+ 0,
+ );
+ depInfo.libYear = depLibYears;
+ allDeps.push(depInfo);
}
- managerLibYears[manager] ??= 0;
- managerLibYears[manager] += fileLibYears;
}
}
- // Sum up the libYears for the repo
- let totalLibYears = 0;
- for (const libYears of Object.values(managerLibYears)) {
- totalLibYears += libYears;
+
+ const [totalDepsCount, outdatedDepsCount, totalLibYears] = getCounts(allDeps);
+ logger.debug(
+ {
+ managerLibYears: getManagerLibYears(allDeps),
+ totalLibYears,
+ totalDepsCount,
+ outdatedDepsCount,
+ },
+ 'Repository libYears',
+ );
+}
+
+function getManagerLibYears(deps: DepInfo[]): Record {
+ /** {manager : {depKey: libYear }} */
+ const managerLibYears: Record> = {};
+ for (const dep of deps) {
+ const depKey = `${dep.depName}@${dep.version}@${dep.datasource}`;
+ const manager = dep.manager;
+ managerLibYears[manager] ??= {};
+ if (dep.libYear) {
+ if (!managerLibYears[manager][depKey]) {
+ managerLibYears[manager][depKey] = dep.libYear;
+ }
+ }
}
- logger.debug({ managerLibYears, totalLibYears }, 'Repository libYears');
+
+ const res: Record = {};
+ for (const [manager, deps] of Object.entries(managerLibYears)) {
+ const managerLibYear = Object.values(deps).reduce((sum, curr) => {
+ return sum + curr;
+ }, 0);
+ res[manager] = managerLibYear;
+ }
+
+ return res;
+}
+
+function getCounts(deps: DepInfo[]): [number, number, number] {
+ const distinctDeps = new Set();
+ let totalDepsCount = 0,
+ outdatedDepsCount = 0,
+ totalLibYears = 0;
+ for (const dep of deps) {
+ const depKey = `${dep.depName}@${dep.version}@${dep.datasource}`;
+ if (!distinctDeps.has(depKey)) {
+ if (dep.outdated) {
+ outdatedDepsCount++;
+ }
+ if (dep.libYear) {
+ totalLibYears += dep.libYear;
+ }
+
+ totalDepsCount++;
+ distinctDeps.add(depKey);
+ }
+ }
+
+ return [totalDepsCount, outdatedDepsCount, totalLibYears];
}
diff --git a/lib/workers/repository/update/branch/auto-replace.spec.ts b/lib/workers/repository/update/branch/auto-replace.spec.ts
index fb06f7bc23bc89..03ada2c1e2423a 100644
--- a/lib/workers/repository/update/branch/auto-replace.spec.ts
+++ b/lib/workers/repository/update/branch/auto-replace.spec.ts
@@ -1374,5 +1374,43 @@ describe('workers/repository/update/branch/auto-replace', () => {
`,
);
});
+
+ it('github-actions: failes to update currentDigestShort', async () => {
+ const githubAction = codeBlock`
+ jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@2485f4 # tag=v1.0.0
+ `;
+ upgrade.manager = 'github-actions';
+ upgrade.updateType = 'replacement';
+ upgrade.pinDigests = true;
+ upgrade.autoReplaceStringTemplate =
+ '{{depName}}@{{#if newDigest}}{{newDigest}}{{#if newValue}} # {{newValue}}{{/if}}{{/if}}{{#unless newDigest}}{{newValue}}{{/unless}}';
+ upgrade.depName = 'actions/checkout';
+ upgrade.currentValue = 'v1.0.0';
+ upgrade.currentDigestShort = 'wrong';
+ upgrade.depIndex = 0;
+ upgrade.replaceString = 'actions/checkout@2485f4 # tag=v1.0.0';
+ upgrade.newName = 'some-other-action/checkout';
+ upgrade.newValue = 'v2.0.0';
+ upgrade.newDigest = '1cf887';
+ upgrade.packageFile = 'workflow.yml';
+ const res = await doAutoReplace(
+ upgrade,
+ githubAction,
+ reuseExistingBranch,
+ );
+ expect(res).toBe(
+ codeBlock`
+ jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: some-other-action/checkout@2485f4 # tag=v2.0.0
+ `,
+ );
+ });
});
});
diff --git a/lib/workers/repository/update/branch/auto-replace.ts b/lib/workers/repository/update/branch/auto-replace.ts
index d89862e5daf72c..39bd5204644be5 100644
--- a/lib/workers/repository/update/branch/auto-replace.ts
+++ b/lib/workers/repository/update/branch/auto-replace.ts
@@ -190,8 +190,10 @@ export async function doAutoReplace(
const {
packageFile,
depName,
+ depNameTemplate,
newName,
currentValue,
+ currentValueTemplate,
newValue,
currentDigest,
currentDigestShort,
@@ -237,24 +239,52 @@ export async function doAutoReplace(
newString = replaceString!;
const autoReplaceRegExpFlag = autoReplaceGlobalMatch ? 'g' : '';
- if (currentValue && newValue) {
+ if (currentValue && newValue && currentValue !== newValue) {
+ if (!newString.includes(currentValue)) {
+ logger.debug(
+ { stringToReplace: newString, currentValue, currentValueTemplate },
+ 'currentValue not found in string to replace',
+ );
+ }
newString = newString.replace(
regEx(escapeRegExp(currentValue), autoReplaceRegExpFlag),
newValue,
);
}
- if (depName && newName) {
+ if (depName && newName && depName !== newName) {
+ if (!newString.includes(depName)) {
+ logger.debug(
+ { stringToReplace: newString, depName, depNameTemplate },
+ 'depName not found in string to replace',
+ );
+ }
newString = newString.replace(
regEx(escapeRegExp(depName), autoReplaceRegExpFlag),
newName,
);
}
- if (currentDigest && newDigest) {
+ if (currentDigest && newDigest && currentDigest !== newDigest) {
+ if (!newString.includes(currentDigest)) {
+ logger.debug(
+ { stringToReplace: newString, currentDigest },
+ 'currentDigest not found in string to replace',
+ );
+ }
newString = newString.replace(
regEx(escapeRegExp(currentDigest), autoReplaceRegExpFlag),
newDigest,
);
- } else if (currentDigestShort && newDigest) {
+ } else if (
+ currentDigestShort &&
+ newDigest &&
+ currentDigestShort !== newDigest
+ ) {
+ if (!newString.includes(currentDigestShort)) {
+ logger.debug(
+ { stringToReplace: newString, currentDigestShort },
+ 'currentDigestShort not found in string to replace',
+ );
+ }
newString = newString.replace(
regEx(escapeRegExp(currentDigestShort), autoReplaceRegExpFlag),
newDigest,
diff --git a/lib/workers/repository/update/branch/get-updated.ts b/lib/workers/repository/update/branch/get-updated.ts
index 59bdac1e429a12..2c69a82fdbd640 100644
--- a/lib/workers/repository/update/branch/get-updated.ts
+++ b/lib/workers/repository/update/branch/get-updated.ts
@@ -14,7 +14,7 @@ import type {
import { getFile } from '../../../../util/git';
import type { FileAddition, FileChange } from '../../../../util/git/types';
import { coerceString } from '../../../../util/string';
-import type { BranchConfig } from '../../../types';
+import type { BranchConfig, BranchUpgradeConfig } from '../../../types';
import { doAutoReplace } from './auto-replace';
export interface PackageFilesResult {
@@ -231,7 +231,6 @@ export async function getUpdatedPackageFiles(
}
}
} else {
- const bumpPackageVersion = get(manager, 'bumpPackageVersion');
const updateDependency = get(manager, 'updateDependency');
if (!updateDependency) {
let res = await doAutoReplace(
@@ -242,19 +241,7 @@ export async function getUpdatedPackageFiles(
);
firstUpdate = false;
if (res) {
- if (
- bumpPackageVersion &&
- upgrade.bumpVersion &&
- upgrade.packageFileVersion
- ) {
- const { bumpedContent } = await bumpPackageVersion(
- res,
- upgrade.packageFileVersion,
- upgrade.bumpVersion,
- packageFile,
- );
- res = bumpedContent;
- }
+ res = await applyManagerBumpPackageVersion(res, upgrade);
if (res === packageFileContent) {
logger.debug({ packageFile, depName }, 'No content changed');
} else {
@@ -276,20 +263,7 @@ export async function getUpdatedPackageFiles(
fileContent: packageFileContent!,
upgrade,
});
- if (
- newContent &&
- bumpPackageVersion &&
- upgrade.bumpVersion &&
- upgrade.packageFileVersion
- ) {
- const { bumpedContent } = await bumpPackageVersion(
- newContent,
- upgrade.packageFileVersion,
- upgrade.bumpVersion,
- packageFile,
- );
- newContent = bumpedContent;
- }
+ newContent = await applyManagerBumpPackageVersion(newContent, upgrade);
if (!newContent) {
if (reuseExistingBranch) {
logger.debug(
@@ -530,3 +504,27 @@ function processUpdateArtifactResults(
}
}
}
+
+async function applyManagerBumpPackageVersion(
+ packageFileContent: string | null,
+ upgrade: BranchUpgradeConfig,
+): Promise {
+ const bumpPackageVersion = get(upgrade.manager, 'bumpPackageVersion');
+ if (
+ !bumpPackageVersion ||
+ !packageFileContent ||
+ !upgrade.bumpVersion ||
+ !upgrade.packageFileVersion
+ ) {
+ return packageFileContent;
+ }
+
+ const result = await bumpPackageVersion(
+ packageFileContent,
+ upgrade.packageFileVersion,
+ upgrade.bumpVersion,
+ upgrade.packageFile!,
+ );
+
+ return result.bumpedContent;
+}
diff --git a/lib/workers/types.ts b/lib/workers/types.ts
index 3b5727320bbe08..54f0df74db6965 100644
--- a/lib/workers/types.ts
+++ b/lib/workers/types.ts
@@ -42,6 +42,8 @@ export interface BranchUpgradeConfig
currentDigest?: string;
currentDigestShort?: string;
currentValue?: string;
+
+ currentValueTemplate?: string;
depIndex?: number;
depTypes?: string[];
diff --git a/package.json b/package.json
index 25e083daea2eac..55f26a9d4afce1 100644
--- a/package.json
+++ b/package.json
@@ -144,12 +144,12 @@
"pnpm": "9.15.4"
},
"dependencies": {
- "@aws-sdk/client-codecommit": "3.726.1",
- "@aws-sdk/client-ec2": "3.726.1",
- "@aws-sdk/client-ecr": "3.726.1",
- "@aws-sdk/client-rds": "3.726.1",
- "@aws-sdk/client-s3": "3.726.1",
- "@aws-sdk/credential-providers": "3.726.1",
+ "@aws-sdk/client-codecommit": "3.738.0",
+ "@aws-sdk/client-ec2": "3.738.0",
+ "@aws-sdk/client-ecr": "3.739.0",
+ "@aws-sdk/client-rds": "3.740.0",
+ "@aws-sdk/client-s3": "3.740.0",
+ "@aws-sdk/credential-providers": "3.738.0",
"@breejs/later": "4.2.0",
"@cdktf/hcl2json": "0.20.11",
"@opentelemetry/api": "1.9.0",
@@ -205,7 +205,7 @@
"glob": "11.0.1",
"global-agent": "3.0.0",
"good-enough-parser": "1.1.23",
- "google-auth-library": "9.15.0",
+ "google-auth-library": "9.15.1",
"got": "11.8.6",
"graph-data-structure": "4.3.1",
"handlebars": "4.7.8",
@@ -271,7 +271,7 @@
"@openpgp/web-stream-tools": "0.1.3",
"@renovate/eslint-plugin": "file:tools/eslint",
"@semantic-release/exec": "6.0.3",
- "@swc/core": "1.10.9",
+ "@swc/core": "1.10.11",
"@types/auth-header": "1.0.6",
"@types/aws4": "1.11.6",
"@types/better-sqlite3": "7.6.12",
diff --git a/pdm.lock b/pdm.lock
index 2cb824a266a8f3..be933f80efbffc 100644
--- a/pdm.lock
+++ b/pdm.lock
@@ -5,7 +5,7 @@
groups = ["default"]
strategy = ["inherit_metadata"]
lock_version = "4.5.0"
-content_hash = "sha256:a03cc9a3cd0c5c98c36b8ea5b28cad01f8fc69178d24ab168005edb15697d803"
+content_hash = "sha256:cb7ab4ded4a7ff81d1e6f461b57bd06ec2efafa0dbc1f980286e10fbb75c1a57"
[[metadata.targets]]
requires_python = ">=3.11"
@@ -37,13 +37,13 @@ files = [
[[package]]
name = "certifi"
-version = "2024.12.14"
+version = "2025.1.31"
requires_python = ">=3.6"
summary = "Python package for providing Mozilla's CA Bundle."
groups = ["default"]
files = [
- {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"},
- {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
+ {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"},
+ {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"},
]
[[package]]
@@ -297,7 +297,7 @@ files = [
[[package]]
name = "mkdocs-material"
-version = "9.5.50"
+version = "9.6.1"
requires_python = ">=3.8"
summary = "Documentation that simply works"
groups = ["default"]
@@ -315,8 +315,8 @@ dependencies = [
"requests~=2.26",
]
files = [
- {file = "mkdocs_material-9.5.50-py3-none-any.whl", hash = "sha256:f24100f234741f4d423a9d672a909d859668a4f404796be3cf035f10d6050385"},
- {file = "mkdocs_material-9.5.50.tar.gz", hash = "sha256:ae5fe16f3d7c9ccd05bb6916a7da7420cf99a9ce5e33debd9d40403a090d5825"},
+ {file = "mkdocs_material-9.6.1-py3-none-any.whl", hash = "sha256:c1742d410be29811a9b7e863cb25a578b9e255fe6f04c69f8c6838863a58e141"},
+ {file = "mkdocs_material-9.6.1.tar.gz", hash = "sha256:da37dba220d9fbfc5f1fc567fafc4028e3c3d7d828f2779ed09ab726ceca77dc"},
]
[[package]]
@@ -397,7 +397,7 @@ files = [
[[package]]
name = "pymdown-extensions"
-version = "10.14.1"
+version = "10.14.2"
requires_python = ">=3.8"
summary = "Extension pack for Python Markdown."
groups = ["default"]
@@ -406,8 +406,8 @@ dependencies = [
"pyyaml",
]
files = [
- {file = "pymdown_extensions-10.14.1-py3-none-any.whl", hash = "sha256:637951cbfbe9874ba28134fb3ce4b8bcadd6aca89ac4998ec29dcbafd554ae08"},
- {file = "pymdown_extensions-10.14.1.tar.gz", hash = "sha256:b65801996a0cd4f42a3110810c306c45b7313c09b0610a6f773730f2a9e3c96b"},
+ {file = "pymdown_extensions-10.14.2-py3-none-any.whl", hash = "sha256:f45bc5892410e54fd738ab8ccd736098b7ff0cb27fdb4bf24d0a0c6584bc90e1"},
+ {file = "pymdown_extensions-10.14.2.tar.gz", hash = "sha256:7a77b8116dc04193f2c01143760a43387bd9dc4aa05efacb7d838885a7791253"},
]
[[package]]
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index a08ec3c9427fd3..d3431c9dbf0b75 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -12,23 +12,23 @@ importers:
.:
dependencies:
'@aws-sdk/client-codecommit':
- specifier: 3.726.1
- version: 3.726.1
+ specifier: 3.738.0
+ version: 3.738.0
'@aws-sdk/client-ec2':
- specifier: 3.726.1
- version: 3.726.1
+ specifier: 3.738.0
+ version: 3.738.0
'@aws-sdk/client-ecr':
- specifier: 3.726.1
- version: 3.726.1
+ specifier: 3.739.0
+ version: 3.739.0
'@aws-sdk/client-rds':
- specifier: 3.726.1
- version: 3.726.1
+ specifier: 3.740.0
+ version: 3.740.0
'@aws-sdk/client-s3':
- specifier: 3.726.1
- version: 3.726.1
+ specifier: 3.740.0
+ version: 3.740.0
'@aws-sdk/credential-providers':
- specifier: 3.726.1
- version: 3.726.1(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))
+ specifier: 3.738.0
+ version: 3.738.0
'@breejs/later':
specifier: 4.2.0
version: 4.2.0
@@ -195,8 +195,8 @@ importers:
specifier: 1.1.23
version: 1.1.23
google-auth-library:
- specifier: 9.15.0
- version: 9.15.0(encoding@0.1.13)
+ specifier: 9.15.1
+ version: 9.15.1(encoding@0.1.13)
got:
specifier: 11.8.6
version: 11.8.6
@@ -383,8 +383,8 @@ importers:
specifier: 6.0.3
version: 6.0.3(semantic-release@24.2.1(typescript@5.7.3))
'@swc/core':
- specifier: 1.10.9
- version: 1.10.9
+ specifier: 1.10.11
+ version: 1.10.11
'@types/auth-header':
specifier: 1.0.6
version: 1.0.6
@@ -543,7 +543,7 @@ importers:
version: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1)
eslint-plugin-jest:
specifier: 28.11.0
- version: 28.11.0(@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3)
+ version: 28.11.0(@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3)
eslint-plugin-jest-formatting:
specifier: 3.1.0
version: 3.1.0(eslint@8.57.1)
@@ -567,16 +567,16 @@ importers:
version: 9.1.7
jest:
specifier: 29.7.0
- version: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ version: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
jest-extended:
specifier: 4.0.2
- version: 4.0.2(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)))
+ version: 4.0.2(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)))
jest-mock:
specifier: 29.7.0
version: 29.7.0
jest-mock-extended:
specifier: 3.0.7
- version: 3.0.7(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3)
+ version: 3.0.7(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3)
jest-snapshot:
specifier: 29.7.0
version: 29.7.0
@@ -612,10 +612,10 @@ importers:
version: 3.0.3
ts-jest:
specifier: 29.2.5
- version: 29.2.5(@babel/core@7.26.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.7))(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3)
+ version: 29.2.5(@babel/core@7.26.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.7))(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3)
ts-node:
specifier: 10.9.2
- version: 10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)
+ version: 10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)
type-fest:
specifier: 4.33.0
version: 4.33.0
@@ -658,175 +658,163 @@ packages:
'@aws-crypto/util@5.2.0':
resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==}
- '@aws-sdk/client-codecommit@3.726.1':
- resolution: {integrity: sha512-mXRU4RRMkzaA4roL9uIwPWU3tXXzs3m99rA24PIkPzDlR7DubongJGloWAQz9naux0uRIIe+jIC8mk4l/DGdrw==}
+ '@aws-sdk/client-codecommit@3.738.0':
+ resolution: {integrity: sha512-v5Pw7O0lAHJBCEvTwvdAxHhQ/IYY7eujWN0vrSva/4J5fc9wsfP92hBmY7muFAnqLdJ75GUtKXCa7RgJRgY+HA==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/client-cognito-identity@3.726.1':
- resolution: {integrity: sha512-ry0LrRm1/uo2EcPvjN38gQe2YhbnOXDhOw01j4e+aSbsBm2VumvY7d5DOLODC4i+95bxZq0pGvojqgHWM9oS0Q==}
+ '@aws-sdk/client-cognito-identity@3.738.0':
+ resolution: {integrity: sha512-TjPpLZ2qkh+2jQIYtUbNh5D6jv4U0DQIUiLLZOKalUqSK2L9OzTc1463kX076QCpYlAZJNt3FvPyiMab0W8zBg==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/client-ec2@3.726.1':
- resolution: {integrity: sha512-XOAnxaZ3Gw9GCYyZ5ETwToWYNA/0Yjs3MmYfr7N7w+yhY9YFjg+MJjmW1c+LKvpM/Ykhroh2yGY5MQOHVPwlIw==}
+ '@aws-sdk/client-ec2@3.738.0':
+ resolution: {integrity: sha512-Vl2cCvZ8TQ25lCCxRXaL1YeLRM28ldCuCPEry8kH3e4sXdyOQ7zudftY70YT/3JSuuGgFfG3rVAPHEMwolDUuQ==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/client-ecr@3.726.1':
- resolution: {integrity: sha512-9PMFPLmDJ4Pq9eyQzbdax5sM4wdqi80UbhFpR86XbsI65To/dWcTy1Vi2xjMaiSsIOP4VMOvRgSC5V+338lyWQ==}
+ '@aws-sdk/client-ecr@3.739.0':
+ resolution: {integrity: sha512-z1efvIHy/EJ8hFQsVpx2mmYhDrDdw995OJ2sRcepoZoqNTKc7+uxAImO34ooYWrlvYpAoWvvFkkXtO2BtqE7zg==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/client-rds@3.726.1':
- resolution: {integrity: sha512-07kJxcvNeYw2ckf0Gwl6f7Ee6PYcmmbvrWl3i6COgmOd9pslWnOVJLYINpaee6qT4cRhHWWRApeLyQ0dEsCjdA==}
+ '@aws-sdk/client-rds@3.740.0':
+ resolution: {integrity: sha512-ANAGhMZdnkR1XeBQ2ADa/w4U4DYTcJQHBIJdCVJAb74gcA9eZBxnY1DNzj+6koi0cmS7qHyWvlk5H3lkE4DDig==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/client-s3@3.726.1':
- resolution: {integrity: sha512-UpOGcob87DiuS2d3fW6vDZg94g57mNiOSkzvR/6GOdvBSlUgk8LLwVzGASB71FdKMl1EGEr4MeD5uKH9JsG+dw==}
+ '@aws-sdk/client-s3@3.740.0':
+ resolution: {integrity: sha512-X9aQOFJC3TsYwQP3AGcNhfYcFehVEHRKCHtHYOIKv5t1ydSJxpN/v34OrMMKvG1jFWMNkSYiSCVB9ZVo9KUwVA==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/client-sso-oidc@3.726.0':
- resolution: {integrity: sha512-5JzTX9jwev7+y2Jkzjz0pd1wobB5JQfPOQF3N2DrJ5Pao0/k6uRYwE4NqB0p0HlGrMTDm7xNq7OSPPIPG575Jw==}
+ '@aws-sdk/client-sso@3.734.0':
+ resolution: {integrity: sha512-oerepp0mut9VlgTwnG5Ds/lb0C0b2/rQ+hL/rF6q+HGKPfGsCuPvFx1GtwGKCXd49ase88/jVgrhcA9OQbz3kg==}
engines: {node: '>=18.0.0'}
- peerDependencies:
- '@aws-sdk/client-sts': ^3.726.0
- '@aws-sdk/client-sso@3.726.0':
- resolution: {integrity: sha512-NM5pjv2qglEc4XN3nnDqtqGsSGv1k5YTmzDo3W3pObItHmpS8grSeNfX9zSH+aVl0Q8hE4ZIgvTPNZ+GzwVlqg==}
+ '@aws-sdk/core@3.734.0':
+ resolution: {integrity: sha512-SxnDqf3vobdm50OLyAKfqZetv6zzwnSqwIwd3jrbopxxHKqNIM/I0xcYjD6Tn+mPig+u7iRKb9q3QnEooFTlmg==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/client-sts@3.726.1':
- resolution: {integrity: sha512-qh9Q9Vu1hrM/wMBOBIaskwnE4GTFaZu26Q6WHwyWNfj7J8a40vBxpW16c2vYXHLBtwRKM1be8uRLkmDwghpiNw==}
+ '@aws-sdk/credential-provider-cognito-identity@3.738.0':
+ resolution: {integrity: sha512-zh8ATHUjy9CyVrq7qa7ICh4t5OF7mps0A22NY2NyLpSYWOErNnze+FvBi2uh+Jp+VIoojH4R2d9/IHTxENhq7g==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/core@3.723.0':
- resolution: {integrity: sha512-UraXNmvqj3vScSsTkjMwQkhei30BhXlW5WxX6JacMKVtl95c7z0qOXquTWeTalYkFfulfdirUhvSZrl+hcyqTw==}
+ '@aws-sdk/credential-provider-env@3.734.0':
+ resolution: {integrity: sha512-gtRkzYTGafnm1FPpiNO8VBmJrYMoxhDlGPYDVcijzx3DlF8dhWnowuSBCxLSi+MJMx5hvwrX2A+e/q0QAeHqmw==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/credential-provider-cognito-identity@3.726.1':
- resolution: {integrity: sha512-/ZvcmEscWYHT0935QN1B1crz4RJzy0tXf20ViH9ShsC5e08jBn3qrjYhO4gUGjNDCwrWe3US8Mg6l1vrRrN1Og==}
+ '@aws-sdk/credential-provider-http@3.734.0':
+ resolution: {integrity: sha512-JFSL6xhONsq+hKM8xroIPhM5/FOhiQ1cov0lZxhzZWj6Ai3UAjucy3zyIFDr9MgP1KfCYNdvyaUq9/o+HWvEDg==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/credential-provider-env@3.723.0':
- resolution: {integrity: sha512-OuH2yULYUHTVDUotBoP/9AEUIJPn81GQ/YBtZLoo2QyezRJ2QiO/1epVtbJlhNZRwXrToLEDmQGA2QfC8c7pbA==}
+ '@aws-sdk/credential-provider-ini@3.734.0':
+ resolution: {integrity: sha512-HEyaM/hWI7dNmb4NhdlcDLcgJvrilk8G4DQX6qz0i4pBZGC2l4iffuqP8K6ZQjUfz5/6894PzeFuhTORAMd+cg==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/credential-provider-http@3.723.0':
- resolution: {integrity: sha512-DTsKC6xo/kz/ZSs1IcdbQMTgiYbpGTGEd83kngFc1bzmw7AmK92DBZKNZpumf8R/UfSpTcj9zzUUmrWz1kD0eQ==}
+ '@aws-sdk/credential-provider-node@3.738.0':
+ resolution: {integrity: sha512-3MuREsazwBxghKb2sQQHvie+uuK4dX4/ckFYiSoffzJQd0YHxaGxf8cr4NOSCQCUesWu8D3Y0SzlnHGboVSkpA==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/credential-provider-ini@3.726.0':
- resolution: {integrity: sha512-seTtcKL2+gZX6yK1QRPr5mDJIBOatrpoyrO8D5b8plYtV/PDbDW3mtDJSWFHet29G61ZmlNElyXRqQCXn9WX+A==}
+ '@aws-sdk/credential-provider-process@3.734.0':
+ resolution: {integrity: sha512-zvjsUo+bkYn2vjT+EtLWu3eD6me+uun+Hws1IyWej/fKFAqiBPwyeyCgU7qjkiPQSXqk1U9+/HG9IQ6Iiz+eBw==}
engines: {node: '>=18.0.0'}
- peerDependencies:
- '@aws-sdk/client-sts': ^3.726.0
- '@aws-sdk/credential-provider-node@3.726.0':
- resolution: {integrity: sha512-jjsewBcw/uLi24x8JbnuDjJad4VA9ROCE94uVRbEnGmUEsds75FWOKp3fWZLQlmjLtzsIbJOZLALkZP86liPaw==}
+ '@aws-sdk/credential-provider-sso@3.734.0':
+ resolution: {integrity: sha512-cCwwcgUBJOsV/ddyh1OGb4gKYWEaTeTsqaAK19hiNINfYV/DO9r4RMlnWAo84sSBfJuj9shUNsxzyoe6K7R92Q==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/credential-provider-process@3.723.0':
- resolution: {integrity: sha512-fgupvUjz1+jeoCBA7GMv0L6xEk92IN6VdF4YcFhsgRHlHvNgm7ayaoKQg7pz2JAAhG/3jPX6fp0ASNy+xOhmPA==}
+ '@aws-sdk/credential-provider-web-identity@3.734.0':
+ resolution: {integrity: sha512-t4OSOerc+ppK541/Iyn1AS40+2vT/qE+MFMotFkhCgCJbApeRF2ozEdnDN6tGmnl4ybcUuxnp9JWLjwDVlR/4g==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/credential-provider-sso@3.726.0':
- resolution: {integrity: sha512-WxkN76WeB08j2yw7jUH9yCMPxmT9eBFd9ZA/aACG7yzOIlsz7gvG3P2FQ0tVg25GHM0E4PdU3p/ByTOawzcOAg==}
+ '@aws-sdk/credential-providers@3.738.0':
+ resolution: {integrity: sha512-Ff+7NMLmK9oadO1uHiMCS/V3Pmp3WnY7Ijy4ySx2HLUZQq7EKFZyFB0qslkeawdY0PGWqyj25anh8I/bhxqWoQ==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/credential-provider-web-identity@3.723.0':
- resolution: {integrity: sha512-tl7pojbFbr3qLcOE6xWaNCf1zEfZrIdSJtOPeSXfV/thFMMAvIjgf3YN6Zo1a6cxGee8zrV/C8PgOH33n+Ev/A==}
+ '@aws-sdk/middleware-bucket-endpoint@3.734.0':
+ resolution: {integrity: sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ==}
engines: {node: '>=18.0.0'}
- peerDependencies:
- '@aws-sdk/client-sts': ^3.723.0
- '@aws-sdk/credential-providers@3.726.1':
- resolution: {integrity: sha512-hfRjdKYe65ioT1L9NZsDiRRoE4hPWacamUwsN/DjyMzctuCaL4vHkc5VXMfZj/s+17eUa+lyQFrLwel/zYpmgg==}
+ '@aws-sdk/middleware-expect-continue@3.734.0':
+ resolution: {integrity: sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-bucket-endpoint@3.726.0':
- resolution: {integrity: sha512-vpaP80rZqwu0C3ELayIcRIW84/nd1tadeoqllT+N9TDshuEvq4UJ+w47OBHB7RkHFJoc79lXXNYle0fdQdaE/A==}
+ '@aws-sdk/middleware-flexible-checksums@3.735.0':
+ resolution: {integrity: sha512-Tx7lYTPwQFRe/wQEHMR6Drh/S+X0ToAEq1Ava9QyxV1riwtepzRLojpNDELFb3YQVVYbX7FEiBMCJLMkmIIY+A==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-expect-continue@3.723.0':
- resolution: {integrity: sha512-w/O0EkIzkiqvGu7U8Ke7tue0V0HYM5dZQrz6nVU+R8T2LddWJ+njEIHU4Wh8aHPLQXdZA5NQumv0xLPdEutykw==}
+ '@aws-sdk/middleware-host-header@3.734.0':
+ resolution: {integrity: sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-flexible-checksums@3.723.0':
- resolution: {integrity: sha512-JY76mrUCLa0FHeMZp8X9+KK6uEuZaRZaQrlgq6zkXX/3udukH0T3YdFC+Y9uw5ddbiwZ5+KwgmlhnPpiXKfP4g==}
+ '@aws-sdk/middleware-location-constraint@3.734.0':
+ resolution: {integrity: sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-host-header@3.723.0':
- resolution: {integrity: sha512-LLVzLvk299pd7v4jN9yOSaWDZDfH0SnBPb6q+FDPaOCMGBY8kuwQso7e/ozIKSmZHRMGO3IZrflasHM+rI+2YQ==}
+ '@aws-sdk/middleware-logger@3.734.0':
+ resolution: {integrity: sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-location-constraint@3.723.0':
- resolution: {integrity: sha512-inp9tyrdRWjGOMu1rzli8i2gTo0P4X6L7nNRXNTKfyPNZcBimZ4H0H1B671JofSI5isaklVy5r4pvv2VjjLSHw==}
+ '@aws-sdk/middleware-recursion-detection@3.734.0':
+ resolution: {integrity: sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-logger@3.723.0':
- resolution: {integrity: sha512-chASQfDG5NJ8s5smydOEnNK7N0gDMyuPbx7dYYcm1t/PKtnVfvWF+DHCTrRC2Ej76gLJVCVizlAJKM8v8Kg3cg==}
+ '@aws-sdk/middleware-sdk-ec2@3.734.0':
+ resolution: {integrity: sha512-EqK7je08OlGCdoPFX5FWL7Th55XYlQS1w7ACGpCxZhxA2hGJLkMmqkw67e4KAvLprL02sOjhnhPjDh5QCEfI1Q==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-recursion-detection@3.723.0':
- resolution: {integrity: sha512-7usZMtoynT9/jxL/rkuDOFQ0C2mhXl4yCm67Rg7GNTstl67u7w5WN1aIRImMeztaKlw8ExjoTyo6WTs1Kceh7A==}
+ '@aws-sdk/middleware-sdk-rds@3.734.0':
+ resolution: {integrity: sha512-B7aFCj1XFpGkjN6TlyAxVIZxN2u+wmzeNmBUGGpRLSjZgig8V2z9hnrKFsKxVV2Cey0WnnOM6lmnlDaQtZpwQA==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-sdk-ec2@3.723.0':
- resolution: {integrity: sha512-ZEDBQwIXquGIUgwsrWTVZjCnhUDnT10jBHYYn7NBUYJulX23mwn3avJnw5pZdukofLC/NuLtOCwnhtZ72kBDpg==}
+ '@aws-sdk/middleware-sdk-s3@3.740.0':
+ resolution: {integrity: sha512-VML9TzNoQdAs5lSPQSEgZiPgMUSz2H7SltaLb9g4tHwKK5xQoTq5WcDd6V1d2aPxSN5Q2Q63aiVUBby6MdUN/Q==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-sdk-rds@3.723.0':
- resolution: {integrity: sha512-2zN/xmWP/iBO3r638y4mwwuZOJ1h08rVc13wqS6RzhebKJZvzPWmT7leB8ejEPYHOtzTC1hk1vvZt/WVB4Qqjw==}
+ '@aws-sdk/middleware-ssec@3.734.0':
+ resolution: {integrity: sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-sdk-s3@3.723.0':
- resolution: {integrity: sha512-wfjOvNJVp8LDWhq4wO5jtSMb8Vgf4tNlR7QTEQfoYc6AGU3WlK5xyUQcpfcpwytEhQTN9u0cJLQpSyXDO+qSCw==}
+ '@aws-sdk/middleware-user-agent@3.734.0':
+ resolution: {integrity: sha512-MFVzLWRkfFz02GqGPjqSOteLe5kPfElUrXZft1eElnqulqs6RJfVSpOV7mO90gu293tNAeggMWAVSGRPKIYVMg==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-ssec@3.723.0':
- resolution: {integrity: sha512-Bs+8RAeSMik6ZYCGSDJzJieGsDDh2fRbh1HQG94T8kpwBXVxMYihm6e9Xp2cyl+w9fyyCnh0IdCKChP/DvrdhA==}
+ '@aws-sdk/nested-clients@3.734.0':
+ resolution: {integrity: sha512-iph2XUy8UzIfdJFWo1r0Zng9uWj3253yvW9gljhtu+y/LNmNvSnJxQk1f3D2BC5WmcoPZqTS3UsycT3mLPSzWA==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/middleware-user-agent@3.726.0':
- resolution: {integrity: sha512-hZvzuE5S0JmFie1r68K2wQvJbzyxJFdzltj9skgnnwdvLe8F/tz7MqLkm28uV0m4jeHk0LpiBo6eZaPkQiwsZQ==}
+ '@aws-sdk/region-config-resolver@3.734.0':
+ resolution: {integrity: sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/region-config-resolver@3.723.0':
- resolution: {integrity: sha512-tGF/Cvch3uQjZIj34LY2mg8M2Dr4kYG8VU8Yd0dFnB1ybOEOveIK/9ypUo9ycZpB9oO6q01KRe5ijBaxNueUQg==}
+ '@aws-sdk/signature-v4-multi-region@3.740.0':
+ resolution: {integrity: sha512-w+psidN3i+kl51nQEV3V+fKjKUqcEbqUA1GtubruDBvBqrl5El/fU2NF3Lo53y8CfI9wCdf3V7KOEpHIqxHNng==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/signature-v4-multi-region@3.723.0':
- resolution: {integrity: sha512-lJlVAa5Sl589qO8lwMLVUtnlF1Q7I+6k1Iomv2goY9d1bRl4q2N5Pit2qJVr2AMW0sceQXeh23i2a/CKOqVAdg==}
+ '@aws-sdk/token-providers@3.734.0':
+ resolution: {integrity: sha512-2U6yWKrjWjZO8Y5SHQxkFvMVWHQWbS0ufqfAIBROqmIZNubOL7jXCiVdEFekz6MZ9LF2tvYGnOW4jX8OKDGfIw==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/token-providers@3.723.0':
- resolution: {integrity: sha512-hniWi1x4JHVwKElANh9afKIMUhAutHVBRD8zo6usr0PAoj+Waf220+1ULS74GXtLXAPCiNXl5Og+PHA7xT8ElQ==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- '@aws-sdk/client-sso-oidc': ^3.723.0
-
- '@aws-sdk/types@3.723.0':
- resolution: {integrity: sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==}
+ '@aws-sdk/types@3.734.0':
+ resolution: {integrity: sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg==}
engines: {node: '>=18.0.0'}
'@aws-sdk/util-arn-parser@3.723.0':
resolution: {integrity: sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/util-endpoints@3.726.0':
- resolution: {integrity: sha512-sLd30ASsPMoPn3XBK50oe/bkpJ4N8Bpb7SbhoxcY3Lk+fSASaWxbbXE81nbvCnkxrZCvkPOiDHzJCp1E2im71A==}
+ '@aws-sdk/util-endpoints@3.734.0':
+ resolution: {integrity: sha512-w2+/E88NUbqql6uCVAsmMxDQKu7vsKV0KqhlQb0lL+RCq4zy07yXYptVNs13qrnuTfyX7uPXkXrlugvK9R1Ucg==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/util-format-url@3.723.0':
- resolution: {integrity: sha512-70+xUrdcnencPlCdV9XkRqmgj0vLDb8vm4mcEsgabg5QQ3S80KM0GEuhBAIGMkBWwNQTzCgQy2s7xOUlJPbu+g==}
+ '@aws-sdk/util-format-url@3.734.0':
+ resolution: {integrity: sha512-TxZMVm8V4aR/QkW9/NhujvYpPZjUYqzLwSge5imKZbWFR806NP7RMwc5ilVuHF/bMOln/cVHkl42kATElWBvNw==}
engines: {node: '>=18.0.0'}
'@aws-sdk/util-locate-window@3.723.0':
resolution: {integrity: sha512-Yf2CS10BqK688DRsrKI/EO6B8ff5J86NXe4C+VCysK7UOgN0l1zOTeTukZ3H8Q9tYYX3oaF1961o8vRkFm7Nmw==}
engines: {node: '>=18.0.0'}
- '@aws-sdk/util-user-agent-browser@3.723.0':
- resolution: {integrity: sha512-Wh9I6j2jLhNFq6fmXydIpqD1WyQLyTfSxjW9B+PXSnPyk3jtQW8AKQur7p97rO8LAUzVI0bv8kb3ZzDEVbquIg==}
+ '@aws-sdk/util-user-agent-browser@3.734.0':
+ resolution: {integrity: sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng==}
- '@aws-sdk/util-user-agent-node@3.726.0':
- resolution: {integrity: sha512-iEj6KX9o6IQf23oziorveRqyzyclWai95oZHDJtYav3fvLJKStwSjygO4xSF7ycHcTYeCHSLO1FFOHgGVs4Viw==}
+ '@aws-sdk/util-user-agent-node@3.734.0':
+ resolution: {integrity: sha512-c6Iinh+RVQKs6jYUFQ64htOU2HUXFQ3TVx+8Tu3EDF19+9vzWi9UukhIMH9rqyyEXIAkk9XL7avt8y2Uyw2dGA==}
engines: {node: '>=18.0.0'}
peerDependencies:
aws-crt: '>=1.0.0'
@@ -834,8 +822,8 @@ packages:
aws-crt:
optional: true
- '@aws-sdk/xml-builder@3.723.0':
- resolution: {integrity: sha512-5xK2SqGU1mzzsOeemy7cy3fGKxR1sEpUs4pEiIjaT0OIvU+fZaDVUEYWOqsgns6wI90XZEQJlXtI8uAHX/do5Q==}
+ '@aws-sdk/xml-builder@3.734.0':
+ resolution: {integrity: sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ==}
engines: {node: '>=18.0.0'}
'@babel/code-frame@7.26.2':
@@ -1887,68 +1875,68 @@ packages:
resolution: {integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==}
engines: {node: '>=18.0.0'}
- '@swc/core-darwin-arm64@1.10.9':
- resolution: {integrity: sha512-XTHLtijFervv2B+i1ngM993umhSj9K1IeMomvU/Db84Asjur2XmD4KXt9QPnGDRFgv2kLSjZ+DDL25Qk0f4r+w==}
+ '@swc/core-darwin-arm64@1.10.11':
+ resolution: {integrity: sha512-ZpgEaNcx2e5D+Pd0yZGVbpSrEDOEubn7r2JXoNBf0O85lPjUm3HDzGRfLlV/MwxRPAkwm93eLP4l7gYnc50l3g==}
engines: {node: '>=10'}
cpu: [arm64]
os: [darwin]
- '@swc/core-darwin-x64@1.10.9':
- resolution: {integrity: sha512-bi3el9/FV/la8HIsolSjeDar+tM7m9AmSF1w7X6ZByW2qgc4Z1tmq0A4M4H9aH3TfHesZbfq8hgaNtc2/VtzzQ==}
+ '@swc/core-darwin-x64@1.10.11':
+ resolution: {integrity: sha512-szObinnq2o7spXMDU5pdunmUeLrfV67Q77rV+DyojAiGJI1RSbEQotLOk+ONOLpoapwGUxOijFG4IuX1xiwQ2g==}
engines: {node: '>=10'}
cpu: [x64]
os: [darwin]
- '@swc/core-linux-arm-gnueabihf@1.10.9':
- resolution: {integrity: sha512-xsLHV02S+RTDuI+UJBkA2muNk/s0ETRpoc1K/gNt0i8BqTurPYkrvGDDALN9+leiUPydHvZi9P1qdExbgUJnXw==}
+ '@swc/core-linux-arm-gnueabihf@1.10.11':
+ resolution: {integrity: sha512-tVE8aXQwd8JUB9fOGLawFJa76nrpvp3dvErjozMmWSKWqtoeO7HV83aOrVtc8G66cj4Vq7FjTE9pOJeV1FbKRw==}
engines: {node: '>=10'}
cpu: [arm]
os: [linux]
- '@swc/core-linux-arm64-gnu@1.10.9':
- resolution: {integrity: sha512-41hJgPoGhIa12U6Tud+yLF/m64YA3mGut3TmBEkj2R7rdJdE0mljdtR0tf4J2RoQaWZPPi0DBSqGdROiAEx9dg==}
+ '@swc/core-linux-arm64-gnu@1.10.11':
+ resolution: {integrity: sha512-geFkENU5GMEKO7FqHOaw9HVlpQEW10nICoM6ubFc0hXBv8dwRXU4vQbh9s/isLSFRftw1m4jEEWixAnXSw8bxQ==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
- '@swc/core-linux-arm64-musl@1.10.9':
- resolution: {integrity: sha512-DUMRhl49b9r7bLg9oNzCdW4lLcDJKrRBn87Iq5APPvixsm1auGnsVQycGkQcDDKvVllxIFSbmCYzjagx3l8Hnw==}
+ '@swc/core-linux-arm64-musl@1.10.11':
+ resolution: {integrity: sha512-2mMscXe/ivq8c4tO3eQSbQDFBvagMJGlalXCspn0DgDImLYTEnt/8KHMUMGVfh0gMJTZ9q4FlGLo7mlnbx99MQ==}
engines: {node: '>=10'}
cpu: [arm64]
os: [linux]
- '@swc/core-linux-x64-gnu@1.10.9':
- resolution: {integrity: sha512-xW0y88vQvmzYo3Gn7yFnY03TfHMwuca4aFH3ZmhwDNOYHmTOi6fmhAkg/13F/NrwjMYO+GnF5uJTjdjb3B6tdQ==}
+ '@swc/core-linux-x64-gnu@1.10.11':
+ resolution: {integrity: sha512-eu2apgDbC4xwsigpl6LS+iyw6a3mL6kB4I+6PZMbFF2nIb1Dh7RGnu70Ai6mMn1o80fTmRSKsCT3CKMfVdeNFg==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
- '@swc/core-linux-x64-musl@1.10.9':
- resolution: {integrity: sha512-jYs32BEx+CPVuxN6NdsWEpdehjnmAag25jyJzwjQx+NCGYwHEV3bT5y8TX4eFhaVB1rafmqJOlYQPs4+MSyGCg==}
+ '@swc/core-linux-x64-musl@1.10.11':
+ resolution: {integrity: sha512-0n+wPWpDigwqRay4IL2JIvAqSKCXv6nKxPig9M7+epAlEQlqX+8Oq/Ap3yHtuhjNPb7HmnqNJLCXT1Wx+BZo0w==}
engines: {node: '>=10'}
cpu: [x64]
os: [linux]
- '@swc/core-win32-arm64-msvc@1.10.9':
- resolution: {integrity: sha512-Uhh5T3Fq3Nyom96Bm3ACBNASH3iqNc76in7ewZz8PooUqeTIO8aZpsghnncjctRNE9T819/8btpiFIhHo3sKtg==}
+ '@swc/core-win32-arm64-msvc@1.10.11':
+ resolution: {integrity: sha512-7+bMSIoqcbXKosIVd314YjckDRPneA4OpG1cb3/GrkQTEDXmWT3pFBBlJf82hzJfw7b6lfv6rDVEFBX7/PJoLA==}
engines: {node: '>=10'}
cpu: [arm64]
os: [win32]
- '@swc/core-win32-ia32-msvc@1.10.9':
- resolution: {integrity: sha512-bD5BpbojEsDfrAvT+1qjQPf5RCKLg4UL+3Uwm019+ZR02hd8qO538BlOnQdOqRqccu+75DF6aRglQ7AJ24Cs0Q==}
+ '@swc/core-win32-ia32-msvc@1.10.11':
+ resolution: {integrity: sha512-6hkLl4+3KjP/OFTryWxpW7YFN+w4R689TSPwiII4fFgsFNupyEmLWWakKfkGgV2JVA59L4Oi02elHy/O1sbgtw==}
engines: {node: '>=10'}
cpu: [ia32]
os: [win32]
- '@swc/core-win32-x64-msvc@1.10.9':
- resolution: {integrity: sha512-NwkuUNeBBQnAaXVvcGw8Zr6RR8kylyjFUnlYZZ3G0QkQZ4rYLXYTafAmiRjrfzgVb0LcMF/sBzJvGOk7SwtIDg==}
+ '@swc/core-win32-x64-msvc@1.10.11':
+ resolution: {integrity: sha512-kKNE2BGu/La2k2WFHovenqZvGQAHRIU+rd2/6a7D6EiQ6EyimtbhUqjCCZ+N1f5fIAnvM+sMdLiQJq4jdd/oOQ==}
engines: {node: '>=10'}
cpu: [x64]
os: [win32]
- '@swc/core@1.10.9':
- resolution: {integrity: sha512-MQ97YSXu2oibzm7wi4GNa7hhndjLuVt/lmO2sq53+P37oZmyg/JQ/IYYtSiC6UGK3+cHoiVAykrK+glxLjJbag==}
+ '@swc/core@1.10.11':
+ resolution: {integrity: sha512-3zGU5y3S20cAwot9ZcsxVFNsSVaptG+dKdmAxORSE3EX7ixe1Xn5kUwLlgIsM4qrwTUWCJDLNhRS+2HLFivcDg==}
engines: {node: '>=10'}
peerDependencies:
'@swc/helpers': '*'
@@ -3692,8 +3680,8 @@ packages:
resolution: {integrity: sha512-QUcQZutczESpdo2w9BMG6VpLFoq9ix7ER5HLM1mAdZdri2F3eISkCb8ep84W6YOo0grYWJdyT/8JkYqGjQfSSQ==}
engines: {node: '>=18.12.0', yarn: ^1.17.0}
- google-auth-library@9.15.0:
- resolution: {integrity: sha512-7ccSEJFDFO7exFbO6NRyC+xH8/mZ1GZGG2xxx9iHxZWcjUjJpjWxIMw3cofAKcueZ6DATiukmmprD7yavQHOyQ==}
+ google-auth-library@9.15.1:
+ resolution: {integrity: sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==}
engines: {node: '>=14'}
gopd@1.2.0:
@@ -6500,20 +6488,20 @@ snapshots:
'@aws-crypto/crc32@5.2.0':
dependencies:
'@aws-crypto/util': 5.2.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
tslib: 2.8.1
'@aws-crypto/crc32c@5.2.0':
dependencies:
'@aws-crypto/util': 5.2.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
tslib: 2.8.1
'@aws-crypto/sha1-browser@5.2.0':
dependencies:
'@aws-crypto/supports-web-crypto': 5.2.0
'@aws-crypto/util': 5.2.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@aws-sdk/util-locate-window': 3.723.0
'@smithy/util-utf8': 2.3.0
tslib: 2.8.1
@@ -6523,7 +6511,7 @@ snapshots:
'@aws-crypto/sha256-js': 5.2.0
'@aws-crypto/supports-web-crypto': 5.2.0
'@aws-crypto/util': 5.2.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@aws-sdk/util-locate-window': 3.723.0
'@smithy/util-utf8': 2.3.0
tslib: 2.8.1
@@ -6531,7 +6519,7 @@ snapshots:
'@aws-crypto/sha256-js@5.2.0':
dependencies:
'@aws-crypto/util': 5.2.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
tslib: 2.8.1
'@aws-crypto/supports-web-crypto@5.2.0':
@@ -6540,27 +6528,25 @@ snapshots:
'@aws-crypto/util@5.2.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@smithy/util-utf8': 2.3.0
tslib: 2.8.1
- '@aws-sdk/client-codecommit@3.726.1':
+ '@aws-sdk/client-codecommit@3.738.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
- '@aws-sdk/client-sso-oidc': 3.726.0(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/client-sts': 3.726.1
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/credential-provider-node': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/middleware-host-header': 3.723.0
- '@aws-sdk/middleware-logger': 3.723.0
- '@aws-sdk/middleware-recursion-detection': 3.723.0
- '@aws-sdk/middleware-user-agent': 3.726.0
- '@aws-sdk/region-config-resolver': 3.723.0
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-endpoints': 3.726.0
- '@aws-sdk/util-user-agent-browser': 3.723.0
- '@aws-sdk/util-user-agent-node': 3.726.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/credential-provider-node': 3.738.0
+ '@aws-sdk/middleware-host-header': 3.734.0
+ '@aws-sdk/middleware-logger': 3.734.0
+ '@aws-sdk/middleware-recursion-detection': 3.734.0
+ '@aws-sdk/middleware-user-agent': 3.734.0
+ '@aws-sdk/region-config-resolver': 3.734.0
+ '@aws-sdk/types': 3.734.0
+ '@aws-sdk/util-endpoints': 3.734.0
+ '@aws-sdk/util-user-agent-browser': 3.734.0
+ '@aws-sdk/util-user-agent-node': 3.734.0
'@smithy/config-resolver': 4.0.1
'@smithy/core': 3.1.1
'@smithy/fetch-http-handler': 5.0.1
@@ -6592,23 +6578,21 @@ snapshots:
transitivePeerDependencies:
- aws-crt
- '@aws-sdk/client-cognito-identity@3.726.1':
+ '@aws-sdk/client-cognito-identity@3.738.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
- '@aws-sdk/client-sso-oidc': 3.726.0(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/client-sts': 3.726.1
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/credential-provider-node': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/middleware-host-header': 3.723.0
- '@aws-sdk/middleware-logger': 3.723.0
- '@aws-sdk/middleware-recursion-detection': 3.723.0
- '@aws-sdk/middleware-user-agent': 3.726.0
- '@aws-sdk/region-config-resolver': 3.723.0
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-endpoints': 3.726.0
- '@aws-sdk/util-user-agent-browser': 3.723.0
- '@aws-sdk/util-user-agent-node': 3.726.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/credential-provider-node': 3.738.0
+ '@aws-sdk/middleware-host-header': 3.734.0
+ '@aws-sdk/middleware-logger': 3.734.0
+ '@aws-sdk/middleware-recursion-detection': 3.734.0
+ '@aws-sdk/middleware-user-agent': 3.734.0
+ '@aws-sdk/region-config-resolver': 3.734.0
+ '@aws-sdk/types': 3.734.0
+ '@aws-sdk/util-endpoints': 3.734.0
+ '@aws-sdk/util-user-agent-browser': 3.734.0
+ '@aws-sdk/util-user-agent-node': 3.734.0
'@smithy/config-resolver': 4.0.1
'@smithy/core': 3.1.1
'@smithy/fetch-http-handler': 5.0.1
@@ -6638,24 +6622,22 @@ snapshots:
transitivePeerDependencies:
- aws-crt
- '@aws-sdk/client-ec2@3.726.1':
+ '@aws-sdk/client-ec2@3.738.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
- '@aws-sdk/client-sso-oidc': 3.726.0(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/client-sts': 3.726.1
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/credential-provider-node': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/middleware-host-header': 3.723.0
- '@aws-sdk/middleware-logger': 3.723.0
- '@aws-sdk/middleware-recursion-detection': 3.723.0
- '@aws-sdk/middleware-sdk-ec2': 3.723.0
- '@aws-sdk/middleware-user-agent': 3.726.0
- '@aws-sdk/region-config-resolver': 3.723.0
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-endpoints': 3.726.0
- '@aws-sdk/util-user-agent-browser': 3.723.0
- '@aws-sdk/util-user-agent-node': 3.726.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/credential-provider-node': 3.738.0
+ '@aws-sdk/middleware-host-header': 3.734.0
+ '@aws-sdk/middleware-logger': 3.734.0
+ '@aws-sdk/middleware-recursion-detection': 3.734.0
+ '@aws-sdk/middleware-sdk-ec2': 3.734.0
+ '@aws-sdk/middleware-user-agent': 3.734.0
+ '@aws-sdk/region-config-resolver': 3.734.0
+ '@aws-sdk/types': 3.734.0
+ '@aws-sdk/util-endpoints': 3.734.0
+ '@aws-sdk/util-user-agent-browser': 3.734.0
+ '@aws-sdk/util-user-agent-node': 3.734.0
'@smithy/config-resolver': 4.0.1
'@smithy/core': 3.1.1
'@smithy/fetch-http-handler': 5.0.1
@@ -6688,23 +6670,21 @@ snapshots:
transitivePeerDependencies:
- aws-crt
- '@aws-sdk/client-ecr@3.726.1':
+ '@aws-sdk/client-ecr@3.739.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
- '@aws-sdk/client-sso-oidc': 3.726.0(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/client-sts': 3.726.1
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/credential-provider-node': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/middleware-host-header': 3.723.0
- '@aws-sdk/middleware-logger': 3.723.0
- '@aws-sdk/middleware-recursion-detection': 3.723.0
- '@aws-sdk/middleware-user-agent': 3.726.0
- '@aws-sdk/region-config-resolver': 3.723.0
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-endpoints': 3.726.0
- '@aws-sdk/util-user-agent-browser': 3.723.0
- '@aws-sdk/util-user-agent-node': 3.726.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/credential-provider-node': 3.738.0
+ '@aws-sdk/middleware-host-header': 3.734.0
+ '@aws-sdk/middleware-logger': 3.734.0
+ '@aws-sdk/middleware-recursion-detection': 3.734.0
+ '@aws-sdk/middleware-user-agent': 3.734.0
+ '@aws-sdk/region-config-resolver': 3.734.0
+ '@aws-sdk/types': 3.734.0
+ '@aws-sdk/util-endpoints': 3.734.0
+ '@aws-sdk/util-user-agent-browser': 3.734.0
+ '@aws-sdk/util-user-agent-node': 3.734.0
'@smithy/config-resolver': 4.0.1
'@smithy/core': 3.1.1
'@smithy/fetch-http-handler': 5.0.1
@@ -6735,24 +6715,22 @@ snapshots:
transitivePeerDependencies:
- aws-crt
- '@aws-sdk/client-rds@3.726.1':
+ '@aws-sdk/client-rds@3.740.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
- '@aws-sdk/client-sso-oidc': 3.726.0(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/client-sts': 3.726.1
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/credential-provider-node': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/middleware-host-header': 3.723.0
- '@aws-sdk/middleware-logger': 3.723.0
- '@aws-sdk/middleware-recursion-detection': 3.723.0
- '@aws-sdk/middleware-sdk-rds': 3.723.0
- '@aws-sdk/middleware-user-agent': 3.726.0
- '@aws-sdk/region-config-resolver': 3.723.0
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-endpoints': 3.726.0
- '@aws-sdk/util-user-agent-browser': 3.723.0
- '@aws-sdk/util-user-agent-node': 3.726.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/credential-provider-node': 3.738.0
+ '@aws-sdk/middleware-host-header': 3.734.0
+ '@aws-sdk/middleware-logger': 3.734.0
+ '@aws-sdk/middleware-recursion-detection': 3.734.0
+ '@aws-sdk/middleware-sdk-rds': 3.734.0
+ '@aws-sdk/middleware-user-agent': 3.734.0
+ '@aws-sdk/region-config-resolver': 3.734.0
+ '@aws-sdk/types': 3.734.0
+ '@aws-sdk/util-endpoints': 3.734.0
+ '@aws-sdk/util-user-agent-browser': 3.734.0
+ '@aws-sdk/util-user-agent-node': 3.734.0
'@smithy/config-resolver': 4.0.1
'@smithy/core': 3.1.1
'@smithy/fetch-http-handler': 5.0.1
@@ -6783,32 +6761,30 @@ snapshots:
transitivePeerDependencies:
- aws-crt
- '@aws-sdk/client-s3@3.726.1':
+ '@aws-sdk/client-s3@3.740.0':
dependencies:
'@aws-crypto/sha1-browser': 5.2.0
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
- '@aws-sdk/client-sso-oidc': 3.726.0(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/client-sts': 3.726.1
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/credential-provider-node': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/middleware-bucket-endpoint': 3.726.0
- '@aws-sdk/middleware-expect-continue': 3.723.0
- '@aws-sdk/middleware-flexible-checksums': 3.723.0
- '@aws-sdk/middleware-host-header': 3.723.0
- '@aws-sdk/middleware-location-constraint': 3.723.0
- '@aws-sdk/middleware-logger': 3.723.0
- '@aws-sdk/middleware-recursion-detection': 3.723.0
- '@aws-sdk/middleware-sdk-s3': 3.723.0
- '@aws-sdk/middleware-ssec': 3.723.0
- '@aws-sdk/middleware-user-agent': 3.726.0
- '@aws-sdk/region-config-resolver': 3.723.0
- '@aws-sdk/signature-v4-multi-region': 3.723.0
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-endpoints': 3.726.0
- '@aws-sdk/util-user-agent-browser': 3.723.0
- '@aws-sdk/util-user-agent-node': 3.726.0
- '@aws-sdk/xml-builder': 3.723.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/credential-provider-node': 3.738.0
+ '@aws-sdk/middleware-bucket-endpoint': 3.734.0
+ '@aws-sdk/middleware-expect-continue': 3.734.0
+ '@aws-sdk/middleware-flexible-checksums': 3.735.0
+ '@aws-sdk/middleware-host-header': 3.734.0
+ '@aws-sdk/middleware-location-constraint': 3.734.0
+ '@aws-sdk/middleware-logger': 3.734.0
+ '@aws-sdk/middleware-recursion-detection': 3.734.0
+ '@aws-sdk/middleware-sdk-s3': 3.740.0
+ '@aws-sdk/middleware-ssec': 3.734.0
+ '@aws-sdk/middleware-user-agent': 3.734.0
+ '@aws-sdk/region-config-resolver': 3.734.0
+ '@aws-sdk/signature-v4-multi-region': 3.740.0
+ '@aws-sdk/types': 3.734.0
+ '@aws-sdk/util-endpoints': 3.734.0
+ '@aws-sdk/util-user-agent-browser': 3.734.0
+ '@aws-sdk/util-user-agent-node': 3.734.0
+ '@aws-sdk/xml-builder': 3.734.0
'@smithy/config-resolver': 4.0.1
'@smithy/core': 3.1.1
'@smithy/eventstream-serde-browser': 4.0.1
@@ -6846,65 +6822,20 @@ snapshots:
transitivePeerDependencies:
- aws-crt
- '@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1)':
- dependencies:
- '@aws-crypto/sha256-browser': 5.2.0
- '@aws-crypto/sha256-js': 5.2.0
- '@aws-sdk/client-sts': 3.726.1
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/credential-provider-node': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/middleware-host-header': 3.723.0
- '@aws-sdk/middleware-logger': 3.723.0
- '@aws-sdk/middleware-recursion-detection': 3.723.0
- '@aws-sdk/middleware-user-agent': 3.726.0
- '@aws-sdk/region-config-resolver': 3.723.0
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-endpoints': 3.726.0
- '@aws-sdk/util-user-agent-browser': 3.723.0
- '@aws-sdk/util-user-agent-node': 3.726.0
- '@smithy/config-resolver': 4.0.1
- '@smithy/core': 3.1.1
- '@smithy/fetch-http-handler': 5.0.1
- '@smithy/hash-node': 4.0.1
- '@smithy/invalid-dependency': 4.0.1
- '@smithy/middleware-content-length': 4.0.1
- '@smithy/middleware-endpoint': 4.0.2
- '@smithy/middleware-retry': 4.0.3
- '@smithy/middleware-serde': 4.0.1
- '@smithy/middleware-stack': 4.0.1
- '@smithy/node-config-provider': 4.0.1
- '@smithy/node-http-handler': 4.0.2
- '@smithy/protocol-http': 5.0.1
- '@smithy/smithy-client': 4.1.2
- '@smithy/types': 4.1.0
- '@smithy/url-parser': 4.0.1
- '@smithy/util-base64': 4.0.0
- '@smithy/util-body-length-browser': 4.0.0
- '@smithy/util-body-length-node': 4.0.0
- '@smithy/util-defaults-mode-browser': 4.0.3
- '@smithy/util-defaults-mode-node': 4.0.3
- '@smithy/util-endpoints': 3.0.1
- '@smithy/util-middleware': 4.0.1
- '@smithy/util-retry': 4.0.1
- '@smithy/util-utf8': 4.0.0
- tslib: 2.8.1
- transitivePeerDependencies:
- - aws-crt
-
- '@aws-sdk/client-sso@3.726.0':
+ '@aws-sdk/client-sso@3.734.0':
dependencies:
'@aws-crypto/sha256-browser': 5.2.0
'@aws-crypto/sha256-js': 5.2.0
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/middleware-host-header': 3.723.0
- '@aws-sdk/middleware-logger': 3.723.0
- '@aws-sdk/middleware-recursion-detection': 3.723.0
- '@aws-sdk/middleware-user-agent': 3.726.0
- '@aws-sdk/region-config-resolver': 3.723.0
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-endpoints': 3.726.0
- '@aws-sdk/util-user-agent-browser': 3.723.0
- '@aws-sdk/util-user-agent-node': 3.726.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/middleware-host-header': 3.734.0
+ '@aws-sdk/middleware-logger': 3.734.0
+ '@aws-sdk/middleware-recursion-detection': 3.734.0
+ '@aws-sdk/middleware-user-agent': 3.734.0
+ '@aws-sdk/region-config-resolver': 3.734.0
+ '@aws-sdk/types': 3.734.0
+ '@aws-sdk/util-endpoints': 3.734.0
+ '@aws-sdk/util-user-agent-browser': 3.734.0
+ '@aws-sdk/util-user-agent-node': 3.734.0
'@smithy/config-resolver': 4.0.1
'@smithy/core': 3.1.1
'@smithy/fetch-http-handler': 5.0.1
@@ -6934,54 +6865,9 @@ snapshots:
transitivePeerDependencies:
- aws-crt
- '@aws-sdk/client-sts@3.726.1':
+ '@aws-sdk/core@3.734.0':
dependencies:
- '@aws-crypto/sha256-browser': 5.2.0
- '@aws-crypto/sha256-js': 5.2.0
- '@aws-sdk/client-sso-oidc': 3.726.0(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/credential-provider-node': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/middleware-host-header': 3.723.0
- '@aws-sdk/middleware-logger': 3.723.0
- '@aws-sdk/middleware-recursion-detection': 3.723.0
- '@aws-sdk/middleware-user-agent': 3.726.0
- '@aws-sdk/region-config-resolver': 3.723.0
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-endpoints': 3.726.0
- '@aws-sdk/util-user-agent-browser': 3.723.0
- '@aws-sdk/util-user-agent-node': 3.726.0
- '@smithy/config-resolver': 4.0.1
- '@smithy/core': 3.1.1
- '@smithy/fetch-http-handler': 5.0.1
- '@smithy/hash-node': 4.0.1
- '@smithy/invalid-dependency': 4.0.1
- '@smithy/middleware-content-length': 4.0.1
- '@smithy/middleware-endpoint': 4.0.2
- '@smithy/middleware-retry': 4.0.3
- '@smithy/middleware-serde': 4.0.1
- '@smithy/middleware-stack': 4.0.1
- '@smithy/node-config-provider': 4.0.1
- '@smithy/node-http-handler': 4.0.2
- '@smithy/protocol-http': 5.0.1
- '@smithy/smithy-client': 4.1.2
- '@smithy/types': 4.1.0
- '@smithy/url-parser': 4.0.1
- '@smithy/util-base64': 4.0.0
- '@smithy/util-body-length-browser': 4.0.0
- '@smithy/util-body-length-node': 4.0.0
- '@smithy/util-defaults-mode-browser': 4.0.3
- '@smithy/util-defaults-mode-node': 4.0.3
- '@smithy/util-endpoints': 3.0.1
- '@smithy/util-middleware': 4.0.1
- '@smithy/util-retry': 4.0.1
- '@smithy/util-utf8': 4.0.0
- tslib: 2.8.1
- transitivePeerDependencies:
- - aws-crt
-
- '@aws-sdk/core@3.723.0':
- dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@smithy/core': 3.1.1
'@smithy/node-config-provider': 4.0.1
'@smithy/property-provider': 4.0.1
@@ -6993,28 +6879,28 @@ snapshots:
fast-xml-parser: 4.4.1
tslib: 2.8.1
- '@aws-sdk/credential-provider-cognito-identity@3.726.1':
+ '@aws-sdk/credential-provider-cognito-identity@3.738.0':
dependencies:
- '@aws-sdk/client-cognito-identity': 3.726.1
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/client-cognito-identity': 3.738.0
+ '@aws-sdk/types': 3.734.0
'@smithy/property-provider': 4.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
transitivePeerDependencies:
- aws-crt
- '@aws-sdk/credential-provider-env@3.723.0':
+ '@aws-sdk/credential-provider-env@3.734.0':
dependencies:
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/types': 3.734.0
'@smithy/property-provider': 4.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/credential-provider-http@3.723.0':
+ '@aws-sdk/credential-provider-http@3.734.0':
dependencies:
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/types': 3.734.0
'@smithy/fetch-http-handler': 5.0.1
'@smithy/node-http-handler': 4.0.2
'@smithy/property-provider': 4.0.1
@@ -7024,102 +6910,99 @@ snapshots:
'@smithy/util-stream': 4.0.2
tslib: 2.8.1
- '@aws-sdk/credential-provider-ini@3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)':
+ '@aws-sdk/credential-provider-ini@3.734.0':
dependencies:
- '@aws-sdk/client-sts': 3.726.1
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/credential-provider-env': 3.723.0
- '@aws-sdk/credential-provider-http': 3.723.0
- '@aws-sdk/credential-provider-process': 3.723.0
- '@aws-sdk/credential-provider-sso': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))
- '@aws-sdk/credential-provider-web-identity': 3.723.0(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/credential-provider-env': 3.734.0
+ '@aws-sdk/credential-provider-http': 3.734.0
+ '@aws-sdk/credential-provider-process': 3.734.0
+ '@aws-sdk/credential-provider-sso': 3.734.0
+ '@aws-sdk/credential-provider-web-identity': 3.734.0
+ '@aws-sdk/nested-clients': 3.734.0
+ '@aws-sdk/types': 3.734.0
'@smithy/credential-provider-imds': 4.0.1
'@smithy/property-provider': 4.0.1
'@smithy/shared-ini-file-loader': 4.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
transitivePeerDependencies:
- - '@aws-sdk/client-sso-oidc'
- aws-crt
- '@aws-sdk/credential-provider-node@3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)':
+ '@aws-sdk/credential-provider-node@3.738.0':
dependencies:
- '@aws-sdk/credential-provider-env': 3.723.0
- '@aws-sdk/credential-provider-http': 3.723.0
- '@aws-sdk/credential-provider-ini': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/credential-provider-process': 3.723.0
- '@aws-sdk/credential-provider-sso': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))
- '@aws-sdk/credential-provider-web-identity': 3.723.0(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/credential-provider-env': 3.734.0
+ '@aws-sdk/credential-provider-http': 3.734.0
+ '@aws-sdk/credential-provider-ini': 3.734.0
+ '@aws-sdk/credential-provider-process': 3.734.0
+ '@aws-sdk/credential-provider-sso': 3.734.0
+ '@aws-sdk/credential-provider-web-identity': 3.734.0
+ '@aws-sdk/types': 3.734.0
'@smithy/credential-provider-imds': 4.0.1
'@smithy/property-provider': 4.0.1
'@smithy/shared-ini-file-loader': 4.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
transitivePeerDependencies:
- - '@aws-sdk/client-sso-oidc'
- - '@aws-sdk/client-sts'
- aws-crt
- '@aws-sdk/credential-provider-process@3.723.0':
+ '@aws-sdk/credential-provider-process@3.734.0':
dependencies:
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/types': 3.734.0
'@smithy/property-provider': 4.0.1
'@smithy/shared-ini-file-loader': 4.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/credential-provider-sso@3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))':
+ '@aws-sdk/credential-provider-sso@3.734.0':
dependencies:
- '@aws-sdk/client-sso': 3.726.0
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/token-providers': 3.723.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/client-sso': 3.734.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/token-providers': 3.734.0
+ '@aws-sdk/types': 3.734.0
'@smithy/property-provider': 4.0.1
'@smithy/shared-ini-file-loader': 4.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
transitivePeerDependencies:
- - '@aws-sdk/client-sso-oidc'
- aws-crt
- '@aws-sdk/credential-provider-web-identity@3.723.0(@aws-sdk/client-sts@3.726.1)':
+ '@aws-sdk/credential-provider-web-identity@3.734.0':
dependencies:
- '@aws-sdk/client-sts': 3.726.1
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/nested-clients': 3.734.0
+ '@aws-sdk/types': 3.734.0
'@smithy/property-provider': 4.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
- '@aws-sdk/credential-providers@3.726.1(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))':
- dependencies:
- '@aws-sdk/client-cognito-identity': 3.726.1
- '@aws-sdk/client-sso': 3.726.0
- '@aws-sdk/client-sts': 3.726.1
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/credential-provider-cognito-identity': 3.726.1
- '@aws-sdk/credential-provider-env': 3.723.0
- '@aws-sdk/credential-provider-http': 3.723.0
- '@aws-sdk/credential-provider-ini': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/credential-provider-node': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/credential-provider-process': 3.723.0
- '@aws-sdk/credential-provider-sso': 3.726.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))
- '@aws-sdk/credential-provider-web-identity': 3.723.0(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/credential-providers@3.738.0':
+ dependencies:
+ '@aws-sdk/client-cognito-identity': 3.738.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/credential-provider-cognito-identity': 3.738.0
+ '@aws-sdk/credential-provider-env': 3.734.0
+ '@aws-sdk/credential-provider-http': 3.734.0
+ '@aws-sdk/credential-provider-ini': 3.734.0
+ '@aws-sdk/credential-provider-node': 3.738.0
+ '@aws-sdk/credential-provider-process': 3.734.0
+ '@aws-sdk/credential-provider-sso': 3.734.0
+ '@aws-sdk/credential-provider-web-identity': 3.734.0
+ '@aws-sdk/nested-clients': 3.734.0
+ '@aws-sdk/types': 3.734.0
+ '@smithy/core': 3.1.1
'@smithy/credential-provider-imds': 4.0.1
'@smithy/property-provider': 4.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
transitivePeerDependencies:
- - '@aws-sdk/client-sso-oidc'
- aws-crt
- '@aws-sdk/middleware-bucket-endpoint@3.726.0':
+ '@aws-sdk/middleware-bucket-endpoint@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@aws-sdk/util-arn-parser': 3.723.0
'@smithy/node-config-provider': 4.0.1
'@smithy/protocol-http': 5.0.1
@@ -7127,20 +7010,20 @@ snapshots:
'@smithy/util-config-provider': 4.0.0
tslib: 2.8.1
- '@aws-sdk/middleware-expect-continue@3.723.0':
+ '@aws-sdk/middleware-expect-continue@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@smithy/protocol-http': 5.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/middleware-flexible-checksums@3.723.0':
+ '@aws-sdk/middleware-flexible-checksums@3.735.0':
dependencies:
'@aws-crypto/crc32': 5.2.0
'@aws-crypto/crc32c': 5.2.0
'@aws-crypto/util': 5.2.0
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/types': 3.734.0
'@smithy/is-array-buffer': 4.0.0
'@smithy/node-config-provider': 4.0.1
'@smithy/protocol-http': 5.0.1
@@ -7150,36 +7033,36 @@ snapshots:
'@smithy/util-utf8': 4.0.0
tslib: 2.8.1
- '@aws-sdk/middleware-host-header@3.723.0':
+ '@aws-sdk/middleware-host-header@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@smithy/protocol-http': 5.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/middleware-location-constraint@3.723.0':
+ '@aws-sdk/middleware-location-constraint@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/middleware-logger@3.723.0':
+ '@aws-sdk/middleware-logger@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/middleware-recursion-detection@3.723.0':
+ '@aws-sdk/middleware-recursion-detection@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@smithy/protocol-http': 5.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/middleware-sdk-ec2@3.723.0':
+ '@aws-sdk/middleware-sdk-ec2@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-format-url': 3.723.0
+ '@aws-sdk/types': 3.734.0
+ '@aws-sdk/util-format-url': 3.734.0
'@smithy/middleware-endpoint': 4.0.2
'@smithy/protocol-http': 5.0.1
'@smithy/signature-v4': 5.0.1
@@ -7187,20 +7070,20 @@ snapshots:
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/middleware-sdk-rds@3.723.0':
+ '@aws-sdk/middleware-sdk-rds@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-format-url': 3.723.0
+ '@aws-sdk/types': 3.734.0
+ '@aws-sdk/util-format-url': 3.734.0
'@smithy/middleware-endpoint': 4.0.2
'@smithy/protocol-http': 5.0.1
'@smithy/signature-v4': 5.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/middleware-sdk-s3@3.723.0':
+ '@aws-sdk/middleware-sdk-s3@3.740.0':
dependencies:
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/types': 3.734.0
'@aws-sdk/util-arn-parser': 3.723.0
'@smithy/core': 3.1.1
'@smithy/node-config-provider': 4.0.1
@@ -7214,50 +7097,95 @@ snapshots:
'@smithy/util-utf8': 4.0.0
tslib: 2.8.1
- '@aws-sdk/middleware-ssec@3.723.0':
+ '@aws-sdk/middleware-ssec@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/middleware-user-agent@3.726.0':
+ '@aws-sdk/middleware-user-agent@3.734.0':
dependencies:
- '@aws-sdk/core': 3.723.0
- '@aws-sdk/types': 3.723.0
- '@aws-sdk/util-endpoints': 3.726.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/types': 3.734.0
+ '@aws-sdk/util-endpoints': 3.734.0
'@smithy/core': 3.1.1
'@smithy/protocol-http': 5.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/region-config-resolver@3.723.0':
+ '@aws-sdk/nested-clients@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-crypto/sha256-browser': 5.2.0
+ '@aws-crypto/sha256-js': 5.2.0
+ '@aws-sdk/core': 3.734.0
+ '@aws-sdk/middleware-host-header': 3.734.0
+ '@aws-sdk/middleware-logger': 3.734.0
+ '@aws-sdk/middleware-recursion-detection': 3.734.0
+ '@aws-sdk/middleware-user-agent': 3.734.0
+ '@aws-sdk/region-config-resolver': 3.734.0
+ '@aws-sdk/types': 3.734.0
+ '@aws-sdk/util-endpoints': 3.734.0
+ '@aws-sdk/util-user-agent-browser': 3.734.0
+ '@aws-sdk/util-user-agent-node': 3.734.0
+ '@smithy/config-resolver': 4.0.1
+ '@smithy/core': 3.1.1
+ '@smithy/fetch-http-handler': 5.0.1
+ '@smithy/hash-node': 4.0.1
+ '@smithy/invalid-dependency': 4.0.1
+ '@smithy/middleware-content-length': 4.0.1
+ '@smithy/middleware-endpoint': 4.0.2
+ '@smithy/middleware-retry': 4.0.3
+ '@smithy/middleware-serde': 4.0.1
+ '@smithy/middleware-stack': 4.0.1
+ '@smithy/node-config-provider': 4.0.1
+ '@smithy/node-http-handler': 4.0.2
+ '@smithy/protocol-http': 5.0.1
+ '@smithy/smithy-client': 4.1.2
+ '@smithy/types': 4.1.0
+ '@smithy/url-parser': 4.0.1
+ '@smithy/util-base64': 4.0.0
+ '@smithy/util-body-length-browser': 4.0.0
+ '@smithy/util-body-length-node': 4.0.0
+ '@smithy/util-defaults-mode-browser': 4.0.3
+ '@smithy/util-defaults-mode-node': 4.0.3
+ '@smithy/util-endpoints': 3.0.1
+ '@smithy/util-middleware': 4.0.1
+ '@smithy/util-retry': 4.0.1
+ '@smithy/util-utf8': 4.0.0
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
+
+ '@aws-sdk/region-config-resolver@3.734.0':
+ dependencies:
+ '@aws-sdk/types': 3.734.0
'@smithy/node-config-provider': 4.0.1
'@smithy/types': 4.1.0
'@smithy/util-config-provider': 4.0.0
'@smithy/util-middleware': 4.0.1
tslib: 2.8.1
- '@aws-sdk/signature-v4-multi-region@3.723.0':
+ '@aws-sdk/signature-v4-multi-region@3.740.0':
dependencies:
- '@aws-sdk/middleware-sdk-s3': 3.723.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/middleware-sdk-s3': 3.740.0
+ '@aws-sdk/types': 3.734.0
'@smithy/protocol-http': 5.0.1
'@smithy/signature-v4': 5.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/token-providers@3.723.0(@aws-sdk/client-sso-oidc@3.726.0(@aws-sdk/client-sts@3.726.1))':
+ '@aws-sdk/token-providers@3.734.0':
dependencies:
- '@aws-sdk/client-sso-oidc': 3.726.0(@aws-sdk/client-sts@3.726.1)
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/nested-clients': 3.734.0
+ '@aws-sdk/types': 3.734.0
'@smithy/property-provider': 4.0.1
'@smithy/shared-ini-file-loader': 4.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
+ transitivePeerDependencies:
+ - aws-crt
- '@aws-sdk/types@3.723.0':
+ '@aws-sdk/types@3.734.0':
dependencies:
'@smithy/types': 4.1.0
tslib: 2.8.1
@@ -7266,16 +7194,16 @@ snapshots:
dependencies:
tslib: 2.8.1
- '@aws-sdk/util-endpoints@3.726.0':
+ '@aws-sdk/util-endpoints@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@smithy/types': 4.1.0
'@smithy/util-endpoints': 3.0.1
tslib: 2.8.1
- '@aws-sdk/util-format-url@3.723.0':
+ '@aws-sdk/util-format-url@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@smithy/querystring-builder': 4.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
@@ -7284,22 +7212,22 @@ snapshots:
dependencies:
tslib: 2.8.1
- '@aws-sdk/util-user-agent-browser@3.723.0':
+ '@aws-sdk/util-user-agent-browser@3.734.0':
dependencies:
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/types': 3.734.0
'@smithy/types': 4.1.0
bowser: 2.11.0
tslib: 2.8.1
- '@aws-sdk/util-user-agent-node@3.726.0':
+ '@aws-sdk/util-user-agent-node@3.734.0':
dependencies:
- '@aws-sdk/middleware-user-agent': 3.726.0
- '@aws-sdk/types': 3.723.0
+ '@aws-sdk/middleware-user-agent': 3.734.0
+ '@aws-sdk/types': 3.734.0
'@smithy/node-config-provider': 4.0.1
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@aws-sdk/xml-builder@3.723.0':
+ '@aws-sdk/xml-builder@3.734.0':
dependencies:
'@smithy/types': 4.1.0
tslib: 2.8.1
@@ -7580,7 +7508,7 @@ snapshots:
jest-util: 29.7.0
slash: 3.0.0
- '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))':
+ '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))':
dependencies:
'@jest/console': 29.7.0
'@jest/reporters': 29.7.0
@@ -7594,7 +7522,7 @@ snapshots:
exit: 0.1.2
graceful-fs: 4.2.11
jest-changed-files: 29.7.0
- jest-config: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ jest-config: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
jest-haste-map: 29.7.0
jest-message-util: 29.7.0
jest-regex-util: 29.6.3
@@ -8702,51 +8630,51 @@ snapshots:
'@smithy/types': 4.1.0
tslib: 2.8.1
- '@swc/core-darwin-arm64@1.10.9':
+ '@swc/core-darwin-arm64@1.10.11':
optional: true
- '@swc/core-darwin-x64@1.10.9':
+ '@swc/core-darwin-x64@1.10.11':
optional: true
- '@swc/core-linux-arm-gnueabihf@1.10.9':
+ '@swc/core-linux-arm-gnueabihf@1.10.11':
optional: true
- '@swc/core-linux-arm64-gnu@1.10.9':
+ '@swc/core-linux-arm64-gnu@1.10.11':
optional: true
- '@swc/core-linux-arm64-musl@1.10.9':
+ '@swc/core-linux-arm64-musl@1.10.11':
optional: true
- '@swc/core-linux-x64-gnu@1.10.9':
+ '@swc/core-linux-x64-gnu@1.10.11':
optional: true
- '@swc/core-linux-x64-musl@1.10.9':
+ '@swc/core-linux-x64-musl@1.10.11':
optional: true
- '@swc/core-win32-arm64-msvc@1.10.9':
+ '@swc/core-win32-arm64-msvc@1.10.11':
optional: true
- '@swc/core-win32-ia32-msvc@1.10.9':
+ '@swc/core-win32-ia32-msvc@1.10.11':
optional: true
- '@swc/core-win32-x64-msvc@1.10.9':
+ '@swc/core-win32-x64-msvc@1.10.11':
optional: true
- '@swc/core@1.10.9':
+ '@swc/core@1.10.11':
dependencies:
'@swc/counter': 0.1.3
'@swc/types': 0.1.17
optionalDependencies:
- '@swc/core-darwin-arm64': 1.10.9
- '@swc/core-darwin-x64': 1.10.9
- '@swc/core-linux-arm-gnueabihf': 1.10.9
- '@swc/core-linux-arm64-gnu': 1.10.9
- '@swc/core-linux-arm64-musl': 1.10.9
- '@swc/core-linux-x64-gnu': 1.10.9
- '@swc/core-linux-x64-musl': 1.10.9
- '@swc/core-win32-arm64-msvc': 1.10.9
- '@swc/core-win32-ia32-msvc': 1.10.9
- '@swc/core-win32-x64-msvc': 1.10.9
+ '@swc/core-darwin-arm64': 1.10.11
+ '@swc/core-darwin-x64': 1.10.11
+ '@swc/core-linux-arm-gnueabihf': 1.10.11
+ '@swc/core-linux-arm64-gnu': 1.10.11
+ '@swc/core-linux-arm64-musl': 1.10.11
+ '@swc/core-linux-x64-gnu': 1.10.11
+ '@swc/core-linux-x64-musl': 1.10.11
+ '@swc/core-win32-arm64-msvc': 1.10.11
+ '@swc/core-win32-ia32-msvc': 1.10.11
+ '@swc/core-win32-x64-msvc': 1.10.11
'@swc/counter@0.1.3': {}
@@ -9827,13 +9755,13 @@ snapshots:
optionalDependencies:
typescript: 5.7.3
- create-jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)):
+ create-jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)):
dependencies:
'@jest/types': 29.6.3
chalk: 4.1.2
exit: 0.1.2
graceful-fs: 4.2.11
- jest-config: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ jest-config: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
jest-util: 29.7.0
prompts: 2.4.2
transitivePeerDependencies:
@@ -10256,13 +10184,13 @@ snapshots:
dependencies:
eslint: 8.57.1
- eslint-plugin-jest@28.11.0(@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3):
+ eslint-plugin-jest@28.11.0(@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3):
dependencies:
'@typescript-eslint/utils': 8.21.0(eslint@8.57.1)(typescript@5.7.3)
eslint: 8.57.1
optionalDependencies:
'@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)
- jest: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ jest: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
transitivePeerDependencies:
- supports-color
- typescript
@@ -10781,7 +10709,7 @@ snapshots:
klona: 2.0.6
moo: 0.5.2
- google-auth-library@9.15.0(encoding@0.1.13):
+ google-auth-library@9.15.1(encoding@0.1.13):
dependencies:
base64-js: 1.5.1
ecdsa-sig-formatter: 1.0.11
@@ -11313,16 +11241,16 @@ snapshots:
- babel-plugin-macros
- supports-color
- jest-cli@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)):
+ jest-cli@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)):
dependencies:
- '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
'@jest/test-result': 29.7.0
'@jest/types': 29.6.3
chalk: 4.1.2
- create-jest: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ create-jest: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
exit: 0.1.2
import-local: 3.2.0
- jest-config: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ jest-config: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
jest-util: 29.7.0
jest-validate: 29.7.0
yargs: 17.7.2
@@ -11332,7 +11260,7 @@ snapshots:
- supports-color
- ts-node
- jest-config@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)):
+ jest-config@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)):
dependencies:
'@babel/core': 7.26.7
'@jest/test-sequencer': 29.7.0
@@ -11358,7 +11286,7 @@ snapshots:
strip-json-comments: 3.1.1
optionalDependencies:
'@types/node': 22.10.9
- ts-node: 10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)
+ ts-node: 10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)
transitivePeerDependencies:
- babel-plugin-macros
- supports-color
@@ -11391,12 +11319,12 @@ snapshots:
jest-mock: 29.7.0
jest-util: 29.7.0
- jest-extended@4.0.2(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))):
+ jest-extended@4.0.2(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))):
dependencies:
jest-diff: 29.7.0
jest-get-type: 29.6.3
optionalDependencies:
- jest: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ jest: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
jest-get-type@29.6.3: {}
@@ -11447,9 +11375,9 @@ snapshots:
slash: 3.0.0
stack-utils: 2.0.6
- jest-mock-extended@3.0.7(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3):
+ jest-mock-extended@3.0.7(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3):
dependencies:
- jest: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ jest: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
ts-essentials: 10.0.4(typescript@5.7.3)
typescript: 5.7.3
@@ -11598,12 +11526,12 @@ snapshots:
merge-stream: 2.0.0
supports-color: 8.1.1
- jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)):
+ jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)):
dependencies:
- '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
'@jest/types': 29.6.3
import-local: 3.2.0
- jest-cli: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ jest-cli: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
transitivePeerDependencies:
- '@types/node'
- babel-plugin-macros
@@ -13529,12 +13457,12 @@ snapshots:
optionalDependencies:
typescript: 5.7.3
- ts-jest@29.2.5(@babel/core@7.26.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.7))(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3):
+ ts-jest@29.2.5(@babel/core@7.26.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.7))(jest@29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3)))(typescript@5.7.3):
dependencies:
bs-logger: 0.2.6
ejs: 3.1.10
fast-json-stable-stringify: 2.1.0
- jest: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3))
+ jest: 29.7.0(@types/node@22.10.9)(ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3))
jest-util: 29.7.0
json5: 2.2.3
lodash.memoize: 4.1.2
@@ -13548,7 +13476,7 @@ snapshots:
'@jest/types': 29.6.3
babel-jest: 29.7.0(@babel/core@7.26.7)
- ts-node@10.9.2(@swc/core@1.10.9)(@types/node@22.10.9)(typescript@5.7.3):
+ ts-node@10.9.2(@swc/core@1.10.11)(@types/node@22.10.9)(typescript@5.7.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
'@tsconfig/node10': 1.0.11
@@ -13566,7 +13494,7 @@ snapshots:
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
optionalDependencies:
- '@swc/core': 1.10.9
+ '@swc/core': 1.10.11
tsconfig-paths@3.15.0:
dependencies:
diff --git a/pyproject.toml b/pyproject.toml
index 6f45156ddfa069..ab231c3855bc30 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
dependencies = [
- "mkdocs-material==9.5.50",
+ "mkdocs-material==9.6.1",
"mkdocs-awesome-pages-plugin==2.10.1",
]
requires-python = ">=3.11"
diff --git a/test/setup.ts b/test/setup.ts
index 4ee0a3ca978f26..6eddbf176d7aa8 100644
--- a/test/setup.ts
+++ b/test/setup.ts
@@ -13,4 +13,8 @@ jest.mock('../lib/modules/platform/scm', () => ({
scm: mockDeep(),
}));
-jest.mock('../lib/logger', () => mockDeep());
+jest.mock('../lib/logger', () => {
+ return mockDeep({
+ withMeta: (_: Record, cb: () => T): T => cb(),
+ });
+});
diff --git a/tools/docker/Dockerfile b/tools/docker/Dockerfile
index 28338305421329..6caca5c726d78d 100644
--- a/tools/docker/Dockerfile
+++ b/tools/docker/Dockerfile
@@ -5,24 +5,28 @@ ARG BASE_IMAGE_TYPE=slim
# --------------------------------------
# slim image
# --------------------------------------
-FROM ghcr.io/renovatebot/base-image:9.38.1@sha256:a740df262a9bca34a5c3715e90aded0a005aeb46424cfda09194414479e09627 AS slim-base
+FROM ghcr.io/renovatebot/base-image:9.38.3@sha256:e4d31148559728ffb11e0b8e1ff4d52ebc35b9e1e0dc2be5f01075dae939012b AS slim-base
# --------------------------------------
# full image
# --------------------------------------
-FROM ghcr.io/renovatebot/base-image:9.38.1-full@sha256:274c95a8379df589aede998f2b9198ea66310e2f227c286bb17efb9de8a976d6 AS full-base
+FROM ghcr.io/renovatebot/base-image:9.38.3-full@sha256:27675cad452fda603cecbac9662bed944d707bd93457393ae263a7876807c58b AS full-base
ENV RENOVATE_BINARY_SOURCE=global
# --------------------------------------
# build image
# --------------------------------------
-FROM --platform=$BUILDPLATFORM ghcr.io/renovatebot/base-image:9.38.1@sha256:a740df262a9bca34a5c3715e90aded0a005aeb46424cfda09194414479e09627 AS build
+FROM --platform=$BUILDPLATFORM ghcr.io/renovatebot/base-image:9.38.3@sha256:e4d31148559728ffb11e0b8e1ff4d52ebc35b9e1e0dc2be5f01075dae939012b AS build
# We want a specific node version here
# renovate: datasource=node-version
RUN install-tool node 22.13.1
+# corepack is too buggy 😞
+# renovate: datasource=npm
+RUN install-tool pnpm 9.15.4
+
WORKDIR /usr/local/renovate
ARG TARGETPLATFORM
@@ -63,14 +67,14 @@ ENV npm_config_arch=${ARCH} npm_config_platform_arch=${ARCH}
# only fetch deps from lockfile https://pnpm.io/cli/fetch
RUN set -ex; \
- corepack pnpm fetch --prod; \
+ pnpm fetch --prod; \
true
COPY --link . ./
# install npm packages
RUN set -ex; \
- corepack pnpm install --prod --offline --ignore-scripts; \
+ pnpm install --prod --offline --ignore-scripts; \
true
# --------------------------------------
diff --git a/tools/docs/versioning.ts b/tools/docs/versioning.ts
index 6982ed612faa65..c6712f2d6899c6 100644
--- a/tools/docs/versioning.ts
+++ b/tools/docs/versioning.ts
@@ -12,13 +12,13 @@ import {
replaceContent,
} from './utils';
-type Versioning = {
+interface Versioning {
id: string;
displayName: string;
- urls?: string[];
- supportsRanges?: boolean;
+ urls: string[];
+ supportsRanges: boolean;
supportedRangeStrategies?: string[];
-};
+}
export async function generateVersioning(
dist: string,
]