From 70baa4b28bfd4a4b52703ee1ecc11f7f9a0c8b32 Mon Sep 17 00:00:00 2001 From: BraunMatthias <59841349+BraunMatthias@users.noreply.github.com> Date: Mon, 22 Sep 2025 11:20:34 +0200 Subject: [PATCH 01/43] Security warning potential injection in messages (#2088) Co-authored-by: matthia.braun@sap.com Co-authored-by: Mahati Shankar <93712176+smahati@users.noreply.github.com> --- java/event-handlers/indicating-errors.md | 4 ++++ node.js/events.md | 3 +++ 2 files changed, 7 insertions(+) diff --git a/java/event-handlers/indicating-errors.md b/java/event-handlers/indicating-errors.md index 73e0767535..c7abfdfe8c 100644 --- a/java/event-handlers/indicating-errors.md +++ b/java/event-handlers/indicating-errors.md @@ -70,6 +70,10 @@ Writing the messages into explicitly modeled messages properties isn't yet suppo SAP Fiori uses these messages to display detailed information on the UI. The style how a message appears on the UI depends on the severity of the message. +::: warning User Input & Injection Vulnerabilities +Ensure proper validation of the message text and URL if they contain values ​​from user input. +::: + ### Throwing a ServiceException from Error Messages { #throwing-a-serviceexception-from-messages} It is also possible to throw a [ServiceException](https://www.javadoc.io/doc/com.sap.cds/cds-services-api/latest/com/sap/cds/services/ServiceException.html) from error messages. This can, for example, be useful to cancel a request after collecting multiple validation errors. The individual validation checks will collect error messages in the `Messages` API. After the validation checks have been run, you call the `throwIfError()` method. Only if error messages have been collected, this method cancels the request with a [ServiceException](https://www.javadoc.io/doc/com.sap.cds/cds-services-api/latest/com/sap/cds/services/ServiceException.html): diff --git a/node.js/events.md b/node.js/events.md index 8bfdf52dbe..1207671052 100644 --- a/node.js/events.md +++ b/node.js/events.md @@ -548,6 +548,9 @@ req.warn ('Some warning message') The methods are similar to [`req.error()`](#req-error), also accepting the [same arguments](#req-reject), but the messages are collected in `req.messages` instead of `req.errors`, not decorated with stack traces, and returned in a HTTP response header (e.g. `sap-messages`), instead of the response body. +::: warning User Input & Injection Vulnerabilities +Ensure proper validation of the message text if it contains values ​​from user input. +::: ## Error Responses From 56a9da147eb199569cda1a3a6effcab155d9cacb Mon Sep 17 00:00:00 2001 From: Marc Becker Date: Mon, 22 Sep 2025 12:23:19 +0200 Subject: [PATCH 02/43] Fix incorrectly placed @order annotations (#2106) @Order annotations need to be on the SecurityFilterChain bean method to have the correct effect. --- java/operating-applications/dashboard.md | 4 ++-- java/security.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java/operating-applications/dashboard.md b/java/operating-applications/dashboard.md index 74995e3669..911d94fa8f 100644 --- a/java/operating-applications/dashboard.md +++ b/java/operating-applications/dashboard.md @@ -171,10 +171,10 @@ In some cases, your application may run in a complex environment and you simply import org.springframework.security.web.SecurityFilterChain; @Configuration - @Order(1) public class WebSecurity { @Bean + @Order(1) public SecurityFilterChain appFilterChain(HttpSecurity http) throws Exception { return http @@ -189,4 +189,4 @@ In some cases, your application may run in a complex environment and you simply ::: -
\ No newline at end of file +
diff --git a/java/security.md b/java/security.md index 4970eefd84..25f19f7fc0 100644 --- a/java/security.md +++ b/java/security.md @@ -169,10 +169,10 @@ If you want to explicitly change the automatic security configuration, you can a ```java @Configuration @EnableWebSecurity -@Order(1) // needs to have higher priority than CAP security config public class AppSecurityConfig { @Bean + @Order(1) // needs to have higher priority than CAP security config public SecurityFilterChain appFilterChain(HttpSecurity http) throws Exception { return http .securityMatcher(AntPathRequestMatcher.antMatcher("/public/**")) @@ -197,10 +197,10 @@ Another typical example is the configuration of [Spring Actuators](https://docs. ```java @Configuration @EnableWebSecurity -@Order(1) public class ActuatorSecurityConfig { @Bean + @Order(1) public SecurityFilterChain actuatorFilterChain(HttpSecurity http) throws Exception { return http From 6dfaf2717eb0f47600a71bbb90de055aa1d0710c Mon Sep 17 00:00:00 2001 From: ecklie <52252271+ecklie@users.noreply.github.com> Date: Mon, 22 Sep 2025 14:59:30 +0200 Subject: [PATCH 03/43] Mtxs deployment hint (#2102) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hint to avoid race conditions --------- Co-authored-by: René Jeglinsky --- guides/multitenancy/index.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/guides/multitenancy/index.md b/guides/multitenancy/index.md index e6667b2542..3defaffdb1 100644 --- a/guides/multitenancy/index.md +++ b/guides/multitenancy/index.md @@ -772,6 +772,13 @@ cds up --to k8s ::: +:::tip +To prevent potential conflicts during the initial creation of the MTXS Metadata Container `t0`, it is recommended to perform the +initial deployment with only one instance of the MTXS Sidecar.
+As an alternative, you can run the command `cds-mtx upgrade t0` beforehand, such as in a [cf hook](https://help.sap.com/docs/btp/sap-business-technology-platform/module-hooks). +::: + + ### Subscribe **Create a BTP subaccount** to subscribe to your deployed application. This subaccount has to be in the same region as the provider subaccount, for example, `us10`. From ecee456016dace7f54b10639bded55f7a62254eb Mon Sep 17 00:00:00 2001 From: Rene Jeglinsky Date: Wed, 24 Sep 2025 09:25:44 +0200 Subject: [PATCH 04/43] initial topic stub --- tools/console.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 tools/console.md diff --git a/tools/console.md b/tools/console.md new file mode 100644 index 0000000000..36b7d9f95d --- /dev/null +++ b/tools/console.md @@ -0,0 +1,10 @@ +--- +# status: released +synopsis: Learn how to install, configure, and use the CAP Console. +--- + +# CAP Console + +:::tip WIP +More content coming soon +::: \ No newline at end of file From 395bc73baaed5dfe45839ddd448d6476d9f49cc7 Mon Sep 17 00:00:00 2001 From: Rene Jeglinsky Date: Wed, 24 Sep 2025 10:58:04 +0200 Subject: [PATCH 05/43] fix path for deploy and MT and Ext guides for local preview --- menu.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/menu.md b/menu.md index 716409ff24..0560593e0f 100644 --- a/menu.md +++ b/menu.md @@ -88,26 +88,26 @@ ### [Personal Data Management](guides/data-privacy/pdm) ### [Data Retention Management](guides/data-privacy/drm) -## [Deployment](../guides/deployment/) +## [Deployment](guides/deployment/) - ### [Deploy to Cloud Foundry](../guides/deployment/to-cf) - ### [Deploy to Kyma/K8s](../guides/deployment/to-kyma) - ### [Microservices with CAP](../guides/deployment/microservices) - ### [Deploy with Confidence](../guides/deployment/dwc) - ### [Deploy with CI/CD](../guides/deployment/cicd) - ### [Custom Builds](../guides/deployment/custom-builds) - ### [Health Checks](../guides/deployment/health-checks) + ### [Deploy to Cloud Foundry](guides/deployment/to-cf) + ### [Deploy to Kyma/K8s](guides/deployment/to-kyma) + ### [Microservices with CAP](guides/deployment/microservices) + ### [Deploy with Confidence](guides/deployment/dwc) + ### [Deploy with CI/CD](guides/deployment/cicd) + ### [Custom Builds](guides/deployment/custom-builds) + ### [Health Checks](guides/deployment/health-checks) -## [Multitenancy](../guides/multitenancy/) +## [Multitenancy](guides/multitenancy/) - ### [MTX Reference](../guides/multitenancy/mtxs) - ### [MTX Migration](../guides/multitenancy/old-mtx-migration) + ### [MTX Reference](guides/multitenancy/mtxs) + ### [MTX Migration](guides/multitenancy/old-mtx-migration) -## [Extensibility](../guides/extensibility/) +## [Extensibility](guides/extensibility/) - ### [Extend SaaS Apps](../guides/extensibility/customization) - ### [Feature Toggles](../guides/extensibility/feature-toggles) - ### [Reuse & Compose](../guides/extensibility/composition) + ### [Extend SaaS Apps](guides/extensibility/customization) + ### [Feature Toggles](guides/extensibility/feature-toggles) + ### [Reuse & Compose](guides/extensibility/composition) ## [Performance](advanced/performance-modeling) From 003f1c7b30232a407062310f8a159853e5647a77 Mon Sep 17 00:00:00 2001 From: ecklie <52252271+ecklie@users.noreply.github.com> Date: Wed, 24 Sep 2025 17:36:31 +0200 Subject: [PATCH 06/43] Hana tms section preparation (#2101) --- guides/multitenancy/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/guides/multitenancy/index.md b/guides/multitenancy/index.md index 3defaffdb1..a7a14feba8 100644 --- a/guides/multitenancy/index.md +++ b/guides/multitenancy/index.md @@ -987,6 +987,8 @@ cds watch --profile dev ::: +
+ ## SaaS Dependencies {#saas-dependencies} Some of the xsuaa-based services your application consumes need to be registered as _reuse services_ to work in multitenant environments. This holds true for the usage of both the SaaS Registry service and the Subscription Manager Service (SMS). From 6c7fbc432a7f1d78f182b7284bd8accad5470953 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 10:42:19 +0200 Subject: [PATCH 07/43] chore(deps): update dependency @cap-js/cds-typer to v0.38.0 (#2110) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs from Renovate will soon appear from 'Mend'. Learn more [here](https://redirect.github.com/renovatebot/renovate/discussions/37842). This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [@cap-js/cds-typer](https://cap.cloud.sap/) ([source](https://redirect.github.com/cap-js/cds-typer)) | [`0.37.0` -> `0.38.0`](https://renovatebot.com/diffs/npm/@cap-js%2fcds-typer/0.37.0/0.38.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@cap-js%2fcds-typer/0.38.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@cap-js%2fcds-typer/0.37.0/0.38.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
cap-js/cds-typer (@​cap-js/cds-typer) ### [`v0.38.0`](https://redirect.github.com/cap-js/cds-typer/blob/HEAD/CHANGELOG.md#0380---2025-09-24) [Compare Source](https://redirect.github.com/cap-js/cds-typer/compare/v0.37.0...v0.38.0) ##### Added - Added (experimental) flag `cds.env.typer.output_d_ts_files` for generating output `*.d.ts` files instead of `*.ts` ones ##### Changed - unbound actions will now assume the `self` type of `never`, instead of the former `null` ##### Deprecated ##### Removed ##### Fixed ##### Security
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/capire/docs). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a2a4b5a1b1..21a225cb14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -337,9 +337,9 @@ } }, "node_modules/@cap-js/cds-typer": { - "version": "0.37.0", - "resolved": "https://registry.npmjs.org/@cap-js/cds-typer/-/cds-typer-0.37.0.tgz", - "integrity": "sha512-fvzKenHq9GUhpr51lw6u2AttTlTTubm+5teR8cJAoCAsA12B7QnMPEJ7ftarBiygS3bNdJzmfMrczdkpX9btcA==", + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@cap-js/cds-typer/-/cds-typer-0.38.0.tgz", + "integrity": "sha512-X/AAF3A02pNjxDQOpf+om0S+L1MWyFanz9/aQYwYvjUaaU/Tkx26ruziZ2MDbwVrAJ5iA6bSFYs6LP5/+oMdNQ==", "dev": true, "license": "Apache-2.0", "bin": { From f7b284626033966e455d5c086835a298d0a82b8c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 10:42:40 +0200 Subject: [PATCH 08/43] chore(deps): update dependency sass to v1.93.2 (#2104) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs from Renovate will soon appear from 'Mend'. Learn more [here](https://redirect.github.com/renovatebot/renovate/discussions/37842). This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [sass](https://redirect.github.com/sass/dart-sass) | [`1.92.1` -> `1.93.2`](https://renovatebot.com/diffs/npm/sass/1.92.1/1.93.2) | [![age](https://developer.mend.io/api/mc/badges/age/npm/sass/1.93.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/sass/1.92.1/1.93.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
sass/dart-sass (sass) ### [`v1.93.2`](https://redirect.github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#1932) [Compare Source](https://redirect.github.com/sass/dart-sass/compare/1.93.1...1.93.2) - No user-visible changes. ##### JavaScript API - Fix another error in the release process for `@sass/types`. ### [`v1.93.1`](https://redirect.github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#1931) [Compare Source](https://redirect.github.com/sass/dart-sass/compare/1.93.0...1.93.1) - No user-visible changes. ##### JavaScript API - Fix an error in the release process for `@sass/types`. ### [`v1.93.0`](https://redirect.github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#1930) [Compare Source](https://redirect.github.com/sass/dart-sass/compare/1.92.1...1.93.0) - Fix a crash when a style rule contains a nested `@import`, and the loaded file `@use`s a user-defined module as well as `@include`s a top-level mixin which emits top-level declarations. ##### JavaScript API - Release a `@sass/types` package which contains the type annotations used by both the `sass` and `sass-embedded` package without any additional code or dependencies.
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/capire/docs). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 21a225cb14..c1396be890 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7613,9 +7613,9 @@ "peer": true }, "node_modules/sass": { - "version": "1.92.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", - "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", + "version": "1.93.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz", + "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "dev": true, "license": "MIT", "dependencies": { From daaaacb2e85a8291960ed89fcabe432815113765 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 10:43:02 +0200 Subject: [PATCH 09/43] chore(deps): update eslint (#2103) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs from Renovate will soon appear from 'Mend'. Learn more [here](https://redirect.github.com/renovatebot/renovate/discussions/37842). This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.44.0` -> `8.44.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.44.0/8.44.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/8.44.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/8.44.0/8.44.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [eslint](https://eslint.org) ([source](https://redirect.github.com/eslint/eslint)) | [`9.35.0` -> `9.36.0`](https://renovatebot.com/diffs/npm/eslint/9.35.0/9.36.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/eslint/9.36.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint/9.35.0/9.36.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
typescript-eslint/typescript-eslint (@​typescript-eslint/parser) ### [`v8.44.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8441-2025-09-22) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.44.0...v8.44.1) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
eslint/eslint (eslint) ### [`v9.36.0`](https://redirect.github.com/eslint/eslint/compare/v9.35.0...b4857e54e54b5dba96d156cd8d8b4d42dc5a3bf4) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.35.0...v9.36.0)
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/capire/docs). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 82 +++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index c1396be890..2fb0d52baf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1551,9 +1551,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz", - "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", "dev": true, "license": "MIT", "engines": { @@ -2856,16 +2856,16 @@ "license": "MIT" }, "node_modules/@typescript-eslint/parser": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz", - "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", + "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/typescript-estree": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/scope-manager": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/typescript-estree": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4" }, "engines": { @@ -2881,14 +2881,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz", - "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", + "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.44.0", - "@typescript-eslint/types": "^8.44.0", + "@typescript-eslint/tsconfig-utils": "^8.44.1", + "@typescript-eslint/types": "^8.44.1", "debug": "^4.3.4" }, "engines": { @@ -2903,14 +2903,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz", - "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", + "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0" + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2921,9 +2921,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz", - "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", + "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", "dev": true, "license": "MIT", "engines": { @@ -2938,9 +2938,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz", - "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", + "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", "dev": true, "license": "MIT", "engines": { @@ -2952,16 +2952,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz", - "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", + "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.44.0", - "@typescript-eslint/tsconfig-utils": "8.44.0", - "@typescript-eslint/types": "8.44.0", - "@typescript-eslint/visitor-keys": "8.44.0", + "@typescript-eslint/project-service": "8.44.1", + "@typescript-eslint/tsconfig-utils": "8.44.1", + "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/visitor-keys": "8.44.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2981,13 +2981,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.44.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz", - "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==", + "version": "8.44.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", + "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.0", + "@typescript-eslint/types": "8.44.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -4391,9 +4391,9 @@ } }, "node_modules/eslint": { - "version": "9.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz", - "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==", + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4403,7 +4403,7 @@ "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.35.0", + "@eslint/js": "9.36.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", From 73241ae902d06c928eefe5b85917a8fc9d591fa3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 10:50:16 +0200 Subject: [PATCH 10/43] chore: Update CLI texts (#2109) Updates the output of cds CLI texts to the latest version. Co-authored-by: chgeo <7470719+chgeo@users.noreply.github.com> --- tools/assets/help/cds-version-md.out.md | 2 +- tools/assets/help/cds-version.out.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/assets/help/cds-version-md.out.md b/tools/assets/help/cds-version-md.out.md index b90494755b..99b71df996 100644 --- a/tools/assets/help/cds-version-md.out.md +++ b/tools/assets/help/cds-version-md.out.md @@ -6,7 +6,7 @@ | ---------------------- | --------------------------------------- | | @sap/cds | 9.3.1 | | @sap/cds-dk | -- missing -- | -| @sap/cds-compiler | 6.3.4 | +| @sap/cds-compiler | 6.3.6 | | @sap/cds-dk (global) | 9.3.2 | | @sap/cds-fiori | 2.0.1 | | @sap/cds-mtxs | 3.3.1 | diff --git a/tools/assets/help/cds-version.out.md b/tools/assets/help/cds-version.out.md index c5140e813e..cd763573e7 100644 --- a/tools/assets/help/cds-version.out.md +++ b/tools/assets/help/cds-version.out.md @@ -4,7 +4,7 @@ @sap/cds: 9.3.1 @sap/cds-dk: undefined -@sap/cds-compiler: 6.3.4 +@sap/cds-compiler: 6.3.6 @sap/cds-dk (global): 9.3.2 @sap/cds-fiori: 2.0.1 @sap/cds-mtxs: 3.3.1 From ec770d3c43e574d68fea8725d1a55078259ef2e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Jeglinsky?= Date: Thu, 25 Sep 2025 10:51:50 +0200 Subject: [PATCH 11/43] CDS Lint rules: edit (#2068) Co-authored-by: Christian Georgi Co-authored-by: Daniel O'Grady Co-authored-by: Daniel O'Grady <103028279+daogrady@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: ecklie <52252271+ecklie@users.noreply.github.com> Co-authored-by: Christian Georgi --- tools/cds-lint/rules/assoc2many-ambiguous-key.md | 4 ++-- tools/cds-lint/rules/auth-no-empty-restrictions.md | 5 ++--- tools/cds-lint/rules/auth-restrict-grant-service.md | 7 +++---- tools/cds-lint/rules/auth-use-requires.md | 4 ++-- tools/cds-lint/rules/auth-valid-restrict-grant.md | 4 ++-- tools/cds-lint/rules/auth-valid-restrict-keys.md | 4 ++-- tools/cds-lint/rules/auth-valid-restrict-to.md | 4 ++-- tools/cds-lint/rules/auth-valid-restrict-where.md | 4 ++-- tools/cds-lint/rules/extension-restrictions.md | 5 +---- tools/cds-lint/rules/index.md | 13 ++++--------- tools/cds-lint/rules/latest-cds-version.md | 3 +-- tools/cds-lint/rules/no-db-keywords.md | 5 ++--- tools/cds-lint/rules/no-dollar-prefixed-names.md | 2 +- tools/cds-lint/rules/no-java-keywords.md | 6 ++---- tools/cds-lint/rules/no-join-on-draft.md | 2 +- tools/cds-lint/rules/sql-cast-suggestion.md | 4 ++-- tools/cds-lint/rules/sql-null-comparison.md | 5 ++--- tools/cds-lint/rules/start-elements-lowercase.md | 2 +- tools/cds-lint/rules/start-entities-uppercase.md | 2 +- tools/cds-lint/rules/valid-csv-header.md | 2 +- 20 files changed, 36 insertions(+), 51 deletions(-) diff --git a/tools/cds-lint/rules/assoc2many-ambiguous-key.md b/tools/cds-lint/rules/assoc2many-ambiguous-key.md index d53bd2abfb..c2a88772a8 100644 --- a/tools/cds-lint/rules/assoc2many-ambiguous-key.md +++ b/tools/cds-lint/rules/assoc2many-ambiguous-key.md @@ -14,7 +14,7 @@ status: released ## Rule Details -In general an [association/composition to/of `MANY`](../../../cds/cdl#to-many-associations) that targets an entity without `ON` condition is not allowed (as it is an `n:1` relationship). Here, one should always specify an `ON` condition following the canonical expression pattern `. = $self`. The backlink can be any managed to-one association on the many side pointing back to the one side. +An [association/composition to/of `MANY`](../../../cds/cdl#to-many-associations) that targets an entity without an `ON` condition is not allowed because it is an `n:1` relationship. Always specify an `ON` condition following the canonical expression pattern `. = $self`. The backlink can be any managed to-one association on the many side pointing back to the one side. ## Examples @@ -34,7 +34,7 @@ In the following example, we define a unique association from `Authors` to `Book #### ❌   Incorrect example -If we extend this example by creating a view `AuthorView` with a key `ID` and the element `bookIDs` without an `ON` condition, the rule is triggered since the key is no longer unique and `bookIDs` leads to multiple entries: +If you extend this example by creating a view `AuthorView` with a key `ID` and the element `bookIDs` without an `ON` condition, the rule is triggered because the key is no longer unique and `bookIDs` leads to multiple entries: ::: code-group <<< ../examples/assoc2many-ambiguous-key/incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] diff --git a/tools/cds-lint/rules/auth-no-empty-restrictions.md b/tools/cds-lint/rules/auth-no-empty-restrictions.md index baabfb2361..773e676e2e 100644 --- a/tools/cds-lint/rules/auth-no-empty-restrictions.md +++ b/tools/cds-lint/rules/auth-no-empty-restrictions.md @@ -14,7 +14,7 @@ status: released ## Rule Details -The [`@requires` annotation](../../../guides/security/authorization#requires) is a convenience shortcut for `@restrict`. You can use it to control which rule a user needs to have in order to access a given resource. Leaving this field empty is dangerous as it leads to unrestricted access to that service which is a security risk. +The [`@requires` annotation](../../../guides/security/authorization#requires) is a convenience shortcut for `@restrict`. You can use it to control which rule a user needs to access a given resource. Leaving this field empty is dangerous because it leads to unrestricted access to that service, which is a security risk. ## Examples @@ -34,8 +34,7 @@ In the following example, the `AdminService` is correctly setup with `@requires` #### ❌   Incorrect example -If we were to replace the `admin` role by an empty string or provide an empty role array as shown in the next example, -we now have unrestricted access to that service, which the rule makes us aware of: +If you replace the `admin` role with an empty string or provide an empty role array as shown in the next example, you now have unrestricted access to that service, which the rule makes you aware of: ::: code-group <<< ../examples/auth-no-empty-restrictions/incorrect/srv/admin-service.cds#snippet{cds:line-numbers} [srv/admin-service.cds] diff --git a/tools/cds-lint/rules/auth-restrict-grant-service.md b/tools/cds-lint/rules/auth-restrict-grant-service.md index 1c4ef43585..95446469d8 100644 --- a/tools/cds-lint/rules/auth-restrict-grant-service.md +++ b/tools/cds-lint/rules/auth-restrict-grant-service.md @@ -14,9 +14,9 @@ status: released ## Rule Details -Restrictions can be defined on different types of CDS resources, but there are some limitations with regard to supported privileges (see [limitations](../../../guides/security/authorization#supported-combinations-with-cds-resources)). +Restrictions can be defined on different types of CDS resources, but there are some limitations regarding supported privileges (see [limitations](../../../guides/security/authorization#supported-combinations-with-cds-resources)). -Unsupported privilege properties are ignored by the runtime. Especially, for bound or unbound actions, the `grant` property is implicitly removed (assuming `grant: '*'` instead). The same is true for functions. This rule ensures that `@restrict.grant` on service level and for bound/unbound actions and functions is limited to `grant: '*'`. +Unsupported privilege properties are ignored by the runtime. For bound or unbound actions, the `grant` property is implicitly removed (assuming `grant: '*'` instead). The same is true for functions. This rule ensures that `@restrict.grant` on service level and for bound/unbound actions and functions is limited to `grant: '*'`. ## Examples @@ -36,8 +36,7 @@ Let's consider the following example with the `CatalogService` where the functio #### ❌   Incorrect example -If we were to slightly modify the above example and use `grant: ['WRITE']` in the privilege of the function, the rule would be -triggered to inform us that the value of `grant` is limited to `'*'`: +If you modify the above example and use `grant: ['WRITE']` in the privilege of the function, the rule would be triggered to inform you that the value of `grant` is limited to `'*'`: ::: code-group <<< ../examples/auth-restrict-grant-service/incorrect/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] diff --git a/tools/cds-lint/rules/auth-use-requires.md b/tools/cds-lint/rules/auth-use-requires.md index 46fabdb843..b6e275b240 100644 --- a/tools/cds-lint/rules/auth-use-requires.md +++ b/tools/cds-lint/rules/auth-use-requires.md @@ -14,7 +14,7 @@ status: released ## Rule Details -Some annotations such as `@requires` or `@readonly` are just convenience shortcuts for `@restrict`. In actions and services with unrestricted events, it is recommended to use `@requires` instead of `@restrict.to`, which this rule enforces. +Some annotations such as `@requires` or `@readonly` are convenience shortcuts for `@restrict`. In actions and services with unrestricted events, it is recommended to use `@requires` instead of `@restrict.to`, which this rule enforces. ## Examples @@ -34,7 +34,7 @@ In the following example, the `CatalogService` action `addRating` correctly uses #### ❌   Incorrect example -In the following example, the `CatalogService` uses `@restrict` to assign unrestricted events (`grant: *`) to the `Admin` role (`to: Admin`). This which could be written more clearly using `@requires` and so the rule reports a warning: +In the following example, the `CatalogService` uses `@restrict` to assign unrestricted events (`grant: *`) to the `Admin` role (`to: Admin`). This could be written more clearly using `@requires` and so the rule reports a warning: ::: code-group <<< ../examples/auth-use-requires/incorrect/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] diff --git a/tools/cds-lint/rules/auth-valid-restrict-grant.md b/tools/cds-lint/rules/auth-valid-restrict-grant.md index 29d86d3861..efa2452358 100644 --- a/tools/cds-lint/rules/auth-valid-restrict-grant.md +++ b/tools/cds-lint/rules/auth-valid-restrict-grant.md @@ -14,7 +14,7 @@ status: released ## Rule Details -The `grant` property of a `@restrict` privilege defines one or more events that the privilege applies. This rule checks for valid values of `@restrict.grant`, that is, all standard CDS events (such as `READ`, `CREATE`, `UPDATE`, and `DELETE`) on entities. It also suggests to use `*` only when listing events including `*` and to use `WRITE` only when using solely standard CDS events with write semantics (`CREATE`, `DELETE`, `UPDATE`, `UPSERT`). +The `grant` property of a `@restrict` privilege defines one or more events that the privilege applies to. This rule checks for valid values of `@restrict.grant`, that is, all standard CDS events (such as `READ`, `CREATE`, `UPDATE`, and `DELETE`) on entities. It also suggests using `*` only when listing events including `*` and using `WRITE` only when using solely standard CDS events with write semantics (`CREATE`, `DELETE`, `UPDATE`, `UPSERT`). ## Examples @@ -34,7 +34,7 @@ In the following example, `CatalogService.ListOfBooks` is restricted to the `REA #### ❌   Incorrect example -In the next example, the `@restrict.grant` has a typo in the event (that is, `REAAD` instead of `READ`) for the `Viewer` role, which is not a valid value for `@restrict.grant` so the rule will report a warning: +This example shows the `@restrict.grant` with a typo in the event (that is, `REAAD` instead of `READ`) for the `Viewer` role, which is not a valid value for `@restrict.grant` so the rule will report a warning: ::: code-group <<< ../examples/auth-valid-restrict-grant/incorrect/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] diff --git a/tools/cds-lint/rules/auth-valid-restrict-keys.md b/tools/cds-lint/rules/auth-valid-restrict-keys.md index 9fe9892f27..c4ae9c948f 100644 --- a/tools/cds-lint/rules/auth-valid-restrict-keys.md +++ b/tools/cds-lint/rules/auth-valid-restrict-keys.md @@ -14,7 +14,7 @@ status: released ## Rule Details -To define authorizations on a fine-grained level, the `@restrict` annotation allows you to add all kinds of restrictions that are based on static user roles, the request operation, and instance filters. The building block of such a restriction is a single privilege. This rule checks that the privileges defined in `@restrict` have properly spelled `to`, `grant`, and `where` keys. +To define authorizations on a fine-grained level, the `@restrict` annotation allows you to add all kinds of restrictions based on static user roles, the request operation, and instance filters. The building block of such a restriction is a single privilege. This rule checks that the privileges defined in `@restrict` have properly spelled `to`, `grant`, and `where` keys. ## Examples @@ -34,7 +34,7 @@ In the following example, the `@restrict` annotation on `CatalogService.ListOfBo #### ❌   Incorrect example -In the next example, the `@restrict` annotation on `CatalogService.ListOfBooks` has typos in the `grant` key (`grants` instead of `grant`), the `to` key (`too` instead of `to`), and the `where` key (`were` instead of `where`) and the rule will report them as a warning: +This example shows the `@restrict` annotation on `CatalogService.ListOfBooks` with typos in the `grant` key (`grants` instead of `grant`), the `to` key (`too` instead of `to`), and the `where` key (`were` instead of `where`) and the rule will report them as a warning: ::: code-group <<< ../examples/auth-valid-restrict-keys/incorrect/srv/cat-service.cds#snippet{ts:line-numbers} [srv/cat-service.cds] diff --git a/tools/cds-lint/rules/auth-valid-restrict-to.md b/tools/cds-lint/rules/auth-valid-restrict-to.md index 2276f35bd1..e6ac14529f 100644 --- a/tools/cds-lint/rules/auth-valid-restrict-to.md +++ b/tools/cds-lint/rules/auth-valid-restrict-to.md @@ -14,7 +14,7 @@ status: released ## Rule Details -The `to` property of a `@restrict` privilege defines one or more [user roles](../../../guides/security/authorization#roles) or [pseudo roles](../../../guides/security/authorization#pseudo-roles) that the privilege applies to. This rule checks that the values of `@restrict.to` are valid, that is, roles cannot be missing, misspelled and that roles including `any` should be simplified to just `any`. +The `to` property of a `@restrict` privilege defines one or more [user roles](../../../guides/security/authorization#roles) or [pseudo roles](../../../guides/security/authorization#pseudo-roles) that the privilege applies to. This rule checks that the values of `@restrict.to` are valid, that is, roles cannot be missing or misspelled and that roles including `any` should be simplified to just `any`. ## Examples @@ -34,7 +34,7 @@ The following example shows a correct usage of the `@restrict.to` annotation, wh #### ❌   Incorrect example -The next example shows the `@restrict.to` annotation being left empty, which is a violation of this rule and a warning is raised: +This example shows the `@restrict.to` annotation being left empty, which is a violation of this rule and a warning is raised: ::: code-group <<< ../examples/auth-valid-restrict-to/incorrect/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] diff --git a/tools/cds-lint/rules/auth-valid-restrict-where.md b/tools/cds-lint/rules/auth-valid-restrict-where.md index 8abc71bee6..a45d84e4b5 100644 --- a/tools/cds-lint/rules/auth-valid-restrict-where.md +++ b/tools/cds-lint/rules/auth-valid-restrict-where.md @@ -14,7 +14,7 @@ status: released ## Rule Details -The `where` property of a [`@restrict`](/guides/security/authorization#restrict-annotation) privilege defines a filter expression that restricts the access on an instance level (optional). This rule checks that the values of `@restrict.where` are valid, that is, the filter expression must be a valid expression that compiles without any errors. +The `where` property of a [`@restrict`](/guides/security/authorization#restrict-annotation) privilege defines a filter expression that restricts access on an instance level (optional). This rule checks that the values of `@restrict.where` are valid, that is, the filter expression must be a valid expression that compiles without any errors. ## Examples @@ -34,7 +34,7 @@ In the following example, the `@restrict` privilege is defined with a valid `whe #### ❌   Incorrect example -In the next example, the `@restrict` privilege is defined with an invalid `where` property `CreatedBy === $user`. Since this is not a valid filter expression according to the CDS compiler, the rule reports a warning: +This example shows the `@restrict` privilege defined with an invalid `where` property `CreatedBy === $user`. Since this is not a valid filter expression according to the CDS compiler, the rule reports a warning: ::: code-group <<< ../examples/auth-valid-restrict-where/incorrect/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] diff --git a/tools/cds-lint/rules/extension-restrictions.md b/tools/cds-lint/rules/extension-restrictions.md index 3ba52c7da8..dc3c44b65f 100644 --- a/tools/cds-lint/rules/extension-restrictions.md +++ b/tools/cds-lint/rules/extension-restrictions.md @@ -14,10 +14,7 @@ status: released ## Rule Details -CAP provides intrinsic extensibility, which means all your entities and services are extensible by default. -Your SaaS app becomes the base app for extensions by your customers, and your data model the base model. Normally, -you'll want to restrict which services or entities your SaaS customers are allowed to extend and to what degree they may do so. -This rule ensures that extensions do not violate any restrictions set by the extended SaaS app. +CAP provides intrinsic extensibility, which means all your entities and services are extensible by default. Your SaaS app becomes the base app for extensions by your customers, and your data model becomes the base model. Normally, you want to restrict which services or entities your SaaS customers are allowed to extend and to what degree they may do so. This rule ensures that extensions do not violate any restrictions set by the extended SaaS app. ## Examples diff --git a/tools/cds-lint/rules/index.md b/tools/cds-lint/rules/index.md index b89e50377d..718e652a08 100644 --- a/tools/cds-lint/rules/index.md +++ b/tools/cds-lint/rules/index.md @@ -16,16 +16,13 @@ Below you can find all rules of the `@sap/eslint-plugin-cds` ESLint plugin. They are grouped by categories [Model Validation](#model-validation), [JavaScript](#javascript), and [Environment](#environment) to help you understand their purpose. -Your standard CDS project configuration turns on a subset of these rules by default, namely the *recommended* -( ✅ ) rules to ensure basic standards are met. +Your standard CDS project configuration turns on a subset of these rules by default, namely the *recommended* ( ✅ ) rules to ensure basic standards are met. ## Model Validation -Model Validation rules are used to validate CDS models within projects. -They are used to enforce security, naming conventions, or other best practices. +Model Validation rules are used to validate CDS models within projects. They are used to enforce security, naming conventions, or other best practices. -Note, that while all recommended ( ✅ ) model rules run with the CLI, only a number of them are -enabled and visible in the editor by default ( 👀 ). +Note that while all recommended ( ✅ ) model rules run with the CLI, only a number of them are enabled and visible in the editor by default ( 👀 ). ::: details * *Editor default* rules: Rules that are enabled in the editor by default only rely on the current file as their rule context. These are quick to execute and can react on file changes. @@ -37,9 +34,7 @@ slow or expensive processes. These are slow to execute and by default only run w ## Environment -Environment rules are used to check for proper and up-to-date CDS project environments. -These are only run via the command line and are not available in the editor as they often can't be -pinpointed to any particular file. +Environment rules are used to check for proper and up-to-date CDS project environments. These run only via the command line and are not available in the editor because they often cannot be pinpointed to any particular file. diff --git a/tools/cds-lint/rules/latest-cds-version.md b/tools/cds-lint/rules/latest-cds-version.md index 6fa9623d2d..ff091295fa 100644 --- a/tools/cds-lint/rules/latest-cds-version.md +++ b/tools/cds-lint/rules/latest-cds-version.md @@ -14,8 +14,7 @@ status: released ## Rule Details -It's recommended to always use the latest version of `@sap/cds` to benefit from the latest features and bug fixes. -This rule checks whether the latest `@sap/cds` version is being used and reports back in case a newer version is available. +It is recommended to always use the latest version of `@sap/cds` to benefit from the latest features and bug fixes. This rule checks whether the latest `@sap/cds` version is being used and reports back in case a newer version is available. ## Examples diff --git a/tools/cds-lint/rules/no-db-keywords.md b/tools/cds-lint/rules/no-db-keywords.md index ec5f1bc1aa..733af92e0e 100644 --- a/tools/cds-lint/rules/no-db-keywords.md +++ b/tools/cds-lint/rules/no-db-keywords.md @@ -14,8 +14,7 @@ status: released ## Rule Details -The CDS compiler and CAP runtimes provide smart quoting for reserved words in SQLite so that they can still be used in most situations. -But in general reserved words cannot be used as identifiers and this rule warns you if you use any of the [reserved SQL keywords](https://www.sqlite.org/lang_keywords.html). +The CDS compiler and CAP runtimes provide smart quoting for reserved words in SQLite so they can still be used in most situations. But in general reserved words cannot be used as identifiers and this rule warns you if you use any of the [reserved SQL keywords](https://www.sqlite.org/lang_keywords.html). ## Examples @@ -36,7 +35,7 @@ In the following example, none of the reserved SQL keywords are used as identifi #### ❌   Incorrect example -In the next example, the reserved SQL keyword `Order` is used as an entity name, so the rule will raise a warning: +This example shows the reserved SQL keyword `Order` used as an entity name, so the rule will raise a warning: ::: code-group <<< ../examples/no-db-keywords/incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] diff --git a/tools/cds-lint/rules/no-dollar-prefixed-names.md b/tools/cds-lint/rules/no-dollar-prefixed-names.md index e3ccfed5fa..5958fe5df2 100644 --- a/tools/cds-lint/rules/no-dollar-prefixed-names.md +++ b/tools/cds-lint/rules/no-dollar-prefixed-names.md @@ -34,7 +34,7 @@ In the following example, all elements names are well defined and do not start w #### ❌   Incorrect example -In the next example, the element `$pages` starts with `$` and so the rule will raise an error for this element: +This example shows the element `$pages` that starts with `$` and so the rule will raise an error for this element: ::: code-group <<< ../examples/no-dollar-prefixed-names/incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] diff --git a/tools/cds-lint/rules/no-java-keywords.md b/tools/cds-lint/rules/no-java-keywords.md index 911bfb92b6..06717d344c 100644 --- a/tools/cds-lint/rules/no-java-keywords.md +++ b/tools/cds-lint/rules/no-java-keywords.md @@ -14,9 +14,7 @@ status: released ## Rule Details -The CAP Java code generation bases its class and method names on CDS entities. -If reserved Java keywords are used as CDS identifiers, the code generation or compilation may fail. -This rule helps identify such identifiers early on and suggest to use the `@cds.java.name` annotation. +The CAP Java code generation bases its class and method names on CDS entities. If reserved Java keywords are used as CDS identifiers, the code generation or compilation may fail. This rule helps identify such identifiers early on and suggests using the `@cds.java.name` annotation. ## Examples @@ -37,7 +35,7 @@ In the following example, use of the reserved Java keyword as identifiers is fix #### ❌   Incorrect example -In the next example, the reserved SQL keyword `new` is used as an element name, so the rule will raise a warning: +This example shows the reserved SQL keyword `new` used as an element name, so the rule will raise a warning: ::: code-group <<< ../examples/no-java-keywords/incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] diff --git a/tools/cds-lint/rules/no-join-on-draft.md b/tools/cds-lint/rules/no-join-on-draft.md index 618d60fbe0..a5f31feb7b 100644 --- a/tools/cds-lint/rules/no-join-on-draft.md +++ b/tools/cds-lint/rules/no-join-on-draft.md @@ -34,7 +34,7 @@ In the following example, no draft-enabled entities are used in the service `Cat #### ❌   Incorrect example -In the next example, the service `CatalogService` uses a draft-enabled entity and makes use of `JOIN`, which violates the rule: +This example shows the service `CatalogService` using a draft-enabled entity and making use of `JOIN`, which violates the rule: ::: code-group <<< ../examples/no-join-on-draft/incorrect/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] diff --git a/tools/cds-lint/rules/sql-cast-suggestion.md b/tools/cds-lint/rules/sql-cast-suggestion.md index b3a44b70af..f9bd060f31 100644 --- a/tools/cds-lint/rules/sql-cast-suggestion.md +++ b/tools/cds-lint/rules/sql-cast-suggestion.md @@ -14,7 +14,7 @@ status: released ## Rule Details -With compiler v2, appending a type declaration to a column expression in a view's query doesn't generate a cast in SQL anymore, as that created conflicts with various database-specific behaviors. This rule ensures that such casts are added explicitly by suggesting possible missing SQL casts. +With compiler v2, appending a type declaration to a column expression in a view's query doesn't generate a cast in SQL anymore because that created conflicts with various database-specific behaviors. This rule ensures that such casts are added explicitly by suggesting possible missing SQL casts. ## Examples @@ -34,7 +34,7 @@ In the following example, the entity `ListOfBooks` contains explicit casts for e #### ❌   Incorrect example -In the next example, the rule will be triggered for elements `name1` and `name2` because they require explicit casts: +This example shows the rule triggered for elements `name1` and `name2` because they require explicit casts: ::: code-group <<< ../examples/sql-cast-suggestion/incorrect/db/schema.cds#snippet{ts:line-numbers} [db/schema.cds] diff --git a/tools/cds-lint/rules/sql-null-comparison.md b/tools/cds-lint/rules/sql-null-comparison.md index dfaf847a34..21246622eb 100644 --- a/tools/cds-lint/rules/sql-null-comparison.md +++ b/tools/cds-lint/rules/sql-null-comparison.md @@ -15,8 +15,7 @@ status: released ## Rule Details -Comparing values against `null` in views is a common pitfall in SQL. -This rules helps find places where incorrect SQL comparisons are used and proposes to use `IS NULL` or `IS NOT NULL` instead. +Comparing values against `null` in views is a common pitfall in SQL. This rule helps find places where incorrect SQL comparisons are used and proposes using `IS NULL` or `IS NOT NULL` instead. ## Examples @@ -36,7 +35,7 @@ In the following example, the rule is satisfied because `null` comparison is val #### ❌   Incorrect example -In the next example, the rule reports a warning, because the comparison `= null` is not correct: +This example shows the rule reporting a warning because the comparison `= null` is not correct: ::: code-group <<< ../examples/sql-null-comparison/incorrect/srv/cat-service.cds#snippet{cds:line-numbers} [db/schema.cds] diff --git a/tools/cds-lint/rules/start-elements-lowercase.md b/tools/cds-lint/rules/start-elements-lowercase.md index bfc4fc70be..fdace0981e 100644 --- a/tools/cds-lint/rules/start-elements-lowercase.md +++ b/tools/cds-lint/rules/start-elements-lowercase.md @@ -34,7 +34,7 @@ In the following example, the rule is satisfied because the element name `title` #### ❌   Incorrect example -In the next example, the rule will report a warning, because the element name `Title` starts with an uppercase letter: +This example shows the rule reporting a warning because the element name `Title` starts with an uppercase letter: ::: code-group <<< ../examples/start-elements-lowercase/incorrect/db/schema.cds#snippet{ts:line-numbers} [db/schema.cds] diff --git a/tools/cds-lint/rules/start-entities-uppercase.md b/tools/cds-lint/rules/start-entities-uppercase.md index e36b017fc0..b6a04ba856 100644 --- a/tools/cds-lint/rules/start-entities-uppercase.md +++ b/tools/cds-lint/rules/start-entities-uppercase.md @@ -35,7 +35,7 @@ In the following example, the rule is satisfied because the entity name `Books` #### ❌   Incorrect example -In the next example, the rule reports a warning, because the entity name `books` starts with a lowercase letter: +This example shows the rule reporting a warning because the entity name `books` starts with a lowercase letter: ::: code-group <<< ../examples/start-entities-uppercase/incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] diff --git a/tools/cds-lint/rules/valid-csv-header.md b/tools/cds-lint/rules/valid-csv-header.md index 68145cfee5..de93183571 100644 --- a/tools/cds-lint/rules/valid-csv-header.md +++ b/tools/cds-lint/rules/valid-csv-header.md @@ -40,7 +40,7 @@ The following example shows a correct CSV file header that matches the column na #### ❌   Incorrect example -In the next example, there's a typo in the header of the CSV file. The column name `title` is misspelled as `tile`, so the rule reports a warning: +This example shows a typo in the header of the CSV file. The column name `title` is misspelled as `tile`, so the rule reports a warning: ::: code-group <<< ../examples/valid-csv-header/incorrect/db/data/sap.capire.bookshop-Books.csv#snippet{csv:line-numbers{1}} [db/data/sap.capire.bookshop-Books.csv] From bc1cb0605e6825f17db842487b5fca87bf962b0b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 11:28:22 +0200 Subject: [PATCH 12/43] chore(deps): update dependency eslint-plugin-vue to v10 (#2072) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs from Renovate will soon appear from 'Mend'. Learn more [here](https://redirect.github.com/renovatebot/renovate/discussions/37842). This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [eslint-plugin-vue](https://eslint.vuejs.org) ([source](https://redirect.github.com/vuejs/eslint-plugin-vue)) | [`^9.11.0` -> `^10.0.0`](https://renovatebot.com/diffs/npm/eslint-plugin-vue/9.33.0/10.5.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-vue/10.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-vue/9.33.0/10.5.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
vuejs/eslint-plugin-vue (eslint-plugin-vue) ### [`v10.5.0`](https://redirect.github.com/vuejs/eslint-plugin-vue/blob/HEAD/CHANGELOG.md#1050) [Compare Source](https://redirect.github.com/vuejs/eslint-plugin-vue/compare/v10.4.0...v10.5.0) ##### Minor Changes - Added `ignoredObjectNames` option to [`vue/no-async-in-computed-properties`](https://eslint.vuejs.org/rules/no-async-in-computed-properties.html) ([#​2927](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2927)) - Added `ignorePattern` option to [`vue/no-v-html`](https://eslint.vuejs.org/rules/no-v-html.html) ([#​2857](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2857)) - Added `sortLineLength` option to [`vue/attributes-order`](https://eslint.vuejs.org/rules/attributes-order.html) ([#​2759](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2759)) - Changed [`vue/component-name-in-template-casing`](https://eslint.vuejs.org/rules/component-name-in-template-casing.html) `globals` option to support regex patterns ([#​2928](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2928)) - Changed [`vue/valid-define-options`](https://eslint.vuejs.org/rules/valid-define-options.html) to allow local literal constant references ([#​2920](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2920)) - Changed [`vue/no-mutating-props`](https://eslint.vuejs.org/rules/no-mutating-props.html) and [`vue/no-side-effects-in-computed-properties`](https://eslint.vuejs.org/rules/no-side-effects-in-computed-properties.html) rules to detect `Object.assign` mutations ([#​2929](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2929)) - Added [`@stylistic/eslint-plugin`](https://eslint.style/) as optional peer dependency ([#​2884](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2884)) ##### Patch Changes - Changed [`vue/define-macros-order`](https://eslint.vuejs.org/rules/define-macros-order.html) to ignore enum declarations and `declare` statements ([#​2918](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2918)) ### [`v10.4.0`](https://redirect.github.com/vuejs/eslint-plugin-vue/blob/HEAD/CHANGELOG.md#1040) [Compare Source](https://redirect.github.com/vuejs/eslint-plugin-vue/compare/v10.3.0...v10.4.0) ##### Minor Changes - Added `ignoreParents` option to [`vue/no-deprecated-slot-attribute`](https://eslint.vuejs.org/rules/no-deprecated-slot-attribute.html) ([#​2784](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2784)) - Added new [`vue/no-negated-v-if-condition`](https://eslint.vuejs.org/rules/no-negated-v-if-condition.html) rule ([#​2794](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2794)) - Added new [`vue/no-negated-condition`](https://eslint.vuejs.org/rules/no-negated-condition.html) rule ([#​2795](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2795)) ##### Patch Changes - Resolved TypeScript compatibility issues introduced by [eslint-typegen](https://redirect.github.com/antfu/eslint-typegen) ([#​2790](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2790)) - Fixed inconsistent quotes in [`vue/block-lang`](https://eslint.vuejs.org/rules/block-lang.html) error messages ([#​2805](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2805)) ### [`v10.3.0`](https://redirect.github.com/vuejs/eslint-plugin-vue/blob/HEAD/CHANGELOG.md#1030) [Compare Source](https://redirect.github.com/vuejs/eslint-plugin-vue/compare/v10.2.0...v10.3.0) ##### Minor Changes - Added [`@typescript-eslint/parser`](https://typescript-eslint.io/packages/parser) as an optional peer dependency ([#​2775](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2775)) - Add TypeScript IntelliSense support via [eslint-typegen](https://redirect.github.com/antfu/eslint-typegen) ([#​2770](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2770)) - [`vue/no-deprecated-slot-attribute`](https://eslint.vuejs.org/rules/no-deprecated-slot-attribute.html) `ignore` option now supports regex patterns ([#​2773](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2773)) ##### Patch Changes - Fixed false negatives when using typescript-eslint v8 in [`vue/script-indent`](https://eslint.vuejs.org/rules/script-indent.html) rule ([#​2775](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2775)) - Update resources ([#​2752](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2752)) - [`vue/no-restricted-html-elements`](https://eslint.vuejs.org/rules/no-restricted-html-elements.html) now also checks SVG and MathML elements ([#​2755](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2755)) ### [`v10.2.0`](https://redirect.github.com/vuejs/eslint-plugin-vue/blob/HEAD/CHANGELOG.md#1020) [Compare Source](https://redirect.github.com/vuejs/eslint-plugin-vue/compare/v10.1.0...v10.2.0) ##### Minor Changes - [vue/no-restricted-html-elements](https://eslint.vuejs.org/rules/no-restricted-html-elements.html) now accepts multiple elements in each entry. ([#​2750](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2750)) ##### Patch Changes - Updates resources ([#​2747](https://redirect.github.com/vuejs/eslint-plugin-vue/pull/2747)) ### [`v10.1.0`](https://redirect.github.com/vuejs/eslint-plugin-vue/releases/tag/v10.1.0) [Compare Source](https://redirect.github.com/vuejs/eslint-plugin-vue/compare/v10.0.1...v10.1.0) #### ✨ Enhancements - [#​2734](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2734) Improved `allowlist` option of [`vue/no-bare-strings-in-template`](https://eslint.vuejs.org/rules/no-bare-strings-in-template.html) rule to accept regex. - [#​2736](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2736) Added [`vue/define-props-destructuring`](https://eslint.vuejs.org/rules/define-props-destructuring.html) rule that enforce consistent style for props destructuring. - [#​2685](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2685) Added `disallowComments` option to [`vue/no-multiple-template-root`](https://eslint.vuejs.org/rules/no-multiple-template-root.html) rule. **Full Changelog**: ### [`v10.0.1`](https://redirect.github.com/vuejs/eslint-plugin-vue/releases/tag/v10.0.1) [Compare Source](https://redirect.github.com/vuejs/eslint-plugin-vue/compare/v10.0.0...v10.0.1) #### 🐛 Bug Fixes - [#​2700](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2700) Fixed incorrect type for `.eslintrc` configs. - [#​2703](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2703) Fixed false negatives for multiple script blocks in [`vue/prefer-use-template-ref`](https://eslint.vuejs.org/rules/prefer-use-template-ref.html) rule. - [#​2726](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2726) Fixed false positives for tagged template expressions in [`vue/no-ref-as-operand`](https://eslint.vuejs.org/rules/no-ref-as-operand.html) rule. - [#​2728](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2728) Fixed false negatives for props destructure in [`vue/require-default-prop`](https://eslint.vuejs.org/rules/require-default-prop.html) rule. - [#​2731](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2731) Fixed false positives for renamed props in [`vue/no-dupe-keys`](https://eslint.vuejs.org/rules/no-dupe-keys.html) rule. #### ⚙️ Updates - [#​2701](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2701) Improved the report location for [`vue/no-export-in-script-setup`](https://eslint.vuejs.org/rules/no-export-in-script-setup.html) rule. - [#​2724](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2724) Improved the report location for [`vue/html-self-closing`](https://eslint.vuejs.org/rules/html-self-closing.html) rule. **Full Changelog**: ### [`v10.0.0`](https://redirect.github.com/vuejs/eslint-plugin-vue/releases/tag/v10.0.0) [Compare Source](https://redirect.github.com/vuejs/eslint-plugin-vue/compare/v9.33.0...v10.0.0) #### 💥 Breaking changes - [#​2630](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2630) Changed Versioning Policy: - Allow minor versions of this plugin to enhance the checks for new features in Vue and Nuxt. - Allow updating deprecated/reserved HTML+SVG element tag names in minor versions, see [#​2171](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2171). - [#​2645](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2645) Removed deprecated rules (see [removed rules](https://eslint.vuejs.org/rules/#removed)). - [#​2669](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2669) Dropped support for old versions of ESLint and Node.js. New minimum requirements: - Node.js: `^18.18.0 || ^20.9.0 || >=21.1.0` - ESLint: `^8.57.0 || ^9.0.0` - Updated configs: - [#​2627](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2627) Added [`vue/block-order`](https://eslint.vuejs.org/rules/block-order.html) rule to recommended configs (replaces the removed `vue/component-tags-order` rule). - [#​2628](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2628) Added [`vue/no-deprecated-delete-set`](https://eslint.vuejs.org/rules/no-deprecated-delete-set.html) rule to vue3-essential config. - [#​2629](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2629) Added [`vue/no-deprecated-model-definition`](https://eslint.vuejs.org/rules/no-deprecated-model-definition.html) rule to vue3-essential config. - [#​2640](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2640) Added [`vue/no-required-prop-with-default`](https://eslint.vuejs.org/rules/no-required-prop-with-default.html) rule to recommended configs. - [#​2653](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2653) Added [`vue/valid-define-options`](https://eslint.vuejs.org/rules/valid-define-options.html) rule to vue3-essential config. - [#​2674](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2674) Removed globals from configs. You may need to configure them manually now, see . - [#​2648](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2648) Renamed `.eslintrc` configs (to match `eslint.config.js` config names; see PR for comparison). - [#​2668](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2668) Changed `.eslintrc` base config so that [vue-eslint-parser](https://redirect.github.com/vuejs/vue-eslint-parser) is only used for `.vue` files. - [#​2670](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2670) Changed [vue-eslint-parser](https://redirect.github.com/vuejs/vue-eslint-parser) to peer dependency. - [#​2697](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2697) Upgraded [vue-eslint-parser](https://redirect.github.com/vuejs/vue-eslint-parser) to v10. - This includes [vuejs/vue-eslint-parser#195](https://redirect.github.com/vuejs/vue-eslint-parser/pull/195), which should make the parser much faster for large TypeScript projects :zap: - [#​2153](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2153) Added `slots` and `expose` to the default order of [`vue/order-in-components`](https://eslint.vuejs.org/rules/order-in-components.html) rule. - [#​2626](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2626) Removed legacy option from [`vue/custom-event-name-casing`](https://eslint.vuejs.org/rules/custom-event-name-casing.html) rule. - [#​2655](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2655) Removed unused `runOutsideVue` option from [`vue/sort-keys`](https://eslint.vuejs.org/rules/sort-keys.html) rule. - [#​2652](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2652) Removed `setup-compiler-macros` environments. #### ✨ Enhancements - [#​2693](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2693) Improved type resolution for generic types and improved the rules for checking type-only macros. - [#​2684](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2684) Added [`vue/no-import-compiler-macros`](https://eslint.vuejs.org/rules/no-import-compiler-macros.html) rule that disallows importing Vue compiler macros. - [#​2694](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2694) Added `except` option to [`vue/prefer-true-attribute-shorthand`](https://eslint.vuejs.org/rules/prefer-true-attribute-shorthand.html) rule. - [#​2311](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2311) Improved the plugin to check for objects declared with Nuxt3 [`defineNuxtComponent()`](https://nuxt.com/docs/api/utils/define-nuxt-component). #### ⚙️ Updates - [#​2171](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2171) Updated resources. - [#​2675](https://redirect.github.com/vuejs/eslint-plugin-vue/issues/2675) Deprecated Vue 2 only rules. They will be removed in eslint-plugin-vue v11. **Full Changelog**:
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/capire/docs). --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Christian Georgi --- eslint.config.mjs | 6 +- package-lock.json | 863 ++++++++---------- package.json | 2 +- .../correct/srv/AdminService.js | 7 +- .../incorrect/srv/AdminService.js | 9 +- .../incorrect/srv/admin-service.js | 4 +- 6 files changed, 419 insertions(+), 472 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 4c2532a5d1..1825305b0a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,5 +1,6 @@ import cds from '@sap/cds/eslint.config.mjs' import vue from 'eslint-plugin-vue' +import globals from 'globals' export default [ { @@ -12,11 +13,14 @@ export default [ ...cds.recommended, ...vue.configs['flat/essential'], { - files: ['*.vue', '**/*.vue'], + files: ['*.vue', '**/*.vue', '**/*.js'], languageOptions: { parserOptions: { parser: '@typescript-eslint/parser' }, + globals: { + ...globals.browser + } }, rules: { 'vue/multi-word-component-names': 0, diff --git a/package-lock.json b/package-lock.json index 2fb0d52baf..f879055b4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "adm-zip": "^0.5.10", "cspell": "^9.0.0", "eslint": "^9.0.0", - "eslint-plugin-vue": "^9.11.0", + "eslint-plugin-vue": "^10.0.0", "fflate": "^0.8.2", "gray-matter": "^4.0.3", "markdownlint-cli": ">=0.35.0", @@ -29,16 +29,16 @@ } }, "node_modules/@algolia/abtesting": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", - "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.4.0.tgz", + "integrity": "sha512-N0blWT/C0KOZ/OJ9GXBX66odJZlrYjMj3M+01y8ob1mjBFnBaBo7gOCyHBDQy60+H4pJXp3pSGlJOqJIueBH+A==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" @@ -94,41 +94,41 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", - "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.38.0.tgz", + "integrity": "sha512-15d6zv8vtj2l9pnnp/EH7Rhq3/snCCHRz56NnX6xIUPrbJl5gCsIYXAz8C2IEkwOpoDb0r5G6ArY2gKdVMNezw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", - "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.38.0.tgz", + "integrity": "sha512-jJIbYAhYvTG3+gEAP5Q5Dp6PFJfUR+atz5rsqm5KjAKK+faLFdHJbM2IbOo0xdyGd+SH259MzfQKLJ9mZZ27dQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", - "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.38.0.tgz", + "integrity": "sha512-aMCXzVPGJTeQnVU3Sdf30TfMN2+QyWcjfPTCCHyqVVgjPipb6RnK40aISGoO+rlYjh9LunDsNVFLwv+JEIF8bQ==", "dev": true, "license": "MIT", "engines": { @@ -136,151 +136,151 @@ } }, "node_modules/@algolia/client-insights": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", - "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.38.0.tgz", + "integrity": "sha512-4c3FbpMiJX+VcaAj0rYaQdTLS/CkrdOn4hW+5y1plPov7KC7iSHai/VBbirmHuAfW1hVPCIh1w/4erKKTKuo+Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", - "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.38.0.tgz", + "integrity": "sha512-FzLs6c8TBL4FSgNfnH2NL7O33ktecGiaKO4ZFG51QYORUzD5d6YwB9UBteaIYu/sgFoEdY57diYU4vyBH8R6iA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", - "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.38.0.tgz", + "integrity": "sha512-7apiahlgZLvOqrh0+hAYAp/UWjqz6AfSJrCwnsoQNzgIT09dLSPIKREelkuQeUrKy38vHWWpSQE3M0zWSp/YrA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", - "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.38.0.tgz", + "integrity": "sha512-PTAFMJOpVtJweExEYYgdmSCC6n4V/R+ctDL3fRQy77ulZM/p+zMLIQC9c7HCQE1zqpauvVck3f2zYSejaUTtrw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", - "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.38.0.tgz", + "integrity": "sha512-qGSUGgceJHGyJLZ06bFLwVe2Tpf9KwabmoBjFvFscVmMmU5scKya6voCYd9bdX7V0Xy1qya9MGbmTm4zlLuveQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", - "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.38.0.tgz", + "integrity": "sha512-VnCtAUcHirvv/dDHg9jK1Z5oo4QOC5FKDxe40x8qloru2qDcjueT34jiAsB0gRos3VWf9v4iPSYTqMIFOcADpQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", - "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.38.0.tgz", + "integrity": "sha512-fqgeU9GqxQorFUeGP4et1MyY28ccf9PCeciHwDPSbPYYiTqBItHdUIiytsNpjC5Dnc0RWtuXWCltLwSw9wN/bQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/client-common": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", - "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.38.0.tgz", + "integrity": "sha512-nAUKbv4YQIXbpPi02AQvSPisD5FDDbT8XeYSh9HFoYP0Z3IpBLLDg7R4ahPvzd7gGsVKgEbXzRPWESXSji5yIg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", - "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.38.0.tgz", + "integrity": "sha512-bkuAHaadC6OxJd3SVyQQnU1oJ9G/zdCqua7fwr1tJDrA/v7KzeS5np4/m6BuRUpTgVgFZHSewGnMcgj9DLBoaQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.38.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", - "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.38.0.tgz", + "integrity": "sha512-yHDKZTnMPR3/4bY0CVC1/uRnnbAaJ+pctRuX7G/HflBkKOrnUBDEGtQQHzEfMz2FHZ/tbCL+Q9r6mvwTSGp8nw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.35.0" + "@algolia/client-common": "5.38.0" }, "engines": { "node": ">= 14.0.0" @@ -307,13 +307,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.28.2" + "@babel/types": "^7.28.4" }, "bin": { "parser": "bin/babel-parser.js" @@ -323,9 +323,9 @@ } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -603,23 +603,23 @@ "license": "MIT" }, "node_modules/@cspell/dict-en_us": { - "version": "4.4.18", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.18.tgz", - "integrity": "sha512-6Le961Q0AIfVp3nKuSJJD/9NfnTYA1N/MLAaeWKCABEvhzhopeyGrykwejd0SA4m64WBUNEfSlsgselYWoDSjQ==", + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.19.tgz", + "integrity": "sha512-JYYgzhGqSGuIMNY1cTlmq3zrNpehrExMHqLmLnSM2jEGFeHydlL+KLBwBYxMy4e73w+p1+o/rmAiGsMj9g3MCw==", "dev": true, "license": "MIT" }, "node_modules/@cspell/dict-en-common-misspellings": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.5.tgz", - "integrity": "sha512-hlRDSjul7wGTDXeLBADoyTGIZjWWZn6/SP+pt0lG3PRtqF0MWH/QEDgUkS+Yev7ZhHCHVLvwBZtDxOd1uw06Tw==", + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.6.tgz", + "integrity": "sha512-xV9yryOqZizbSqxRS7kSVRrxVEyWHUqwdY56IuT7eAWGyTCJNmitXzXa4p+AnEbhL+AB2WLynGVSbNoUC3ceFA==", "dev": true, "license": "CC BY-SA 4.0" }, "node_modules/@cspell/dict-en-gb-mit": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.8.tgz", - "integrity": "sha512-wrZDRl6TKd1wReepGDPuT1JNbnRjHLvtAVrozp0DUkFlcDgnrB+YSd/Ne4aKnkXl5qpyVQ2GG7a4Z7INKCX+fw==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.9.tgz", + "integrity": "sha512-1lSnphnHTOxnpNLpPLg1XXv8df3hs4oL0LJ6dkQ0IqNROl8Jzl6PD55BDTlKy4YOAA76dJlePB0wyrxB+VVKbg==", "dev": true, "license": "MIT" }, @@ -791,9 +791,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-npm": { - "version": "5.2.15", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.15.tgz", - "integrity": "sha512-kb9oX/N5FUlJYoqc5G+tIP/0SolteFMz2VhOVKG2qiXUS/1AybVTjUEo4gZ4uEveUhLzUDcfpZbn40EoUVBVrg==", + "version": "5.2.17", + "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.17.tgz", + "integrity": "sha512-0yp7lBXtN3CtxBrpvTu/yAuPdOHR2ucKzPxdppc3VKO068waZNpKikn1NZCzBS3dIAFGVITzUPtuTXxt9cxnSg==", "dev": true, "license": "MIT" }, @@ -864,9 +864,9 @@ "license": "MIT" }, "node_modules/@cspell/dict-software-terms": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.7.tgz", - "integrity": "sha512-CfNFQCVx8R/D8RfFdFTwSjDvXcSXY0tO+VN2N6TEbNTL1GCmqyzhwm4YI+ZbO3MUmMAMjwu9jZyoLk5BaJkXcg==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.8.tgz", + "integrity": "sha512-iwCHLP11OmVHEX2MzE8EPxpPw7BelvldxWe5cJ3xXIDL8TjF2dBTs2noGcrqnZi15SLYIlO8897BIOa33WHHZA==", "dev": true, "license": "MIT" }, @@ -1399,9 +1399,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz", - "integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", "dependencies": { @@ -1625,33 +1625,19 @@ } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1681,9 +1667,9 @@ } }, "node_modules/@iconify-json/simple-icons": { - "version": "1.2.48", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.48.tgz", - "integrity": "sha512-EACOtZMoPJtERiAbX1De0asrrCtlwI27+03c9OJlYWsly9w1O5vcD8rTzh+kDPjo+K8FOVnq2Qy+h/CzljSKDA==", + "version": "1.2.53", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.53.tgz", + "integrity": "sha512-8GEW5mshsPAZpVAJmkBG/niR2qn8t4U03Wmz6aSD9R4VMZKTECqbOxH3z4inA0JfZOoTvP4qoK9T2VXAx2Xg5g==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -2094,9 +2080,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.3.tgz", - "integrity": "sha512-UmTdvXnLlqQNOCJnyksjPs1G4GqXNGW1LrzCe8+8QoaLhhDeTXYBgJ3k6x61WIhlHX2U+VzEJ55TtIjR/HTySA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.2.tgz", + "integrity": "sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==", "cpu": [ "arm" ], @@ -2108,9 +2094,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.3.tgz", - "integrity": "sha512-8NoxqLpXm7VyeI0ocidh335D6OKT0UJ6fHdnIxf3+6oOerZZc+O7r+UhvROji6OspyPm+rrIdb1gTXtVIqn+Sg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.2.tgz", + "integrity": "sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==", "cpu": [ "arm64" ], @@ -2122,9 +2108,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.3.tgz", - "integrity": "sha512-csnNavqZVs1+7/hUKtgjMECsNG2cdB8F7XBHP6FfQjqhjF8rzMzb3SLyy/1BG7YSfQ+bG75Ph7DyedbUqwq1rA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.2.tgz", + "integrity": "sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==", "cpu": [ "arm64" ], @@ -2136,9 +2122,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.3.tgz", - "integrity": "sha512-r2MXNjbuYabSIX5yQqnT8SGSQ26XQc8fmp6UhlYJd95PZJkQD1u82fWP7HqvGUf33IsOC6qsiV+vcuD4SDP6iw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.2.tgz", + "integrity": "sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==", "cpu": [ "x64" ], @@ -2150,9 +2136,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.3.tgz", - "integrity": "sha512-uluObTmgPJDuJh9xqxyr7MV61Imq+0IvVsAlWyvxAaBSNzCcmZlhfYcRhCdMaCsy46ccZa7vtDDripgs9Jkqsw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.2.tgz", + "integrity": "sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==", "cpu": [ "arm64" ], @@ -2164,9 +2150,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.3.tgz", - "integrity": "sha512-AVJXEq9RVHQnejdbFvh1eWEoobohUYN3nqJIPI4mNTMpsyYN01VvcAClxflyk2HIxvLpRcRggpX1m9hkXkpC/A==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.2.tgz", + "integrity": "sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==", "cpu": [ "x64" ], @@ -2178,9 +2164,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.3.tgz", - "integrity": "sha512-byyflM+huiwHlKi7VHLAYTKr67X199+V+mt1iRgJenAI594vcmGGddWlu6eHujmcdl6TqSNnvqaXJqZdnEWRGA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.2.tgz", + "integrity": "sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==", "cpu": [ "arm" ], @@ -2192,9 +2178,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.3.tgz", - "integrity": "sha512-aLm3NMIjr4Y9LklrH5cu7yybBqoVCdr4Nvnm8WB7PKCn34fMCGypVNpGK0JQWdPAzR/FnoEoFtlRqZbBBLhVoQ==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.2.tgz", + "integrity": "sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==", "cpu": [ "arm" ], @@ -2206,9 +2192,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.3.tgz", - "integrity": "sha512-VtilE6eznJRDIoFOzaagQodUksTEfLIsvXymS+UdJiSXrPW7Ai+WG4uapAc3F7Hgs791TwdGh4xyOzbuzIZrnw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.2.tgz", + "integrity": "sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==", "cpu": [ "arm64" ], @@ -2220,9 +2206,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.3.tgz", - "integrity": "sha512-dG3JuS6+cRAL0GQ925Vppafi0qwZnkHdPeuZIxIPXqkCLP02l7ka+OCyBoDEv8S+nKHxfjvjW4OZ7hTdHkx8/w==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.2.tgz", + "integrity": "sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==", "cpu": [ "arm64" ], @@ -2233,10 +2219,10 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.3.tgz", - "integrity": "sha512-iU8DxnxEKJptf8Vcx4XvAUdpkZfaz0KWfRrnIRrOndL0SvzEte+MTM7nDH4A2Now4FvTZ01yFAgj6TX/mZl8hQ==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.2.tgz", + "integrity": "sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==", "cpu": [ "loong64" ], @@ -2248,9 +2234,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.3.tgz", - "integrity": "sha512-VrQZp9tkk0yozJoQvQcqlWiqaPnLM6uY1qPYXvukKePb0fqaiQtOdMJSxNFUZFsGw5oA5vvVokjHrx8a9Qsz2A==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.2.tgz", + "integrity": "sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==", "cpu": [ "ppc64" ], @@ -2262,9 +2248,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.3.tgz", - "integrity": "sha512-uf2eucWSUb+M7b0poZ/08LsbcRgaDYL8NCGjUeFMwCWFwOuFcZ8D9ayPl25P3pl+D2FH45EbHdfyUesQ2Lt9wA==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.2.tgz", + "integrity": "sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==", "cpu": [ "riscv64" ], @@ -2276,9 +2262,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.3.tgz", - "integrity": "sha512-7tnUcDvN8DHm/9ra+/nF7lLzYHDeODKKKrh6JmZejbh1FnCNZS8zMkZY5J4sEipy2OW1d1Ncc4gNHUd0DLqkSg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.2.tgz", + "integrity": "sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==", "cpu": [ "riscv64" ], @@ -2290,9 +2276,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.3.tgz", - "integrity": "sha512-MUpAOallJim8CsJK+4Lc9tQzlfPbHxWDrGXZm2z6biaadNpvh3a5ewcdat478W+tXDoUiHwErX/dOql7ETcLqg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.2.tgz", + "integrity": "sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==", "cpu": [ "s390x" ], @@ -2304,9 +2290,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.3.tgz", - "integrity": "sha512-F42IgZI4JicE2vM2PWCe0N5mR5vR0gIdORPqhGQ32/u1S1v3kLtbZ0C/mi9FFk7C5T0PgdeyWEPajPjaUpyoKg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.2.tgz", + "integrity": "sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==", "cpu": [ "x64" ], @@ -2318,9 +2304,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.3.tgz", - "integrity": "sha512-oLc+JrwwvbimJUInzx56Q3ujL3Kkhxehg7O1gWAYzm8hImCd5ld1F2Gry5YDjR21MNb5WCKhC9hXgU7rRlyegQ==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.2.tgz", + "integrity": "sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==", "cpu": [ "x64" ], @@ -2331,10 +2317,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.2.tgz", + "integrity": "sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.3.tgz", - "integrity": "sha512-lOrQ+BVRstruD1fkWg9yjmumhowR0oLAAzavB7yFSaGltY8klttmZtCLvOXCmGE9mLIn8IBV/IFrQOWz5xbFPg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.2.tgz", + "integrity": "sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==", "cpu": [ "arm64" ], @@ -2346,9 +2346,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.3.tgz", - "integrity": "sha512-vvrVKPRS4GduGR7VMH8EylCBqsDcw6U+/0nPDuIjXQRbHJc6xOBj+frx8ksfZAh6+Fptw5wHrN7etlMmQnPQVg==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.2.tgz", + "integrity": "sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==", "cpu": [ "ia32" ], @@ -2359,10 +2359,24 @@ "win32" ] }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.2.tgz", + "integrity": "sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.3.tgz", - "integrity": "sha512-fi3cPxCnu3ZeM3EwKZPgXbWoGzm2XHgB/WShKI81uj8wG0+laobmqy5wbgEwzstlbLu4MyO8C19FyhhWseYKNQ==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.2.tgz", + "integrity": "sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==", "cpu": [ "x64" ], @@ -2406,9 +2420,9 @@ } }, "node_modules/@sap/cds-compiler": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@sap/cds-compiler/-/cds-compiler-6.2.2.tgz", - "integrity": "sha512-LqRNfBsWnEJpXVJ6/v52VqAdelWoETLbECMPcy7BfoHE63DGBpKA/ZIgoH11t7vUm7GYQDcSfR7ryy02Q/fP7A==", + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/@sap/cds-compiler/-/cds-compiler-6.3.6.tgz", + "integrity": "sha512-4fiABVwuwUiZh0QpdQGor7e5Ld2SBOABvBHg8oqM2JsEtAcmnvTfStewETpgEBW63u8jRltcSEA6s59JH+qWwQ==", "dev": true, "license": "SEE LICENSE IN LICENSE", "bin": { @@ -2432,13 +2446,13 @@ } }, "node_modules/@shikijs/core": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.10.0.tgz", - "integrity": "sha512-iF1pDengps5BLXnZDF9yJIb3a7K5WfgeocH1U8u9UYM+UGU6lkl2PLD7/npxL+dOFrsxzp4KjafhHx+/sggplw==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.13.0.tgz", + "integrity": "sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "3.10.0", + "@shikijs/types": "3.13.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" @@ -2569,14 +2583,14 @@ } }, "node_modules/@shikijs/twoslash": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-3.10.0.tgz", - "integrity": "sha512-V8x4ULLKIjUSKh4/lnYy1XMgsW/0q8QtvTfS4i0YUe9oMXQ5q2HSWqd3yeIpF7tfuoBpeopXQC8mScZjbPGgjw==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-3.13.0.tgz", + "integrity": "sha512-OmNKNoZ8Hevt4VKQHfJL+hrsrqLSnW/Nz7RMutuBqXBCIYZWk80HnF9pcXEwRmy9MN0MGRmZCW2rDDP8K7Bxkw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "3.10.0", - "@shikijs/types": "3.10.0", + "@shikijs/core": "3.13.0", + "@shikijs/types": "3.13.0", "twoslash": "^0.3.4" }, "peerDependencies": { @@ -2605,9 +2619,9 @@ "license": "MIT" }, "node_modules/@shikijs/types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.10.0.tgz", - "integrity": "sha512-PAeyajDDhdzefMiSZn7ENCwVaACMnO53+p5pSrJpIQOJTSX+4Qn28Y5e7I6v9wkJNyepRFfbZmzmbbnzjxBMEA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.13.0.tgz", + "integrity": "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==", "dev": true, "license": "MIT", "dependencies": { @@ -2795,13 +2809,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", - "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", + "version": "24.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz", + "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.12.0" } }, "node_modules/@types/qs": { @@ -3050,57 +3064,57 @@ "license": "MIT" }, "node_modules/@vue/compiler-core": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz", - "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz", + "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@vue/shared": "3.5.18", + "@babel/parser": "^7.28.4", + "@vue/shared": "3.5.22", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", - "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz", + "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/compiler-core": "3.5.22", + "@vue/shared": "3.5.22" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", - "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz", + "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.0", - "@vue/compiler-core": "3.5.18", - "@vue/compiler-dom": "3.5.18", - "@vue/compiler-ssr": "3.5.18", - "@vue/shared": "3.5.18", + "@babel/parser": "^7.28.4", + "@vue/compiler-core": "3.5.22", + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22", "estree-walker": "^2.0.2", - "magic-string": "^0.30.17", + "magic-string": "^0.30.19", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", - "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz", + "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/compiler-dom": "3.5.22", + "@vue/shared": "3.5.22" } }, "node_modules/@vue/compiler-vue2": { @@ -3176,57 +3190,57 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz", - "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.22.tgz", + "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.5.18" + "@vue/shared": "3.5.22" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz", - "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.22.tgz", + "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/reactivity": "3.5.22", + "@vue/shared": "3.5.22" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", - "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz", + "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.18", - "@vue/runtime-core": "3.5.18", - "@vue/shared": "3.5.18", + "@vue/reactivity": "3.5.22", + "@vue/runtime-core": "3.5.22", + "@vue/shared": "3.5.22", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz", - "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.22.tgz", + "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/compiler-ssr": "3.5.22", + "@vue/shared": "3.5.22" }, "peerDependencies": { - "vue": "3.5.18" + "vue": "3.5.22" } }, "node_modules/@vue/shared": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz", - "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz", + "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==", "dev": true, "license": "MIT" }, @@ -3402,26 +3416,26 @@ } }, "node_modules/algoliasearch": { - "version": "5.35.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", - "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", + "version": "5.38.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.38.0.tgz", + "integrity": "sha512-8VJKIzheeI9cjuVJhU1hYEVetOTe7LvA+CujAI7yqvYsPtZfVEvv1pg9AeFNtHBg/ZoSLGU5LPijhcY5l3Ea9g==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/abtesting": "1.1.0", - "@algolia/client-abtesting": "5.35.0", - "@algolia/client-analytics": "5.35.0", - "@algolia/client-common": "5.35.0", - "@algolia/client-insights": "5.35.0", - "@algolia/client-personalization": "5.35.0", - "@algolia/client-query-suggestions": "5.35.0", - "@algolia/client-search": "5.35.0", - "@algolia/ingestion": "1.35.0", - "@algolia/monitoring": "1.35.0", - "@algolia/recommend": "5.35.0", - "@algolia/requester-browser-xhr": "5.35.0", - "@algolia/requester-fetch": "5.35.0", - "@algolia/requester-node-http": "5.35.0" + "@algolia/abtesting": "1.4.0", + "@algolia/client-abtesting": "5.38.0", + "@algolia/client-analytics": "5.38.0", + "@algolia/client-common": "5.38.0", + "@algolia/client-insights": "5.38.0", + "@algolia/client-personalization": "5.38.0", + "@algolia/client-query-suggestions": "5.38.0", + "@algolia/client-search": "5.38.0", + "@algolia/ingestion": "1.38.0", + "@algolia/monitoring": "1.38.0", + "@algolia/recommend": "5.38.0", + "@algolia/requester-browser-xhr": "5.38.0", + "@algolia/requester-fetch": "5.38.0", + "@algolia/requester-node-http": "5.38.0" }, "engines": { "node": ">= 14.0.0" @@ -3435,9 +3449,9 @@ "license": "MIT" }, "node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -3448,9 +3462,9 @@ } }, "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -3490,9 +3504,9 @@ "license": "MIT" }, "node_modules/birpc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz", - "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.6.1.tgz", + "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==", "dev": true, "license": "MIT", "funding": { @@ -3640,9 +3654,9 @@ } }, "node_modules/chalk": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz", - "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", "dev": true, "license": "MIT", "engines": { @@ -3653,9 +3667,9 @@ } }, "node_modules/chalk-template": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz", - "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz", + "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==", "dev": true, "license": "MIT", "dependencies": { @@ -3777,9 +3791,9 @@ } }, "node_modules/commander": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", - "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz", + "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==", "dev": true, "license": "MIT", "engines": { @@ -4103,9 +4117,9 @@ "license": "MIT" }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -4452,42 +4466,35 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", - "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.5.0.tgz", + "integrity": "sha512-7BZHsG3kC2vei8F2W8hnfDi9RK+cv5eKPMvzBdrl8Vuc0hR5odGQRli8VVzUkrmUHkxFEm4Iio1r5HOKslO0Aw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "globals": "^13.24.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", "semver": "^7.6.3", - "vue-eslint-parser": "^9.4.3", "xml-name-validator": "^4.0.0" }, "engines": { - "node": "^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-vue/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" + "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "vue-eslint-parser": "^10.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "@stylistic/eslint-plugin": { + "optional": true + }, + "@typescript-eslint/parser": { + "optional": true + } } }, "node_modules/eslint-scope": { @@ -4761,9 +4768,9 @@ "license": "MIT" }, "node_modules/fast-equals": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", - "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.0.tgz", + "integrity": "sha512-xwP+dG/in/nJelMOUEQBiIYeOoHKihWPB2sNZ8ZeDbZFoGb1OwTGMggGRgg6CRitNx7kmHgtIz2dOHDQ8Ap7Bw==", "dev": true, "license": "MIT", "engines": { @@ -5762,13 +5769,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5788,9 +5788,9 @@ } }, "node_modules/lru-cache": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz", - "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==", + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", "dev": true, "license": "ISC", "engines": { @@ -5798,13 +5798,13 @@ } }, "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "version": "0.30.19", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz", + "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/mark.js": { @@ -6935,9 +6935,9 @@ } }, "node_modules/minisearch": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz", - "integrity": "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz", + "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==", "dev": true, "license": "MIT" }, @@ -7291,9 +7291,9 @@ } }, "node_modules/preact": { - "version": "10.27.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.1.tgz", - "integrity": "sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==", + "version": "10.27.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", + "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", "dev": true, "license": "MIT", "funding": { @@ -7503,9 +7503,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.46.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.3.tgz", - "integrity": "sha512-RZn2XTjXb8t5g13f5YclGoilU/kwT696DIkY3sywjdZidNSi3+vseaQov7D7BZXVJCPv3pDWUN69C78GGbXsKw==", + "version": "4.52.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.2.tgz", + "integrity": "sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==", "dev": true, "license": "MIT", "dependencies": { @@ -7519,26 +7519,28 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.46.3", - "@rollup/rollup-android-arm64": "4.46.3", - "@rollup/rollup-darwin-arm64": "4.46.3", - "@rollup/rollup-darwin-x64": "4.46.3", - "@rollup/rollup-freebsd-arm64": "4.46.3", - "@rollup/rollup-freebsd-x64": "4.46.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.46.3", - "@rollup/rollup-linux-arm-musleabihf": "4.46.3", - "@rollup/rollup-linux-arm64-gnu": "4.46.3", - "@rollup/rollup-linux-arm64-musl": "4.46.3", - "@rollup/rollup-linux-loongarch64-gnu": "4.46.3", - "@rollup/rollup-linux-ppc64-gnu": "4.46.3", - "@rollup/rollup-linux-riscv64-gnu": "4.46.3", - "@rollup/rollup-linux-riscv64-musl": "4.46.3", - "@rollup/rollup-linux-s390x-gnu": "4.46.3", - "@rollup/rollup-linux-x64-gnu": "4.46.3", - "@rollup/rollup-linux-x64-musl": "4.46.3", - "@rollup/rollup-win32-arm64-msvc": "4.46.3", - "@rollup/rollup-win32-ia32-msvc": "4.46.3", - "@rollup/rollup-win32-x64-msvc": "4.46.3", + "@rollup/rollup-android-arm-eabi": "4.52.2", + "@rollup/rollup-android-arm64": "4.52.2", + "@rollup/rollup-darwin-arm64": "4.52.2", + "@rollup/rollup-darwin-x64": "4.52.2", + "@rollup/rollup-freebsd-arm64": "4.52.2", + "@rollup/rollup-freebsd-x64": "4.52.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.2", + "@rollup/rollup-linux-arm-musleabihf": "4.52.2", + "@rollup/rollup-linux-arm64-gnu": "4.52.2", + "@rollup/rollup-linux-arm64-musl": "4.52.2", + "@rollup/rollup-linux-loong64-gnu": "4.52.2", + "@rollup/rollup-linux-ppc64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-gnu": "4.52.2", + "@rollup/rollup-linux-riscv64-musl": "4.52.2", + "@rollup/rollup-linux-s390x-gnu": "4.52.2", + "@rollup/rollup-linux-x64-gnu": "4.52.2", + "@rollup/rollup-linux-x64-musl": "4.52.2", + "@rollup/rollup-openharmony-arm64": "4.52.2", + "@rollup/rollup-win32-arm64-msvc": "4.52.2", + "@rollup/rollup-win32-ia32-msvc": "4.52.2", + "@rollup/rollup-win32-x64-gnu": "4.52.2", + "@rollup/rollup-win32-x64-msvc": "4.52.2", "fsevents": "~2.3.2" } }, @@ -8050,9 +8052,9 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", "dev": true, "license": "MIT", "dependencies": { @@ -8146,14 +8148,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -8262,19 +8264,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -8313,9 +8302,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz", + "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==", "dev": true, "license": "MIT" }, @@ -8473,9 +8462,9 @@ } }, "node_modules/vite": { - "version": "5.4.19", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", - "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "version": "5.4.20", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.20.tgz", + "integrity": "sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==", "dev": true, "license": "MIT", "dependencies": { @@ -8615,17 +8604,17 @@ "license": "MIT" }, "node_modules/vue": { - "version": "3.5.18", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz", - "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", + "version": "3.5.22", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.22.tgz", + "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.18", - "@vue/compiler-sfc": "3.5.18", - "@vue/runtime-dom": "3.5.18", - "@vue/server-renderer": "3.5.18", - "@vue/shared": "3.5.18" + "@vue/compiler-dom": "3.5.22", + "@vue/compiler-sfc": "3.5.22", + "@vue/runtime-dom": "3.5.22", + "@vue/server-renderer": "3.5.22", + "@vue/shared": "3.5.22" }, "peerDependencies": { "typescript": "*" @@ -8637,76 +8626,28 @@ } }, "node_modules/vue-eslint-parser": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", - "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz", + "integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" + "debug": "^4.4.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" }, "engines": { - "node": "^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" }, "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "eslint": "^8.57.0 || ^9.0.0" } }, "node_modules/vue-resize": { diff --git a/package.json b/package.json index ae15ebaf82..74ade9ad7b 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "adm-zip": "^0.5.10", "cspell": "^9.0.0", "eslint": "^9.0.0", - "eslint-plugin-vue": "^9.11.0", + "eslint-plugin-vue": "^10.0.0", "fflate": "^0.8.2", "gray-matter": "^4.0.3", "markdownlint-cli": ">=0.35.0", diff --git a/tools/cds-lint/examples/no-cross-service-import/correct/srv/AdminService.js b/tools/cds-lint/examples/no-cross-service-import/correct/srv/AdminService.js index 85966e6628..64479b6623 100644 --- a/tools/cds-lint/examples/no-cross-service-import/correct/srv/AdminService.js +++ b/tools/cds-lint/examples/no-cross-service-import/correct/srv/AdminService.js @@ -1,6 +1,7 @@ const cds = require('@sap/cds') const { Books } = require('#cds-models/sap/capire/bookshop/AdminService') // [!code highlight] -module.exports = class AdminService extends cds.ApplicationService { - // … -} \ No newline at end of file +module.exports = class AdminService extends cds.ApplicationService { async init() { + this.after('READ', Books, async () => { }) + // ... +}} diff --git a/tools/cds-lint/examples/no-cross-service-import/incorrect/srv/AdminService.js b/tools/cds-lint/examples/no-cross-service-import/incorrect/srv/AdminService.js index f8cb922c75..18b38b12c0 100644 --- a/tools/cds-lint/examples/no-cross-service-import/incorrect/srv/AdminService.js +++ b/tools/cds-lint/examples/no-cross-service-import/incorrect/srv/AdminService.js @@ -1,6 +1,7 @@ const cds = require('@sap/cds') -const { Books } = require('#cds-models/sap/capire/bookshop/CatalogService') // [!code error] +const { Books } = require('#cds-models/sap/capire/bookshop/CatalogService') // [!code error] wrong service! -module.exports = class AdminService extends cds.ApplicationService { - // … -} \ No newline at end of file +module.exports = class AdminService extends cds.ApplicationService { async init() { + this.after('READ', Books, async () => { }) + // ... +}} diff --git a/tools/cds-lint/examples/no-deep-sap-cds-import/incorrect/srv/admin-service.js b/tools/cds-lint/examples/no-deep-sap-cds-import/incorrect/srv/admin-service.js index 13658befaf..529e37575f 100644 --- a/tools/cds-lint/examples/no-deep-sap-cds-import/incorrect/srv/admin-service.js +++ b/tools/cds-lint/examples/no-deep-sap-cds-import/incorrect/srv/admin-service.js @@ -1,5 +1,5 @@ -const cdsService = require('@sap/cds/service') // [!code error] +const ApplicationService = require('@sap/cds/srv/app-service') // [!code error] path is no API! -module.exports = class AdminService extends cdsService.ApplicationService { +module.exports = class AdminService extends ApplicationService { // … } \ No newline at end of file From d6a5a4028658838c011817c575699ab760b44a0e Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Thu, 25 Sep 2025 14:30:30 +0200 Subject: [PATCH 13/43] lint: move rule docs and samples closer together (#2112) The current split into `rules/` and `examples/` folders is a bit hard to grasp. Move the sample and docs for a rule in one folder, eliminating the `examples` folder. URLs change slightly: - `cds-lint/rules/foobar` (before) - `cds-lint/rules/foobar/` (now) --- .github/eslint-plugin/index.js | 22 ++++--- .github/eslint-plugin/js-rule-stub.md | 6 +- tools/cds-lint/components/PlaygroundBadge.vue | 4 +- .../correct/srv/admin-service.js | 21 ------- .../incorrect/srv/admin-service.js | 24 -------- tools/cds-lint/index.md | 2 +- tools/cds-lint/rules/_menu.md | 48 +++++++-------- .../correct/db/schema.cds | 0 .../incorrect/db/schema.cds | 0 .../index.md} | 8 +-- .../correct/db/schema.cds | 0 .../correct/srv/admin-service.cds | 0 .../incorrect/db/schema.cds | 0 .../incorrect/srv/admin-service.cds | 0 .../index.md} | 8 +-- .../correct/db/schema.cds | 0 .../correct/srv/cat-service.cds | 0 .../incorrect/db/schema.cds | 0 .../incorrect/srv/cat-service.cds | 0 .../index.md} | 8 +-- .../auth-use-requires/correct/db/schema.cds | 0 .../correct/srv/cat-service.cds | 0 .../auth-use-requires/incorrect/db/schema.cds | 0 .../incorrect/srv/cat-service.cds | 0 .../index.md} | 6 +- .../correct/db/schema.cds | 0 .../correct/srv/cat-service.cds | 0 .../incorrect/db/schema.cds | 0 .../incorrect/srv/cat-service.cds | 0 .../index.md} | 6 +- .../correct/db/schema.cds | 0 .../correct/srv/cat-service.cds | 0 .../incorrect/db/schema.cds | 0 .../incorrect/srv/cat-service.cds | 0 .../index.md} | 6 +- .../correct/db/schema.cds | 0 .../correct/srv/cat-service.cds | 0 .../incorrect/db/schema.cds | 0 .../incorrect/srv/cat-service.cds | 0 .../index.md} | 8 +-- .../correct/db/schema.cds | 0 .../correct/srv/cat-service.cds | 0 .../incorrect/db/schema.cds | 0 .../incorrect/srv/cat-service.cds | 0 .../index.md} | 6 +- .../correct/srv/admin-service.js | 0 .../incorrect/srv/admin-service.js | 0 .../index.md} | 6 +- .../{examples => rules}/examples.data.ts | 0 .../correct/db/schema.cds | 0 .../correct/node-modules/base-app/.cdsrc.json | 0 .../correct/node-modules/base-app/index.csn | 0 .../incorrect/db/schema.cds | 0 .../node-modules/base-app/.cdsrc.json | 0 .../incorrect/node-modules/base-app/index.csn | 0 .../index.md} | 6 +- .../index.md} | 2 +- .../correct/srv/AdminService.js | 0 .../incorrect/srv/AdminService.js | 0 .../index.md} | 6 +- .../no-db-keywords/correct/db/schema.cds | 0 .../no-db-keywords/incorrect/db/schema.cds | 0 .../index.md} | 6 +- .../correct/srv/admin-service.js | 0 .../incorrect/srv/admin-service.js | 0 .../index.md} | 6 +- .../correct/db/schema.cds | 0 .../incorrect/db/schema.cds | 0 .../index.md} | 6 +- .../no-java-keywords/correct/db/schema.cds | 0 .../no-java-keywords/incorrect/db/schema.cds | 0 .../index.md} | 6 +- .../no-join-on-draft/correct/db/schema.cds | 0 .../correct/srv/cat-service.cds | 0 .../no-join-on-draft/incorrect/db/schema.cds | 0 .../no-join-on-draft/incorrect/schema.cds | 0 .../incorrect/srv/cat-service.cds | 0 .../index.md} | 6 +- .../correct/srv/admin-service.js | 20 +++++++ .../incorrect/srv/admin-service.js | 23 ++++++++ .../index.md} | 59 +++++++++---------- .../cds-lint/{examples => rules}/package.json | 0 .../sql-cast-suggestion/correct/db/schema.cds | 0 .../incorrect/db/schema.cds | 0 .../index.md} | 6 +- .../sql-null-comparison/correct/db/schema.cds | 0 .../correct/srv/cat-service.cds | 0 .../incorrect/db/schema.cds | 0 .../incorrect/srv/cat-service.cds | 0 .../index.md} | 6 +- .../correct/db/schema.cds | 0 .../incorrect/db/schema.cds | 0 .../index.md} | 8 +-- .../correct/db/schema.cds | 0 .../incorrect/db/schema.cds | 0 .../index.md} | 8 +-- .../correct/srv/admin-service.js | 0 .../incorrect/srv/admin-service.js | 0 .../index.md} | 8 +-- .../db/data/sap.capire.bookshop-Books.csv | 0 .../valid-csv-header/correct/db/schema.cds | 0 .../db/data/sap.capire.bookshop-Books.csv | 0 .../valid-csv-header/incorrect/db/schema.cds | 0 .../index.md} | 8 +-- 104 files changed, 187 insertions(+), 192 deletions(-) mode change 100644 => 100755 .github/eslint-plugin/index.js delete mode 100644 tools/cds-lint/examples/no-shared-handler-variable/correct/srv/admin-service.js delete mode 100644 tools/cds-lint/examples/no-shared-handler-variable/incorrect/srv/admin-service.js rename tools/cds-lint/{examples => rules}/assoc2many-ambiguous-key/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/assoc2many-ambiguous-key/incorrect/db/schema.cds (100%) rename tools/cds-lint/rules/{assoc2many-ambiguous-key.md => assoc2many-ambiguous-key/index.md} (62%) rename tools/cds-lint/{examples => rules}/auth-no-empty-restrictions/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-no-empty-restrictions/correct/srv/admin-service.cds (100%) rename tools/cds-lint/{examples => rules}/auth-no-empty-restrictions/incorrect/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-no-empty-restrictions/incorrect/srv/admin-service.cds (100%) rename tools/cds-lint/rules/{auth-no-empty-restrictions.md => auth-no-empty-restrictions/index.md} (62%) rename tools/cds-lint/{examples => rules}/auth-restrict-grant-service/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-restrict-grant-service/correct/srv/cat-service.cds (100%) rename tools/cds-lint/{examples => rules}/auth-restrict-grant-service/incorrect/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-restrict-grant-service/incorrect/srv/cat-service.cds (100%) rename tools/cds-lint/rules/{auth-restrict-grant-service.md => auth-restrict-grant-service/index.md} (79%) rename tools/cds-lint/{examples => rules}/auth-use-requires/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-use-requires/correct/srv/cat-service.cds (100%) rename tools/cds-lint/{examples => rules}/auth-use-requires/incorrect/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-use-requires/incorrect/srv/cat-service.cds (100%) rename tools/cds-lint/rules/{auth-use-requires.md => auth-use-requires/index.md} (82%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-grant/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-grant/correct/srv/cat-service.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-grant/incorrect/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-grant/incorrect/srv/cat-service.cds (100%) rename tools/cds-lint/rules/{auth-valid-restrict-grant.md => auth-valid-restrict-grant/index.md} (83%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-keys/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-keys/correct/srv/cat-service.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-keys/incorrect/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-keys/incorrect/srv/cat-service.cds (100%) rename tools/cds-lint/rules/{auth-valid-restrict-keys.md => auth-valid-restrict-keys/index.md} (83%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-to/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-to/correct/srv/cat-service.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-to/incorrect/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-to/incorrect/srv/cat-service.cds (100%) rename tools/cds-lint/rules/{auth-valid-restrict-to.md => auth-valid-restrict-to/index.md} (62%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-where/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-where/correct/srv/cat-service.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-where/incorrect/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/auth-valid-restrict-where/incorrect/srv/cat-service.cds (100%) rename tools/cds-lint/rules/{auth-valid-restrict-where.md => auth-valid-restrict-where/index.md} (82%) rename tools/cds-lint/{examples => rules}/case-sensitive-well-known-events/correct/srv/admin-service.js (100%) rename tools/cds-lint/{examples => rules}/case-sensitive-well-known-events/incorrect/srv/admin-service.js (100%) rename tools/cds-lint/rules/{case-sensitive-well-known-events.md => case-sensitive-well-known-events/index.md} (73%) rename tools/cds-lint/{examples => rules}/examples.data.ts (100%) rename tools/cds-lint/{examples => rules}/extension-restrictions/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/extension-restrictions/correct/node-modules/base-app/.cdsrc.json (100%) rename tools/cds-lint/{examples => rules}/extension-restrictions/correct/node-modules/base-app/index.csn (100%) rename tools/cds-lint/{examples => rules}/extension-restrictions/incorrect/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/extension-restrictions/incorrect/node-modules/base-app/.cdsrc.json (100%) rename tools/cds-lint/{examples => rules}/extension-restrictions/incorrect/node-modules/base-app/index.csn (100%) rename tools/cds-lint/rules/{extension-restrictions.md => extension-restrictions/index.md} (86%) rename tools/cds-lint/rules/{latest-cds-version.md => latest-cds-version/index.md} (95%) rename tools/cds-lint/{examples => rules}/no-cross-service-import/correct/srv/AdminService.js (100%) rename tools/cds-lint/{examples => rules}/no-cross-service-import/incorrect/srv/AdminService.js (100%) rename tools/cds-lint/rules/{no-cross-service-import.md => no-cross-service-import/index.md} (77%) rename tools/cds-lint/{examples => rules}/no-db-keywords/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/no-db-keywords/incorrect/db/schema.cds (100%) rename tools/cds-lint/rules/{no-db-keywords.md => no-db-keywords/index.md} (84%) rename tools/cds-lint/{examples => rules}/no-deep-sap-cds-import/correct/srv/admin-service.js (100%) rename tools/cds-lint/{examples => rules}/no-deep-sap-cds-import/incorrect/srv/admin-service.js (100%) rename tools/cds-lint/rules/{no-deep-sap-cds-import.md => no-deep-sap-cds-import/index.md} (74%) rename tools/cds-lint/{examples => rules}/no-dollar-prefixed-names/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/no-dollar-prefixed-names/incorrect/db/schema.cds (100%) rename tools/cds-lint/rules/{no-dollar-prefixed-names.md => no-dollar-prefixed-names/index.md} (77%) rename tools/cds-lint/{examples => rules}/no-java-keywords/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/no-java-keywords/incorrect/db/schema.cds (100%) rename tools/cds-lint/rules/{no-java-keywords.md => no-java-keywords/index.md} (83%) rename tools/cds-lint/{examples => rules}/no-join-on-draft/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/no-join-on-draft/correct/srv/cat-service.cds (100%) rename tools/cds-lint/{examples => rules}/no-join-on-draft/incorrect/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/no-join-on-draft/incorrect/schema.cds (100%) rename tools/cds-lint/{examples => rules}/no-join-on-draft/incorrect/srv/cat-service.cds (100%) rename tools/cds-lint/rules/{no-join-on-draft.md => no-join-on-draft/index.md} (78%) create mode 100644 tools/cds-lint/rules/no-shared-handler-variable/correct/srv/admin-service.js create mode 100644 tools/cds-lint/rules/no-shared-handler-variable/incorrect/srv/admin-service.js rename tools/cds-lint/rules/{no-shared-handler-variable.md => no-shared-handler-variable/index.md} (87%) rename tools/cds-lint/{examples => rules}/package.json (100%) rename tools/cds-lint/{examples => rules}/sql-cast-suggestion/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/sql-cast-suggestion/incorrect/db/schema.cds (100%) rename tools/cds-lint/rules/{sql-cast-suggestion.md => sql-cast-suggestion/index.md} (82%) rename tools/cds-lint/{examples => rules}/sql-null-comparison/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/sql-null-comparison/correct/srv/cat-service.cds (100%) rename tools/cds-lint/{examples => rules}/sql-null-comparison/incorrect/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/sql-null-comparison/incorrect/srv/cat-service.cds (100%) rename tools/cds-lint/rules/{sql-null-comparison.md => sql-null-comparison/index.md} (78%) rename tools/cds-lint/{examples => rules}/start-elements-lowercase/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/start-elements-lowercase/incorrect/db/schema.cds (100%) rename tools/cds-lint/rules/{start-elements-lowercase.md => start-elements-lowercase/index.md} (63%) rename tools/cds-lint/{examples => rules}/start-entities-uppercase/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/start-entities-uppercase/incorrect/db/schema.cds (100%) rename tools/cds-lint/rules/{start-entities-uppercase.md => start-entities-uppercase/index.md} (63%) rename tools/cds-lint/{examples => rules}/use-cql-select-template-strings/correct/srv/admin-service.js (100%) rename tools/cds-lint/{examples => rules}/use-cql-select-template-strings/incorrect/srv/admin-service.js (100%) rename tools/cds-lint/rules/{use-cql-select-template-strings.md => use-cql-select-template-strings/index.md} (70%) rename tools/cds-lint/{examples => rules}/valid-csv-header/correct/db/data/sap.capire.bookshop-Books.csv (100%) rename tools/cds-lint/{examples => rules}/valid-csv-header/correct/db/schema.cds (100%) rename tools/cds-lint/{examples => rules}/valid-csv-header/incorrect/db/data/sap.capire.bookshop-Books.csv (100%) rename tools/cds-lint/{examples => rules}/valid-csv-header/incorrect/db/schema.cds (100%) rename tools/cds-lint/rules/{valid-csv-header.md => valid-csv-header/index.md} (75%) diff --git a/.github/eslint-plugin/index.js b/.github/eslint-plugin/index.js old mode 100644 new mode 100755 index 462a0578ab..3ac03ef9b6 --- a/.github/eslint-plugin/index.js +++ b/.github/eslint-plugin/index.js @@ -10,19 +10,15 @@ import * as fs from 'node:fs' import * as path from 'node:path' -const RULES_BASE_PATH = path.join('tools', 'cds-lint', 'rules'); -const EXAMPLES_BASE_PATH = path.join('tools', 'cds-lint', 'examples'); +const RULES_BASE_PATH = path.join(import.meta.dirname, '../../tools/cds-lint/rules'); +const EXAMPLES_BASE_PATH = RULES_BASE_PATH const MENU_FILE_NAME = '_menu.md'; /** * Get a list of all rule description files. * @returns {string[]} An array of rule description file names. */ -const getRuleDescriptionFiles = () => - fs.readdirSync(RULES_BASE_PATH) - .filter(file => file.endsWith('.md')) - .filter(file => !['index.md', MENU_FILE_NAME].includes(file)) - .sort() +const getRuleDescriptionFiles = () => fs.globSync(path.join(RULES_BASE_PATH, '*/index.md')).sort() /** * Generates the menu markdown file @@ -33,12 +29,13 @@ const getRuleDescriptionFiles = () => function generateMenuMarkdown () { const rules = getRuleDescriptionFiles(); const menu = rules.map(rule => { - const clean = rule.replace('.md', ''); - return `# [${clean}](${clean})` + const folderPath = path.posix.dirname(path.relative(RULES_BASE_PATH, rule)); + const name = path.basename(folderPath); + return `# [${name}](${folderPath}/)` }).join('\n'); - const menuFilePath = path.join(RULES_BASE_PATH, '_menu.md') + const menuFilePath = path.join(RULES_BASE_PATH, MENU_FILE_NAME) fs.writeFileSync(menuFilePath, menu); - console.info(`generated menu to ${menuFilePath}`) + console.info(`generated menu to ${path.relative(process.cwd(), menuFilePath)}`); } /** @@ -52,11 +49,12 @@ function generateJsRuleStub (ruleName) { console.error('Please provide a rule name, e.g. "no-shared-handler-variables" as second argument'); process.exit(1); } - const stubFilePath = path.join(RULES_BASE_PATH, ruleName + '.md'); + const stubFilePath = path.join(RULES_BASE_PATH, ruleName, 'index.md'); if (fs.existsSync(stubFilePath)) { console.error(`file ${stubFilePath} already exists, will not overwrite`); process.exit(2); } + fs.mkdirSync(path.dirname(stubFilePath), { recursive: true }); const stub = fs.readFileSync(path.join(import.meta.dirname, 'js-rule-stub.md'), 'utf-8').replaceAll('$RULE_NAME', ruleName); fs.writeFileSync(stubFilePath, stub); console.info(`generated stub to ${stubFilePath}`); diff --git a/.github/eslint-plugin/js-rule-stub.md b/.github/eslint-plugin/js-rule-stub.md index 6cdbe627bc..8fce4bb4e1 100644 --- a/.github/eslint-plugin/js-rule-stub.md +++ b/.github/eslint-plugin/js-rule-stub.md @@ -3,7 +3,7 @@ status: released --- # $RULE_NAME @@ -22,7 +22,7 @@ This rule was introduced in `@sap/eslint-plugin-cds x.y.z`. DESCRIPTION OF CORRECT EXAMPLE ::: code-group -<<< ../examples/$RULE_NAME/correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] +<<< correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] ::: (), { nolink: false }) import { compress, prettyStringify } from './eslint-online-playground/utils'; // @ts-ignore -import { data } from '../examples/examples.data.ts'; +import { data } from '../rules/examples.data.ts'; const configFileName = "eslint.config.js"; const packageJsonFileName = "package.json"; @@ -29,7 +29,7 @@ export default [ const defaultPackageJson = JSON.parse(data['package.json']); -const is_object = x => typeof x === 'object' && x !== null && !Array.isArray(x) +const is_object = (x:any) => typeof x === 'object' && x !== null && !Array.isArray(x) function merge (o:any,...xs:any) { let v:any; for (let x of xs) for (let k in x) if (k === '__proto__' || k === 'constructor') continue //> avoid prototype pollution diff --git a/tools/cds-lint/examples/no-shared-handler-variable/correct/srv/admin-service.js b/tools/cds-lint/examples/no-shared-handler-variable/correct/srv/admin-service.js deleted file mode 100644 index 9fed76fc34..0000000000 --- a/tools/cds-lint/examples/no-shared-handler-variable/correct/srv/admin-service.js +++ /dev/null @@ -1,21 +0,0 @@ -const cds = require('@sap/cds') - -module.exports = class AdminService extends cds.ApplicationService { async init() { - this.after('READ', 'Books', async () => { - // local variable only, no state shared between handlers - const books = await cds.run(SELECT.from('Books')) // [!code highlight] - return books - }) - - this.on('CREATE', 'Books', newBookHandler) - await super.init() - } -} - -/** @type {import('@sap/cds').CRUDEventHandler.On} */ -async function newBookHandler (req) { - const { name } = req.data - // local variable only, no state shared between handlers - const newBook = await cds.run(INSERT.into('Books').entries({ name })) // [!code highlight] - return newBook -} \ No newline at end of file diff --git a/tools/cds-lint/examples/no-shared-handler-variable/incorrect/srv/admin-service.js b/tools/cds-lint/examples/no-shared-handler-variable/incorrect/srv/admin-service.js deleted file mode 100644 index 827ab536ff..0000000000 --- a/tools/cds-lint/examples/no-shared-handler-variable/incorrect/srv/admin-service.js +++ /dev/null @@ -1,24 +0,0 @@ -const cds = require('@sap/cds') - -let lastCreatedBook -let lastReadBooks - -module.exports = class AdminService extends cds.ApplicationService { async init() { - this.after('READ', 'Books', async () => { - // variable from surrounding scope, state is shared between handler calls - lastReadBooks = await cds.run(SELECT.from('Books')) // [!code error] - return lastReadBooks - }) - - this.on('CREATE', 'Books', newBookHandler) - await super.init() - } -} - -/** @type {import('@sap/cds').CRUDEventHandler.On} */ -async function newBookHandler (req) { - const { name } = req.data - // variable from surrounding scope, state is shared between handler calls - lastCreatedBook = await cds.run(INSERT.into('Books').entries({ name })) // [!code error] - return lastCreatedBook -} \ No newline at end of file diff --git a/tools/cds-lint/index.md b/tools/cds-lint/index.md index cdec3e8b24..412085fc6c 100644 --- a/tools/cds-lint/index.md +++ b/tools/cds-lint/index.md @@ -58,7 +58,7 @@ To turn on lint checking in your VS Code Editor simply download the [ESLint exte CDS Lint seamlessly integrates with it. For _SAP Business Application Studio_ this comes preinstalled. Now you can see lint reports also in your editor. You can see all rules [marked as **Editor default** here](./rules/). Any other (project-based) rules are not turned on by -default but can be turned on via the `show` rule option. For example, if we want to show the [`valid-csv-header`](./rules/valid-csv-header) rule reports in the Editor, we would add the following to our ESLint +default but can be turned on via the `show` rule option. For example, if we want to show the [`valid-csv-header`](./rules/valid-csv-header/) rule reports in the Editor, we would add the following to our ESLint `rules` configuration: ```json diff --git a/tools/cds-lint/rules/_menu.md b/tools/cds-lint/rules/_menu.md index e38c79a4aa..7bc1a347f9 100644 --- a/tools/cds-lint/rules/_menu.md +++ b/tools/cds-lint/rules/_menu.md @@ -1,24 +1,24 @@ -# [assoc2many-ambiguous-key](assoc2many-ambiguous-key) -# [auth-no-empty-restrictions](auth-no-empty-restrictions) -# [auth-restrict-grant-service](auth-restrict-grant-service) -# [auth-use-requires](auth-use-requires) -# [auth-valid-restrict-grant](auth-valid-restrict-grant) -# [auth-valid-restrict-keys](auth-valid-restrict-keys) -# [auth-valid-restrict-to](auth-valid-restrict-to) -# [auth-valid-restrict-where](auth-valid-restrict-where) -# [case-sensitive-well-known-events](case-sensitive-well-known-events) -# [extension-restrictions](extension-restrictions) -# [latest-cds-version](latest-cds-version) -# [no-cross-service-import](no-cross-service-import) -# [no-db-keywords](no-db-keywords) -# [no-deep-sap-cds-import](no-deep-sap-cds-import) -# [no-dollar-prefixed-names](no-dollar-prefixed-names) -# [no-java-keywords](no-java-keywords) -# [no-join-on-draft](no-join-on-draft) -# [no-shared-handler-variable](no-shared-handler-variable) -# [sql-cast-suggestion](sql-cast-suggestion) -# [sql-null-comparison](sql-null-comparison) -# [start-elements-lowercase](start-elements-lowercase) -# [start-entities-uppercase](start-entities-uppercase) -# [use-cql-select-template-strings](use-cql-select-template-strings) -# [valid-csv-header](valid-csv-header) \ No newline at end of file +# [assoc2many-ambiguous-key](assoc2many-ambiguous-key/) +# [auth-no-empty-restrictions](auth-no-empty-restrictions/) +# [auth-restrict-grant-service](auth-restrict-grant-service/) +# [auth-use-requires](auth-use-requires/) +# [auth-valid-restrict-grant](auth-valid-restrict-grant/) +# [auth-valid-restrict-keys](auth-valid-restrict-keys/) +# [auth-valid-restrict-to](auth-valid-restrict-to/) +# [auth-valid-restrict-where](auth-valid-restrict-where/) +# [case-sensitive-well-known-events](case-sensitive-well-known-events/) +# [extension-restrictions](extension-restrictions/) +# [latest-cds-version](latest-cds-version/) +# [no-cross-service-import](no-cross-service-import/) +# [no-db-keywords](no-db-keywords/) +# [no-deep-sap-cds-import](no-deep-sap-cds-import/) +# [no-dollar-prefixed-names](no-dollar-prefixed-names/) +# [no-java-keywords](no-java-keywords/) +# [no-join-on-draft](no-join-on-draft/) +# [no-shared-handler-variable](no-shared-handler-variable/) +# [sql-cast-suggestion](sql-cast-suggestion/) +# [sql-null-comparison](sql-null-comparison/) +# [start-elements-lowercase](start-elements-lowercase/) +# [start-entities-uppercase](start-entities-uppercase/) +# [use-cql-select-template-strings](use-cql-select-template-strings/) +# [valid-csv-header](valid-csv-header/) \ No newline at end of file diff --git a/tools/cds-lint/examples/assoc2many-ambiguous-key/correct/db/schema.cds b/tools/cds-lint/rules/assoc2many-ambiguous-key/correct/db/schema.cds similarity index 100% rename from tools/cds-lint/examples/assoc2many-ambiguous-key/correct/db/schema.cds rename to tools/cds-lint/rules/assoc2many-ambiguous-key/correct/db/schema.cds diff --git a/tools/cds-lint/examples/assoc2many-ambiguous-key/incorrect/db/schema.cds b/tools/cds-lint/rules/assoc2many-ambiguous-key/incorrect/db/schema.cds similarity index 100% rename from tools/cds-lint/examples/assoc2many-ambiguous-key/incorrect/db/schema.cds rename to tools/cds-lint/rules/assoc2many-ambiguous-key/incorrect/db/schema.cds diff --git a/tools/cds-lint/rules/assoc2many-ambiguous-key.md b/tools/cds-lint/rules/assoc2many-ambiguous-key/index.md similarity index 62% rename from tools/cds-lint/rules/assoc2many-ambiguous-key.md rename to tools/cds-lint/rules/assoc2many-ambiguous-key/index.md index c2a88772a8..e9bec53744 100644 --- a/tools/cds-lint/rules/assoc2many-ambiguous-key.md +++ b/tools/cds-lint/rules/assoc2many-ambiguous-key/index.md @@ -7,14 +7,14 @@ status: released --- # assoc2many-ambiguous-key ## Rule Details -An [association/composition to/of `MANY`](../../../cds/cdl#to-many-associations) that targets an entity without an `ON` condition is not allowed because it is an `n:1` relationship. Always specify an `ON` condition following the canonical expression pattern `. = $self`. The backlink can be any managed to-one association on the many side pointing back to the one side. +An [association/composition to/of `MANY`](../../../../cds/cdl#to-many-associations) that targets an entity without an `ON` condition is not allowed because it is an `n:1` relationship. Always specify an `ON` condition following the canonical expression pattern `. = $self`. The backlink can be any managed to-one association on the many side pointing back to the one side. ## Examples @@ -23,7 +23,7 @@ An [association/composition to/of `MANY`](../../../cds/cdl#to-many-associations) In the following example, we define a unique association from `Authors` to `Books` with a well-defined `ON` condition and backlink, thus satisfying the rule's conditions: ::: code-group -<<< ../examples/assoc2many-ambiguous-key/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # auth-no-empty-restrictions ## Rule Details -The [`@requires` annotation](../../../guides/security/authorization#requires) is a convenience shortcut for `@restrict`. You can use it to control which rule a user needs to access a given resource. Leaving this field empty is dangerous because it leads to unrestricted access to that service, which is a security risk. +The [`@requires` annotation](../../../../guides/security/authorization#requires) is a convenience shortcut for `@restrict`. You can use it to control which rule a user needs to access a given resource. Leaving this field empty is dangerous because it leads to unrestricted access to that service, which is a security risk. ## Examples @@ -23,7 +23,7 @@ The [`@requires` annotation](../../../guides/security/authorization#requires) is In the following example, the `AdminService` is correctly setup with `@requires` given the `admin` role: ::: code-group -<<< ../examples/auth-no-empty-restrictions/correct/srv/admin-service.cds#snippet{cds:line-numbers} [srv/admin-service.cds] +<<< correct/srv/admin-service.cds#snippet{cds:line-numbers} [srv/admin-service.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # auth-restrict-grant-service ## Rule Details -Restrictions can be defined on different types of CDS resources, but there are some limitations regarding supported privileges (see [limitations](../../../guides/security/authorization#supported-combinations-with-cds-resources)). +Restrictions can be defined on different types of CDS resources, but there are some limitations regarding supported privileges (see [limitations](../../../../guides/security/authorization#supported-combinations-with-cds-resources)). Unsupported privilege properties are ignored by the runtime. For bound or unbound actions, the `grant` property is implicitly removed (assuming `grant: '*'` instead). The same is true for functions. This rule ensures that `@restrict.grant` on service level and for bound/unbound actions and functions is limited to `grant: '*'`. @@ -25,7 +25,7 @@ Unsupported privilege properties are ignored by the runtime. For bound or unboun Let's consider the following example with the `CatalogService` where the function `getViewsCount()` is restricted to the *Admin* role, granting all CDS events: ::: code-group -<<< ../examples/auth-restrict-grant-service/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] +<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # auth-use-requires @@ -23,7 +23,7 @@ Some annotations such as `@requires` or `@readonly` are convenience shortcuts fo In the following example, the `CatalogService` action `addRating` correctly uses `@requires: 'Admin'` to indicate granting of unrestricted events to the `Admin` role: ::: code-group -<<< ../examples/auth-use-requires/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] +<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # auth-valid-restrict-grant @@ -23,7 +23,7 @@ The `grant` property of a `@restrict` privilege defines one or more events that In the following example, `CatalogService.ListOfBooks` is restricted to the `READ` event for the `Viewer` role, which is a valid value for `@restrict.grant`: ::: code-group -<<< ../examples/auth-valid-restrict-grant/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] +<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # auth-valid-restrict-keys @@ -23,7 +23,7 @@ To define authorizations on a fine-grained level, the `@restrict` annotation all In the following example, the `@restrict` annotation on `CatalogService.ListOfBooks` has correctly spelled `to`, `grant`, and `where` keys in the defined privilege: ::: code-group -<<< ../examples/auth-valid-restrict-keys/correct/srv/cat-service.cds#snippet{ts:line-numbers} [srv/cat-service.cds] +<<< correct/srv/cat-service.cds#snippet{ts:line-numbers} [srv/cat-service.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # auth-valid-restrict-to ## Rule Details -The `to` property of a `@restrict` privilege defines one or more [user roles](../../../guides/security/authorization#roles) or [pseudo roles](../../../guides/security/authorization#pseudo-roles) that the privilege applies to. This rule checks that the values of `@restrict.to` are valid, that is, roles cannot be missing or misspelled and that roles including `any` should be simplified to just `any`. +The `to` property of a `@restrict` privilege defines one or more [user roles](../../../../guides/security/authorization#roles) or [pseudo roles](../../../../guides/security/authorization#pseudo-roles) that the privilege applies to. This rule checks that the values of `@restrict.to` are valid, that is, roles cannot be missing or misspelled and that roles including `any` should be simplified to just `any`. ## Examples @@ -23,7 +23,7 @@ The `to` property of a `@restrict` privilege defines one or more [user roles](.. The following example shows a correct usage of the `@restrict.to` annotation, where the `to` property is set to the `Viewer` rule which is a valid value: ::: code-group -<<< ../examples/auth-valid-restrict-to/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] +<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # auth-valid-restrict-where @@ -23,7 +23,7 @@ The `where` property of a [`@restrict`](/guides/security/authorization#restrict- In the following example, the `@restrict` privilege is defined with a valid `where` property `CreatedBy = $user'`: ::: code-group -<<< ../examples/auth-valid-restrict-where/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] +<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # case-sensitive-well-known-events @@ -22,7 +22,7 @@ This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`. The following example shows the correctly capitalized event name `READ`: ::: code-group -<<< ../examples/case-sensitive-well-known-events/correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] +<<< correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # extension-restrictions @@ -21,7 +21,7 @@ CAP provides intrinsic extensibility, which means all your entities and services #### ✅   Correct example ::: code-group -<<< ../examples/extension-restrictions/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] ::: ::: code-group -<<< ../examples/extension-restrictions/incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +<<< incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # latest-cds-version diff --git a/tools/cds-lint/examples/no-cross-service-import/correct/srv/AdminService.js b/tools/cds-lint/rules/no-cross-service-import/correct/srv/AdminService.js similarity index 100% rename from tools/cds-lint/examples/no-cross-service-import/correct/srv/AdminService.js rename to tools/cds-lint/rules/no-cross-service-import/correct/srv/AdminService.js diff --git a/tools/cds-lint/examples/no-cross-service-import/incorrect/srv/AdminService.js b/tools/cds-lint/rules/no-cross-service-import/incorrect/srv/AdminService.js similarity index 100% rename from tools/cds-lint/examples/no-cross-service-import/incorrect/srv/AdminService.js rename to tools/cds-lint/rules/no-cross-service-import/incorrect/srv/AdminService.js diff --git a/tools/cds-lint/rules/no-cross-service-import.md b/tools/cds-lint/rules/no-cross-service-import/index.md similarity index 77% rename from tools/cds-lint/rules/no-cross-service-import.md rename to tools/cds-lint/rules/no-cross-service-import/index.md index 41e874b96e..65142360d6 100644 --- a/tools/cds-lint/rules/no-cross-service-import.md +++ b/tools/cds-lint/rules/no-cross-service-import/index.md @@ -3,7 +3,7 @@ status: released --- # no-cross-service-import @@ -21,7 +21,7 @@ This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`. The imported entity belongs to `AdminService` and is used within the implementation of `AdminService` itself. This is the recommended approach: ::: code-group -<<< ../examples/no-cross-service-import/correct/srv/AdminService.js#snippet{js:line-numbers} [srv/AdminService.js] +<<< correct/srv/AdminService.js#snippet{js:line-numbers} [srv/AdminService.js] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # no-db-keywords @@ -23,7 +23,7 @@ The CDS compiler and CAP runtimes provide smart quoting for reserved words in SQ In the following example, none of the reserved SQL keywords are used as identifiers, so the rule doesn't raise any warnings: ::: code-group -<<< ../examples/no-db-keywords/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] ::: ::: code-group -<<< ../examples/no-db-keywords/incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +<<< incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # no-deep-sap-cds-import @@ -23,7 +23,7 @@ This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`. The following example imports `@sap/cds`: ::: code-group -<<< ../examples/no-deep-sap-cds-import/correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] +<<< correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # no-dollar-prefixed-names @@ -23,7 +23,7 @@ Names must not start with $ to avoid possible shadowing of reserved variables. In the following example, all elements names are well defined and do not start with `$`: ::: code-group -<<< ../examples/no-dollar-prefixed-names/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # no-java-keywords @@ -23,7 +23,7 @@ The CAP Java code generation bases its class and method names on CDS entities. I In the following example, use of the reserved Java keyword as identifiers is fixed via the `@cds.java.name` annotation, so the rule doesn't raise any warnings: ::: code-group -<<< ../examples/no-java-keywords/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # no-join-on-draft @@ -23,7 +23,7 @@ Draft-enabled entities shall not be used in views that make use of `JOIN`. This In the following example, no draft-enabled entities are used in the service `CatalogService`: ::: code-group -<<< ../examples/no-join-on-draft/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] +<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds] ::: { + // local variable only, no state shared between handlers + const books = await cds.run(SELECT.from('Books')) // [!code highlight] + return books + }) + + this.on('CREATE', 'Books', newBookHandler) + await super.init() +}} + +/** @type {import('@sap/cds').CRUDEventHandler.On} */ +async function newBookHandler (req) { + const { name } = req.data + // local variable only, no state shared between handlers + const newBook = await cds.run(INSERT.into('Books').entries({ name })) // [!code highlight] + return newBook +} \ No newline at end of file diff --git a/tools/cds-lint/rules/no-shared-handler-variable/incorrect/srv/admin-service.js b/tools/cds-lint/rules/no-shared-handler-variable/incorrect/srv/admin-service.js new file mode 100644 index 0000000000..c6055d5155 --- /dev/null +++ b/tools/cds-lint/rules/no-shared-handler-variable/incorrect/srv/admin-service.js @@ -0,0 +1,23 @@ +const cds = require('@sap/cds') + +let lastCreatedBook +let lastReadBooks + +module.exports = class AdminService extends cds.ApplicationService { async init() { + this.after('READ', 'Books', async () => { + // variable from surrounding scope, state is shared between handler calls + lastReadBooks = await cds.run(SELECT.from('Books')) // [!code error] + return lastReadBooks + }) + + this.on('CREATE', 'Books', newBookHandler) + await super.init() +}} + +/** @type {import('@sap/cds').CRUDEventHandler.On} */ +async function newBookHandler (req) { + const { name } = req.data + // variable from surrounding scope, state is shared between handler calls + lastCreatedBook = await cds.run(INSERT.into('Books').entries({ name })) // [!code error] + return lastCreatedBook +} \ No newline at end of file diff --git a/tools/cds-lint/rules/no-shared-handler-variable.md b/tools/cds-lint/rules/no-shared-handler-variable/index.md similarity index 87% rename from tools/cds-lint/rules/no-shared-handler-variable.md rename to tools/cds-lint/rules/no-shared-handler-variable/index.md index e034969ee4..c974d5e9f0 100644 --- a/tools/cds-lint/rules/no-shared-handler-variable.md +++ b/tools/cds-lint/rules/no-shared-handler-variable/index.md @@ -3,7 +3,7 @@ status: released --- # no-shared-handler-variable @@ -17,10 +17,37 @@ Any function annotated with - `@type {import('@sap/cds').CRUDEventHandler.Before}`, - `@type {import('@sap/cds').CRUDEventHandler.On}`, -- or `@type {import('@sap/cds').CRUDEventHandler.After}` +- `@type {import('@sap/cds').CRUDEventHandler.After}` will also be checked by this rule. +## Examples + +### ✅   Correct example + +In the following example, only locally defined variables are used within handler implementation: + +::: code-group +<<< correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] +::: + + +### ❌   Incorrect example + +In the following example, the variables `newBook` and `readBooks` are declared in scopes surrounding the handler function, making their value available to subsequent calls of that handler. While this may seem advantageous, it can cause issues in a multitenant scenario, where the handler function can be invoked by multiple tenants. + +::: code-group +<<< incorrect/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] +::: + ## Caveats The following code styles are not checked by this rule as of today: @@ -58,31 +85,3 @@ cds.services['AdminService'].on('READ', 'Books', () => {}) #### Version This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`. - -## Examples - -### ✅   Correct example - -In the following example, only locally defined variables are used within handler implementation: - -::: code-group -<<< ../examples/no-shared-handler-variable/correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] -::: - - -### ❌   Incorrect example - -In the following example, the variables `newBook` and `readBooks` are declared in scopes surrounding the handler function, making their value available to subsequent calls of that handler. While this may seem advantageous, it can cause issues in a multitenant scenario, where the handler function can be invoked by multiple tenants. - -::: code-group -<<< ../examples/no-shared-handler-variable/incorrect/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] -::: - diff --git a/tools/cds-lint/examples/package.json b/tools/cds-lint/rules/package.json similarity index 100% rename from tools/cds-lint/examples/package.json rename to tools/cds-lint/rules/package.json diff --git a/tools/cds-lint/examples/sql-cast-suggestion/correct/db/schema.cds b/tools/cds-lint/rules/sql-cast-suggestion/correct/db/schema.cds similarity index 100% rename from tools/cds-lint/examples/sql-cast-suggestion/correct/db/schema.cds rename to tools/cds-lint/rules/sql-cast-suggestion/correct/db/schema.cds diff --git a/tools/cds-lint/examples/sql-cast-suggestion/incorrect/db/schema.cds b/tools/cds-lint/rules/sql-cast-suggestion/incorrect/db/schema.cds similarity index 100% rename from tools/cds-lint/examples/sql-cast-suggestion/incorrect/db/schema.cds rename to tools/cds-lint/rules/sql-cast-suggestion/incorrect/db/schema.cds diff --git a/tools/cds-lint/rules/sql-cast-suggestion.md b/tools/cds-lint/rules/sql-cast-suggestion/index.md similarity index 82% rename from tools/cds-lint/rules/sql-cast-suggestion.md rename to tools/cds-lint/rules/sql-cast-suggestion/index.md index f9bd060f31..5d2cd20efa 100644 --- a/tools/cds-lint/rules/sql-cast-suggestion.md +++ b/tools/cds-lint/rules/sql-cast-suggestion/index.md @@ -7,7 +7,7 @@ status: released --- # sql-cast-suggestion @@ -23,7 +23,7 @@ With compiler v2, appending a type declaration to a column expression in a view' In the following example, the entity `ListOfBooks` contains explicit casts for elements `name2` and `name3`, so the rule will not be triggered for these elements: ::: code-group -<<< ../examples/sql-cast-suggestion/correct/db/schema.cds#snippet{ts:line-numbers} [db/schema.cds] +<<< correct/db/schema.cds#snippet{ts:line-numbers} [db/schema.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # sql-null-comparison @@ -24,7 +24,7 @@ Comparing values against `null` in views is a common pitfall in SQL. This rule h In the following example, the rule is satisfied because `null` comparison is valid: ::: code-group -<<< ../examples/sql-null-comparison/correct/srv/cat-service.cds#snippet{cds:line-numbers} [db/schema.cds] +<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [db/schema.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # start-elements-lowercase ## Rule Details -According to our [naming conventions](../../../guides/domain-modeling#naming-conventions), to easily distinguish entity names from element names we recommend starting elements with a *lowercase* letter, which this rule ensures. +According to our [naming conventions](../../../../guides/domain-modeling#naming-conventions), to easily distinguish entity names from element names we recommend starting elements with a *lowercase* letter, which this rule ensures. ## Examples @@ -23,7 +23,7 @@ According to our [naming conventions](../../../guides/domain-modeling#naming-con In the following example, the rule is satisfied because the element name `title` starts with a lowercase letter: ::: code-group -<<< ../examples/start-elements-lowercase/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # start-entities-uppercase @@ -15,7 +15,7 @@ status: released ## Rule Details -According to our [naming conventions](../../../guides/domain-modeling#naming-conventions), to easily distinguish entity names from element names we recommend starting entity names with *capital* letters, which this rule ensures. +According to our [naming conventions](../../../../guides/domain-modeling#naming-conventions), to easily distinguish entity names from element names we recommend starting entity names with *capital* letters, which this rule ensures. ## Examples @@ -24,7 +24,7 @@ According to our [naming conventions](../../../guides/domain-modeling#naming-con In the following example, the rule is satisfied because the entity name `Books` starts with a capital letter: ::: code-group -<<< ../examples/start-entities-uppercase/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # use-cql-select-template-strings ## Rule Details -Discourages use of SELECT(\`...\`), which allows [SQL injection attacks](../../../node.js/cds-ql#avoiding-sql-injection), in favor of SELECT \`...\`. +Discourages use of SELECT(\`...\`), which allows [SQL injection attacks](../../../../node.js/cds-ql#avoiding-sql-injection), in favor of SELECT \`...\`. #### Version This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`. @@ -22,7 +22,7 @@ This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`. In the following example, the `where` clause is a proper tagged template literal, so that the `req.data.name` expression can be validated before the SELECT is executed: ::: code-group -<<< ../examples/use-cql-select-template-strings/correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] +<<< correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js] ::: - import PlaygroundBadge from '../components/PlaygroundBadge.vue' + import PlaygroundBadge from '../../components/PlaygroundBadge.vue' # valid-csv-header @@ -21,7 +21,7 @@ To provide your database with initial data, you can use CSV files. Their filenam Let's consider the following model definition: ::: code-group -<<< ../examples/valid-csv-header/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] ::: #### ✅   Correct example @@ -29,7 +29,7 @@ Let's consider the following model definition: The following example shows a correct CSV file header that matches the column names of the entity definition: ::: code-group -<<< ../examples/valid-csv-header/correct/db/data/sap.capire.bookshop-Books.csv#snippet{csv:line-numbers} [db/data/sap.capire.bookshop-Books.csv] +<<< correct/db/data/sap.capire.bookshop-Books.csv#snippet{csv:line-numbers} [db/data/sap.capire.bookshop-Books.csv] ::: Date: Fri, 26 Sep 2025 09:10:24 +0200 Subject: [PATCH 14/43] Maven modules are now globally resolved by default (#2113) @rjayasinghe Can't add you as reviewer somehow. Maybe you are not yet properly onboarded into the new capire GitHub org? --- guides/extensibility/composition.md | 2 +- java/building-plugins.md | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/guides/extensibility/composition.md b/guides/extensibility/composition.md index 223f9dfea1..c04d25bdc5 100644 --- a/guides/extensibility/composition.md +++ b/guides/extensibility/composition.md @@ -134,7 +134,7 @@ Add the dependency to the reuse package to your `pom.xml`: ::: As Maven dependencies are - in contrast to `npm` packages - downloaded into a global cache, you need to make the artifacts from the reuse package available in your project locally. -The CDS Maven Plugin provides a simple goal named `resolve`, that performs this task for you and extracts reuse packages into the `target/cds/` folder of the Maven project. +The CDS Maven Plugin provides a simple goal named `resolve`, that performs this task for you and extracts reuse packages into the `target/cds/` folder of the CAP project. Include this goal into the `pom.xml`, if not already present: ::: code-group diff --git a/java/building-plugins.md b/java/building-plugins.md index 03a2e78a64..8f7136f764 100644 --- a/java/building-plugins.md +++ b/java/building-plugins.md @@ -22,7 +22,7 @@ In the following sections, the different extension points and mechanisms are exp ### Java Version -When building CAP Java plugin modules, you need to keep in mind that the generated Java byte code of the plugin has to be compatible with the Java byte code version of the potential consumers of the plugin. To be on the safe side, we recommend using *Java 17* as this is anyways the minimum Java version for CAP Java (for 2.x release) applications. In case you deviate from this you need to check and align with the potential consumers of the plugin. +When building CAP Java plugin modules, you need to keep in mind that the generated Java byte code of the plugin has to be compatible with the Java byte code version of the potential consumers of the plugin. To be on the safe side, we recommend using *Java 17* as this is anyways the minimum Java version for CAP Java applications. In case you deviate from this you need to check and align with the potential consumers of the plugin. ### Maven GroupId and Java Packages @@ -31,13 +31,12 @@ Of course, it's up to your project / plugin how you call the corresponding Maven ## Share CDS Models via Maven Artifacts -Before the CAP Java 2.2 release CDS definitions had to be shared as Node.js modules, also for Java projects. - -Starting with the 2.2 release CDS models, CSV import data and i18n files can now be shared through Maven dependencies in addition to npm packages. This means you can now provide CDS models, CSV files, i18n files, and Java code (for example, event handlers) in a single Maven dependency. +CDS models, CSV import data and i18n files can be shared through Maven dependencies. In addition they can also be shared through npm packages. +This means you can provide CDS models, CSV files, i18n files, and Java code (for example, event handlers) in a single Maven dependency. ### Create the CDS Model in a New Maven Artifact -Simply create a plain Maven Java project and place your CDS models in the `main/resources/cds` folder of the reuse package under a unique module directory (for example, leveraging group ID and artifact ID): `src/main/resources/cds/com.sap.capire/bookshop/`. With `com.sap.capire` being the group ID and `bookshop` being the artifact ID. +Simply create a plain Maven Java project and place your CDS models in the `src/main/resources/cds` folder of the reuse package under a unique module directory (for example, leveraging group ID and artifact ID): `src/main/resources/cds/com.sap.capire/bookshop/`. With `com.sap.capire` being the group ID and `bookshop` being the artifact ID. You can simplify the creation of such a **plain Maven Java** project by calling the following Maven archetype command: @@ -65,7 +64,7 @@ Projects wanting to import the content simply add a Maven dependency to the reus ``` ::: -Additionally, the new `resolve` goal from the CDS Maven Plugin needs to be added, to extract the models into the `target/cds/` folder of the Maven project, in order to make them available to the CDS Compiler. +Additionally, the `resolve` goal from the CDS Maven Plugin needs to be added, to extract the models into the `target/cds/` folder of the Maven project, in order to make them available to the CDS Compiler. ::: code-group ```xml [srv/pom.xml] @@ -87,8 +86,8 @@ Additionally, the new `resolve` goal from the CDS Maven Plugin needs to be added ``` ::: -::: details Reuse module as Maven module -Please be aware that the module that uses the reuse module needs to be a Maven module itself or a submodule to a Maven module that declares the dependency to the Maven module. Usually you would declare the dependency in the `srv` module of your CAP Java project and use the reuse model in the service's CDS files then. In case you want to use the reuse model in your `db` module you need to make sure that your `db` module is a Maven module and include it to the project's parent `pom.xml` file. +::: details Scope of the Reuse Package +Usually you would declare the dependency to the reuse package in the `srv` module of your CAP Java project. Since CAP Java 4.4.0 this makes the reuse models available to all CDS files in the CAP project. The models are extracted to the root `target/cds` folder. In case you want to make the reuse models only available within the Maven module that declared the dependency (e.g. `srv`) set the configuration `to` of the `resolve` goal to `${project.build.directory}`. In earlier versions of CAP Java reuse models where only available within CDS files placed in the Maven module that declared the dependency by default. ::: When your Maven build is set up correctly, you can use the reuse models in your CDS files using the standard `using` directive: @@ -112,7 +111,7 @@ In most of the cases an event handler plugin for a CAP Java application can be a ```xml - 2.4.0 + ... From 61d4433ce7302286013cc87ff24a7f31340e2189 Mon Sep 17 00:00:00 2001 From: Rene Jeglinsky Date: Fri, 26 Sep 2025 10:31:14 +0200 Subject: [PATCH 15/43] fix external menu --- menu.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/menu.md b/menu.md index 716409ff24..105c808e23 100644 --- a/menu.md +++ b/menu.md @@ -88,15 +88,15 @@ ### [Personal Data Management](guides/data-privacy/pdm) ### [Data Retention Management](guides/data-privacy/drm) -## [Deployment](../guides/deployment/) - - ### [Deploy to Cloud Foundry](../guides/deployment/to-cf) - ### [Deploy to Kyma/K8s](../guides/deployment/to-kyma) - ### [Microservices with CAP](../guides/deployment/microservices) - ### [Deploy with Confidence](../guides/deployment/dwc) - ### [Deploy with CI/CD](../guides/deployment/cicd) - ### [Custom Builds](../guides/deployment/custom-builds) - ### [Health Checks](../guides/deployment/health-checks) +## [Deployment](guides/deployment/) + + ### [Deploy to Cloud Foundry](guides/deployment/to-cf) + ### [Deploy to Kyma/K8s](guides/deployment/to-kyma) + ### [Microservices with CAP](guides/deployment/microservices) + ### [Deploy with Confidence](guides/deployment/dwc) + ### [Deploy with CI/CD](guides/deployment/cicd) + ### [Custom Builds](guides/deployment/custom-builds) + ### [Health Checks](guides/deployment/health-checks) ## [Multitenancy](../guides/multitenancy/) From 9bb0c9c49208b9ccda3565c7bda8f171b712ab12 Mon Sep 17 00:00:00 2001 From: Rene Jeglinsky Date: Fri, 26 Sep 2025 10:33:33 +0200 Subject: [PATCH 16/43] move file --- tools/console.md | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 tools/console.md diff --git a/tools/console.md b/tools/console.md deleted file mode 100644 index 36b7d9f95d..0000000000 --- a/tools/console.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -# status: released -synopsis: Learn how to install, configure, and use the CAP Console. ---- - -# CAP Console - -:::tip WIP -More content coming soon -::: \ No newline at end of file From 12e5c06ff338e8bce9066d41fda2c7c8da939002 Mon Sep 17 00:00:00 2001 From: Steffen Waldmann Date: Fri, 26 Sep 2025 11:01:52 +0200 Subject: [PATCH 17/43] Better wording and links in multitenancy guide --- guides/multitenancy/index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/guides/multitenancy/index.md b/guides/multitenancy/index.md index a7a14feba8..a937b9d0e9 100644 --- a/guides/multitenancy/index.md +++ b/guides/multitenancy/index.md @@ -772,10 +772,10 @@ cds up --to k8s ::: -:::tip -To prevent potential conflicts during the initial creation of the MTXS Metadata Container `t0`, it is recommended to perform the -initial deployment with only one instance of the MTXS Sidecar.
-As an alternative, you can run the command `cds-mtx upgrade t0` beforehand, such as in a [cf hook](https://help.sap.com/docs/btp/sap-business-technology-platform/module-hooks). +:::tip Ensure a unique metadata container +To prevent potential conflicts during the initial creation of the MTXS metadata container (`t0`), it is recommended to perform the initial deployment with only one instance of the MTXS sidecar. + +Alternatively, you can run `cds-mtx upgrade t0` beforehand, such as in a [Cloud Foundry hook](#run-as-cloud-foundry-hook). ::: From 7a41caed8c9b34771aa649ec64cecf1a393b4c11 Mon Sep 17 00:00:00 2001 From: sjvans <30337871+sjvans@users.noreply.github.com> Date: Fri, 26 Sep 2025 12:31:33 +0200 Subject: [PATCH 18/43] [cds^9.4] feat: `SELECT ... .stream ()` (#2114) --- node.js/cds-ql.md | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/node.js/cds-ql.md b/node.js/cds-ql.md index 3c17956112..51eb0b8c02 100644 --- a/node.js/cds-ql.md +++ b/node.js/cds-ql.md @@ -704,30 +704,37 @@ If a queried record is already exclusively locked by another transaction, the `. Passes hints to the database query optimizer that can influence the execution plan. The hints can be passed as individual arguments or as an array. - ```js SELECT ... .hints ('IGNORE_PLAN_CACHE') SELECT ... .hints ('IGNORE_PLAN_CACHE', 'MAX_CONCURRENCY(1)') SELECT ... .hints (['IGNORE_PLAN_CACHE', 'MAX_CONCURRENCY(1)']) ``` -### pipeline() {.method} -Returns the data from the database as a raw stream. +### pipeline() {.method} +Pipes the data from the database into the given writable stream. ```js -SELECT ... .pipeline () SELECT ... .pipeline (cds.context.http.res) ``` > Please note that the after handlers don't have effect if this stream is piped to the HTTP response. + +### stream() {.method} + +Returns the data from the database as a raw stream. + +```js +SELECT ... .stream () +``` + + ### foreach() {.method} Creates an object stream and calls the provided callback for each object. - ```js await SELECT.from(Books).foreach ((book) => { ... }) ``` @@ -742,6 +749,8 @@ for await (const book of SELECT.from(Books)) { ... } As of now, `SELECT.foreach()` and `SELECT.pipeline()` are only supported by `cds.DatabaseService`. `cds.RemoteService` does not support the streaming APIs yet. ::: + + ## INSERT {.class} Fluent API to construct [CQN INSERT](../cds/cqn#insert) query objects in a [CQL](../cds/cql)/SQL-like style. In contrast to SQL, though, the clauses can be arrayed in arbitrary order. From d6cf36bbdad74404f08930d9a67088b9d6ba047f Mon Sep 17 00:00:00 2001 From: Johannes Vogel <31311694+johannes-vogel@users.noreply.github.com> Date: Tue, 30 Sep 2025 14:17:25 +0200 Subject: [PATCH 19/43] docs: hana cloud maintenance (#2016) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Adrian Görler Co-authored-by: Rene Jeglinsky --- guides/databases-hana.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/guides/databases-hana.md b/guides/databases-hana.md index 2c7733c920..a0089e768f 100644 --- a/guides/databases-hana.md +++ b/guides/databases-hana.md @@ -9,10 +9,14 @@ status: released [SAP HANA Cloud](https://www.sap.com/products/technology-platform/hana.html) is supported as the CAP standard database and recommended for productive use with full support for schema evolution and multitenancy. -::: warning +::: warning Validation strategy CAP isn't validated with other variants of SAP HANA, like "SAP HANA Database as a Service" or "SAP HANA (on premise)". +The database services are validated against the latest maintained QRC version of SAP HANA Cloud. It's not guaranteed that outdated versions are fully functional with the latest database services. + +[See the official SAP HANA Cloud documentation for their maintenance strategy.](https://help.sap.com/docs/HANA_CLOUD_CN/1f64fe39189f4176bf659e737d62222a/6ced4d164e234b74aa9bea82435ce9a8.html){.learn-more} + ::: ## Setup & Configuration @@ -53,9 +57,6 @@ The datasource for SAP HANA is then auto-configured based on available service b ::: - - - ## Running `cds build` Deployment to SAP HANA is done via the [SAP HANA Deployment Infrastructure (HDI)](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-developer-guide-for-cloud-foundry-multitarget-applications-sap-business-app-studio/sap-hdi-deployer?) which in turn requires running `cds build` to generate all the deployable HDI artifacts. For example, run this in [capire/bookshop](https://github.com/capire/bookshop): From e1f115cad2da4e9d5f2bc759011a8640185a7ef6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 16:36:35 +0200 Subject: [PATCH 20/43] chore(deps): update dependency @cap-js/cds-types to v0.15.0 (#2119) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs from Renovate will soon appear from 'Mend'. Learn more [here](https://redirect.github.com/renovatebot/renovate/discussions/37842). This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [@cap-js/cds-types](https://cap.cloud.sap/) ([source](https://redirect.github.com/cap-js/cds-types)) | [`0.14.0` -> `0.15.0`](https://renovatebot.com/diffs/npm/@cap-js%2fcds-types/0.14.0/0.15.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@cap-js%2fcds-types/0.15.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@cap-js%2fcds-types/0.14.0/0.15.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
cap-js/cds-types (@​cap-js/cds-types) ### [`v0.15.0`](https://redirect.github.com/cap-js/cds-types/blob/HEAD/CHANGELOG.md#0150---2025-09-26) [Compare Source](https://redirect.github.com/cap-js/cds-types/compare/v0.14.0...v0.15.0) ##### Added - Allow array-like params in CQN.expr via `{ list: [...] }` syntax - Types for `cds.error()` - `GetRequest` and `PostRequest` types ##### Changed ##### Deprecated ##### Removed ##### Fixed ##### Security
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/capire/docs). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 131 +++++++++++++--------------------------------- 1 file changed, 37 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index f879055b4f..3b45c0aa84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -189,6 +189,7 @@ "integrity": "sha512-PTAFMJOpVtJweExEYYgdmSCC6n4V/R+ctDL3fRQy77ulZM/p+zMLIQC9c7HCQE1zqpauvVck3f2zYSejaUTtrw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.38.0", "@algolia/requester-browser-xhr": "5.38.0", @@ -351,12 +352,13 @@ } }, "node_modules/@cap-js/cds-types": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@cap-js/cds-types/-/cds-types-0.14.0.tgz", - "integrity": "sha512-wscDWFRAsrjFz0cF5moaJAhIOi7SVKyUYqZ7UeOW1SaJRbhYed9wDIFVGpB2h2jME/rqX1pPGhGvQQcqwFMRxw==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@cap-js/cds-types/-/cds-types-0.15.0.tgz", + "integrity": "sha512-Bi0uQnzpCzBw2KHzFuMzobt0mvMG3as3bfVvRJAc8ooRuoVMyr3Y0iRVjmmoyOeE2ezG6EiF+Xp22QpJ7J+z+Q==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "peerDependencies": { "@sap/cds": ">=9.0.0", "@sap/cds-dk": "^9", @@ -558,7 +560,8 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.18.tgz", "integrity": "sha512-EF77RqROHL+4LhMGW5NTeKqfUd/e4OOv6EDFQ/UQQiFyWuqkEKyEz0NDILxOFxWUEVdjT2GQ2cC7t12B6pESwg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-dart": { "version": "2.3.1", @@ -698,14 +701,16 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.12.tgz", "integrity": "sha512-JFffQ1dDVEyJq6tCDWv0r/RqkdSnV43P2F/3jJ9rwLgdsOIXwQbXrz6QDlvQLVvNSnORH9KjDtenFTGDyzfCaA==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-html-symbol-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.4.tgz", "integrity": "sha512-afea+0rGPDeOV9gdO06UW183Qg6wRhWVkgCFwiO3bDupAoyXRuvupbb5nUyqSTsLXIKL8u8uXQlJ9pkz07oVXw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-java": { "version": "5.0.12", @@ -903,7 +908,8 @@ "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-vue": { "version": "3.0.5", @@ -1556,6 +1562,7 @@ "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -2393,6 +2400,7 @@ "integrity": "sha512-xA9EN29X8HKaz83Aod1e3Bs6LRvqcCVoaTvCtyOup5rMYDQumcoZ7UOKH6NIUTeO0zOtafUiMHucMG+dBnq5XQ==", "dev": true, "license": "SEE LICENSE IN LICENSE", + "peer": true, "dependencies": { "@sap/cds-compiler": "^6.1", "@sap/cds-fiori": "^2", @@ -2708,6 +2716,7 @@ "integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -2875,6 +2884,7 @@ "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.44.1", "@typescript-eslint/types": "8.44.1", @@ -3356,7 +3366,6 @@ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -3371,6 +3380,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3421,6 +3431,7 @@ "integrity": "sha512-8VJKIzheeI9cjuVJhU1hYEVetOTe7LvA+CujAI7yqvYsPtZfVEvv1pg9AeFNtHBg/ZoSLGU5LPijhcY5l3Ea9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.4.0", "@algolia/client-abtesting": "5.38.0", @@ -3486,8 +3497,7 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/array-timsort": { "version": "1.0.3", @@ -3519,7 +3529,6 @@ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -3545,7 +3554,6 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -3555,8 +3563,7 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/boolbase": { "version": "1.0.0", @@ -3594,7 +3601,6 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -3605,7 +3611,6 @@ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -3620,7 +3625,6 @@ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" @@ -3830,7 +3834,6 @@ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "safe-buffer": "5.2.1" }, @@ -3844,7 +3847,6 @@ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -3855,7 +3857,6 @@ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -3865,8 +3866,7 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/copy-anything": { "version": "3.0.5", @@ -4171,7 +4171,6 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -4192,7 +4191,6 @@ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -4232,7 +4230,6 @@ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -4254,8 +4251,7 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -4277,7 +4273,6 @@ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -4314,7 +4309,6 @@ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -4325,7 +4319,6 @@ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -4336,7 +4329,6 @@ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -4388,8 +4380,7 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -4410,6 +4401,7 @@ "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -4675,7 +4667,6 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -4686,7 +4677,6 @@ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -4734,7 +4724,6 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -4744,8 +4733,7 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/extend-shallow": { "version": "2.0.1", @@ -4888,7 +4876,6 @@ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -4908,7 +4895,6 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -4918,8 +4904,7 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", @@ -4985,6 +4970,7 @@ "integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "tabbable": "^6.2.0" } @@ -5012,7 +4998,6 @@ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -5023,7 +5008,6 @@ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -5049,7 +5033,6 @@ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5070,7 +5053,6 @@ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -5096,7 +5078,6 @@ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -5193,7 +5174,6 @@ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -5267,7 +5247,6 @@ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -5281,7 +5260,6 @@ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -5361,7 +5339,6 @@ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -5379,7 +5356,6 @@ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5470,8 +5446,7 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ini": { "version": "4.1.1", @@ -5489,7 +5464,6 @@ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.10" } @@ -5983,7 +5957,6 @@ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" } @@ -6236,7 +6209,6 @@ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -6247,7 +6219,6 @@ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true, "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -6268,7 +6239,6 @@ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -6865,7 +6835,6 @@ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "mime": "cli.js" }, @@ -6879,7 +6848,6 @@ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -6890,7 +6858,6 @@ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "mime-db": "1.52.0" }, @@ -6994,7 +6961,6 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -7026,7 +6992,6 @@ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4" }, @@ -7040,7 +7005,6 @@ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ee-first": "1.1.1" }, @@ -7163,7 +7127,6 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -7217,8 +7180,7 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/perfect-debounce": { "version": "1.0.0", @@ -7328,7 +7290,6 @@ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -7363,7 +7324,6 @@ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "side-channel": "^1.0.6" }, @@ -7401,7 +7361,6 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -7412,7 +7371,6 @@ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -7603,16 +7561,14 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/sass": { "version": "1.93.2", @@ -7620,6 +7576,7 @@ "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -7676,7 +7633,6 @@ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -7702,7 +7658,6 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -7712,8 +7667,7 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/send/node_modules/encodeurl": { "version": "1.0.2", @@ -7721,7 +7675,6 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -7732,7 +7685,6 @@ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -7748,8 +7700,7 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -7823,7 +7774,6 @@ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", @@ -7844,7 +7794,6 @@ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" @@ -7862,7 +7811,6 @@ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -7882,7 +7830,6 @@ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", @@ -7967,7 +7914,6 @@ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8183,7 +8129,6 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.6" } @@ -8270,7 +8215,6 @@ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -8387,7 +8331,6 @@ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8415,7 +8358,6 @@ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.4.0" } @@ -8426,7 +8368,6 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -8467,6 +8408,7 @@ "integrity": "sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -8609,6 +8551,7 @@ "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.22", "@vue/compiler-sfc": "3.5.22", From 17f93aec2755ec5b44f7a8a1935f2bf438742969 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 16:36:52 +0200 Subject: [PATCH 21/43] chore(deps): update dependency @typescript-eslint/parser to v8.45.0 (#2121) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Coming soon: The Renovate bot (GitHub App) will be renamed to Mend. PRs from Renovate will soon appear from 'Mend'. Learn more [here](https://redirect.github.com/renovatebot/renovate/discussions/37842). This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.44.1` -> `8.45.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.44.1/8.45.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/8.45.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/8.44.1/8.45.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
typescript-eslint/typescript-eslint (@​typescript-eslint/parser) ### [`v8.45.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8450-2025-09-29) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.44.1...v8.45.0) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/capire/docs). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 68 +++++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3b45c0aa84..674af15dbd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2879,17 +2879,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/parser": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.1.tgz", - "integrity": "sha512-EHrrEsyhOhxYt8MTg4zTF+DJMuNBzWwgvvOYNj/zm1vnaD/IC5zCXFehZv94Piqa2cRFfXrTFxIvO95L7Qc/cw==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", + "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.44.1", - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/typescript-estree": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1", + "@typescript-eslint/scope-manager": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/typescript-estree": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", "debug": "^4.3.4" }, "engines": { @@ -2905,14 +2905,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.1.tgz", - "integrity": "sha512-ycSa60eGg8GWAkVsKV4E6Nz33h+HjTXbsDT4FILyL8Obk5/mx4tbvCNsLf9zret3ipSumAOG89UcCs/KRaKYrA==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", + "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.44.1", - "@typescript-eslint/types": "^8.44.1", + "@typescript-eslint/tsconfig-utils": "^8.45.0", + "@typescript-eslint/types": "^8.45.0", "debug": "^4.3.4" }, "engines": { @@ -2927,14 +2927,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.1.tgz", - "integrity": "sha512-NdhWHgmynpSvyhchGLXh+w12OMT308Gm25JoRIyTZqEbApiBiQHD/8xgb6LqCWCFcxFtWwaVdFsLPQI3jvhywg==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", + "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1" + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2945,9 +2945,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.1.tgz", - "integrity": "sha512-B5OyACouEjuIvof3o86lRMvyDsFwZm+4fBOqFHccIctYgBjqR3qT39FBYGN87khcgf0ExpdCBeGKpKRhSFTjKQ==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", + "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", "dev": true, "license": "MIT", "engines": { @@ -2962,9 +2962,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.1.tgz", - "integrity": "sha512-Lk7uj7y9uQUOEguiDIDLYLJOrYHQa7oBiURYVFqIpGxclAFQ78f6VUOM8lI2XEuNOKNB7XuvM2+2cMXAoq4ALQ==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", + "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", "dev": true, "license": "MIT", "engines": { @@ -2976,16 +2976,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.1.tgz", - "integrity": "sha512-qnQJ+mVa7szevdEyvfItbO5Vo+GfZ4/GZWWDRRLjrxYPkhM+6zYB2vRYwCsoJLzqFCdZT4mEqyJoyzkunsZ96A==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", + "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.44.1", - "@typescript-eslint/tsconfig-utils": "8.44.1", - "@typescript-eslint/types": "8.44.1", - "@typescript-eslint/visitor-keys": "8.44.1", + "@typescript-eslint/project-service": "8.45.0", + "@typescript-eslint/tsconfig-utils": "8.45.0", + "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/visitor-keys": "8.45.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3005,13 +3005,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.1.tgz", - "integrity": "sha512-576+u0QD+Jp3tZzvfRfxon0EA2lzcDt3lhUbsC6Lgzy9x2VR4E+JUiNyGHi5T8vk0TV+fpJ5GLG1JsJuWCaKhw==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", + "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.44.1", + "@typescript-eslint/types": "8.45.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { From 47971d9f29abd71c1c73bc0f01b53cf2b3c02724 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 11:31:16 +0200 Subject: [PATCH 22/43] chore: Update CLI texts (#2123) Updates the output of cds CLI texts to the latest version. Co-authored-by: chgeo <7470719+chgeo@users.noreply.github.com> --- tools/assets/help/cds-typer.out.md | 6 ++++++ tools/assets/help/cds-version-md.out.md | 4 ++-- tools/assets/help/cds-version.out.md | 4 ++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/tools/assets/help/cds-typer.out.md b/tools/assets/help/cds-typer.out.md index 594fcf474f..319d059c51 100644 --- a/tools/assets/help/cds-typer.out.md +++ b/tools/assets/help/cds-typer.out.md @@ -75,6 +75,12 @@ OPTIONS Root directory to write the generated files to. + --outputDTsFiles + --output_d_ts_files: <true | false> + (default: false) + + (experimental) If set to true, emits .d.ts files for each generated .js file. If set to false (default), emits .ts files instead. Note: skipLibCheck must be set to true in your tsconfig for this option to work properly. + --propertiesOptional --properties_optional: <true | false> (default: true) diff --git a/tools/assets/help/cds-version-md.out.md b/tools/assets/help/cds-version-md.out.md index 99b71df996..d34da248da 100644 --- a/tools/assets/help/cds-version-md.out.md +++ b/tools/assets/help/cds-version-md.out.md @@ -11,8 +11,8 @@ | @sap/cds-fiori | 2.0.1 | | @sap/cds-mtxs | 3.3.1 | | @cap-js/asyncapi | 1.0.3 | -| @cap-js/db-service | 2.4.0 | +| @cap-js/db-service | 2.5.1 | | @cap-js/openapi | 1.2.3 | -| @cap-js/sqlite | 2.0.2 | +| @cap-js/sqlite | 2.0.3 | | Node.js | v22.19.0 | diff --git a/tools/assets/help/cds-version.out.md b/tools/assets/help/cds-version.out.md index cd763573e7..41d2f5b66b 100644 --- a/tools/assets/help/cds-version.out.md +++ b/tools/assets/help/cds-version.out.md @@ -9,8 +9,8 @@ @sap/cds-fiori: 2.0.1 @sap/cds-mtxs: 3.3.1 @cap-js/asyncapi: 1.0.3 -@cap-js/db-service: 2.4.0 +@cap-js/db-service: 2.5.1 @cap-js/openapi: 1.2.3 -@cap-js/sqlite: 2.0.2 +@cap-js/sqlite: 2.0.3 Node.js: v22.19.0 From 03e6aa4d82645930b9938ccb3675b1f387839abf Mon Sep 17 00:00:00 2001 From: Marc Becker Date: Thu, 2 Oct 2025 09:19:56 +0200 Subject: [PATCH 23/43] Improve explanations around custom Spring Security configurations (#2111) Co-authored-by: Mahati Shankar <93712176+smahati@users.noreply.github.com> --- java/security.md | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/java/security.md b/java/security.md index 25f19f7fc0..0eba8a281f 100644 --- a/java/security.md +++ b/java/security.md @@ -42,7 +42,7 @@ Without security configured, CDS services are exposed to public. Proper configur ## Authentication { #authentication} -Authentication rejects user requests with invalid authentication and limits the possible resource impact. +Authentication rejects user requests with invalid authentication and limits the possible resource impact. Rejecting them as soon as possible is one of the reasons why it's not an integral part of the CAP runtime and needs to be configured on the application framework level. In addition, CAP Java is based on a [modular architecture](./developing-applications/building#modular_architecture) and allows flexible configuration of any authentication method. By default, it supports the standard BTP platform identity services [out of the box](#xsuaa-ias): @@ -50,7 +50,7 @@ By default, it supports the standard BTP platform identity services [out of the - [SAP Cloud Identity Services Identity Authentication (IAS)](https://help.sap.com/docs/cloud-identity-services) - preferred solution integrating endpoints cross SAP-systems - [SAP Authorization and Trust Management Service (XSUAA)](https://help.sap.com/docs/authorization-and-trust-management-service) - previous offering scoped to a BTP landscape -Which are highly recommended for production usage. For specific use cases, [custom authentication](#custom-authentication) can be configured as well. +Which are highly recommended for production usage. For specific use cases, [custom authentication](#custom-authentication) can be configured as well. Local development and testing can be done easily with built-in [mock user](#mock-users) support. ### Configure XSUAA and IAS Authentication { #xsuaa-ias} @@ -164,7 +164,10 @@ Please note that the authentication mode has no impact on the *authorization* be #### Customizing Spring Boot Security Configuration { #custom-spring-security-config} -If you want to explicitly change the automatic security configuration, you can add an _additional_ Spring security configuration on top that overrides the default configuration by CAP. This can be useful, for instance, if an alternative authentication method is required for *specific endpoints* of your application. +If you want to explicitly change the automatic security configuration, you can add an _additional_ Spring security configuration on top that overrides the default configuration by CAP. +This can be useful, for instance, if an alternative authentication method is required for *specific endpoints* of your application. + +As the default security configurations provided by CAP act as the last line of defense and handle any request by default, you need to ensure that your custom security configurations have higher precedence. At the `SecurityFilterChain` bean method, set the `@Order` annotation with a lower numeric value, for example `1`: ```java @Configuration @@ -184,9 +187,6 @@ public class AppSecurityConfig { } ``` Due to the custom configuration, all URLs matching `/public/**` are opened for public access. -::: tip -The Spring `SecurityFilterChain` requires CAP Java SDK [1.27.x](../releases/archive/2022/aug22#minimum-spring-boot-version-2-7-x) or later. Older versions need to use the deprecated `WebSecurityConfigurerAdapter`. -::: ::: warning _❗ Warning_ Be cautious with the configuration of the `HttpSecurity` instance in your custom configuration. Make sure that only the intended endpoints are affected. @@ -201,7 +201,7 @@ public class ActuatorSecurityConfig { @Bean @Order(1) - public SecurityFilterChain actuatorFilterChain(HttpSecurity http) + public SecurityFilterChain actuatorFilterChain(HttpSecurity http) throws Exception { return http .securityMatcher(AntPathRequestMatcher.antMatcher("/actuator/**")) @@ -214,6 +214,8 @@ public class ActuatorSecurityConfig { } ``` +In case you want to write your own custom security configuration that acts as a last line of defense and handles any request you need to disable the CAP security configurations by setting cds.security.authentication.authConfig.enabled: false, as Spring Security forbids registering multiple security configurations with an any request security matcher. + ### Custom Authentication { #custom-authentication} You're free to configure any authentication method according to your needs. CAP isn't bound to any specific authentication method or user representation such as introduced with XSUAA, it rather runs the requests based on a [user abstraction](../guides/security/authorization#user-claims). The CAP user of a request is represented by a [UserInfo](https://www.javadoc.io/doc/com.sap.cds/cds-services-api/latest/com/sap/cds/services/request/UserInfo.html) object that can be retrieved from the [RequestContext](https://www.javadoc.io/doc/com.sap.cds/cds-services-api/latest/com/sap/cds/services/request/RequestContext.html) as explained in [Enforcement API & Custom Handlers](#enforcement-api). @@ -238,7 +240,7 @@ public class CustomUserInfoProvider implements UserInfoProvider { } } if (userInfo != null) { - /* any modification of the resolved user goes here: */ + /* any modification of the resolved user goes here: */ XsuaaUserInfo xsuaaUserInfo = userInfo.as(XsuaaUserInfo.class); userInfo.setName(xsuaaUserInfo.getEmail() + "/" + xsuaaUserInfo.getOrigin()); // normalizes name @@ -625,7 +627,7 @@ In addition to standard authorization, CAP Java provides additional out of the b ### Deep Authorization { #deep-auth} -Queries to Application Services are not only authorized by the target entity which has a `@restrict` or `@requires` annotation, but also for all __associated entities__ that are used in the statement. +Queries to Application Services are not only authorized by the target entity which has a `@restrict` or `@requires` annotation, but also for all __associated entities__ that are used in the statement. __Compositions__ are neither checked nor extended with additional filters. For instance, consider the following model: @@ -643,15 +645,15 @@ entity Orders { } ``` -For the following OData request `GET Orders(ID='1')/items?$expand=book`, authorizations for `Orders` and for `Books` are checked. -If the entity `Books` has a `where` clause for [instance-based authorization](/java/security#instance-based-auth), +For the following OData request `GET Orders(ID='1')/items?$expand=book`, authorizations for `Orders` and for `Books` are checked. +If the entity `Books` has a `where` clause for [instance-based authorization](/java/security#instance-based-auth), it will be added as a filter to the sub-request with the expand. -Custom CQL statements submitted to the [Application Service](/java/cqn-services/application-services) instances +Custom CQL statements submitted to the [Application Service](/java/cqn-services/application-services) instances are also authorized by the same rules including the path expressions and subqueries used in them. -For example, the following statement checks role-based authorizations for both `Orders` and `Books`, -because the association to `Books` is used in the select list. +For example, the following statement checks role-based authorizations for both `Orders` and `Books`, +because the association to `Books` is used in the select list. ```java Select.from(Orders_.class, @@ -675,15 +677,15 @@ Be careful when you modify or extend the statements in custom handlers. Make sure you keep the filters for authorization. ::: -Starting with CAP Java `4.0`, deep authorization is on by default. +Starting with CAP Java `4.0`, deep authorization is on by default. It can be disabled by setting cds.security.authorization.deep.enabled: false. [Learn more about `@restrict.where` in the instance-based authorization guide.](/guides/security/authorization#instance-based-auth){.learn-more} ### Forbidden on Rejected Entity Selection { #reject-403 } -Entities that have an instance-based authorization condition, that is [`@restrict.where`](/guides/security/authorization#restrict-annotation), -are guarded by the CAP Java runtime by adding a filter condition to the DB query **excluding not matching instances from the result**. +Entities that have an instance-based authorization condition, that is [`@restrict.where`](/guides/security/authorization#restrict-annotation), +are guarded by the CAP Java runtime by adding a filter condition to the DB query **excluding not matching instances from the result**. Hence, if the user isn't authorized to query an entity, requests targeting a *single* entity return *404 - Not Found* response and not *403 - Forbidden*. To allow the UI to distinguish between *not found* and *forbidden*, CAP Java can detect this situation and rejects`PATCH` and `DELETE` requests to single entities with forbidden accordingly. From f0476191bfc2b75d545e5541716c20a7947269a1 Mon Sep 17 00:00:00 2001 From: "Dr. David A. Kunz" Date: Thu, 2 Oct 2025 10:13:24 +0200 Subject: [PATCH 24/43] [cds^9.4] Lean draft improvements (#2080) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: sjvans <30337871+sjvans@users.noreply.github.com> Co-authored-by: Daniel Hutzel Co-authored-by: Mahati Shankar <93712176+smahati@users.noreply.github.com> Co-authored-by: René Jeglinsky --- node.js/_menu.md | 4 +- node.js/fiori.md | 188 ++++++++++++++++++++++++++++++----------------- 2 files changed, 122 insertions(+), 70 deletions(-) diff --git a/node.js/_menu.md b/node.js/_menu.md index effe4d2bca..f019e188a7 100644 --- a/node.js/_menu.md +++ b/node.js/_menu.md @@ -31,8 +31,6 @@ ## [Class cds. RemoteService](remote-services) ## [Class cds. MessagingService](messaging) ## [Class cds. DatabaseService](databases) - ## [Serving Fiori UIs](fiori) - ## [Integrate with UCL](../../node.js/ucl) # [cds. Events](events) @@ -57,9 +55,11 @@ # [cds. env](cds-env) # [cds. utils](cds-utils) +# [Serving Fiori UIs](fiori) # [Transactions](cds-tx) # [Security](authentication) # [Plugins](cds-plugins) # [Testing](cds-test) # [TypeScript](typescript) # [Best Practices](best-practices) +# [Integrate with UCL](ucl) diff --git a/node.js/fiori.md b/node.js/fiori.md index be75edf5ff..b644485465 100644 --- a/node.js/fiori.md +++ b/node.js/fiori.md @@ -19,52 +19,130 @@ See [Cookbook > Serving UIs > Draft Support](../advanced/fiori#draft-support) fo --> -## Lean Draft +## Draft Entities {#draft-support} -Lean draft is a new approach which makes it easier to differentiate between drafts and active instances in your code. This new architecture drastically reduces the complexity. +Draft-enabled entities have corresponding CSN entities for drafts: -### Handlers Registration {#draft-support} +```js +const { MyEntity } = srv.entities +MyEntity.drafts // points to model.definitions[MyEntity.drafts] +``` + +In event handlers, the `target` is resolved before the handler execution and points to either the active or draft entity: + +```js +srv.on('READ', MyEntity.drafts, (req, next) => { + assert.equal(req.target.name, MyEntity.drafts) + return next() +}) +``` -Class `ApplicationService` provides built-in support for Fiori Draft. All CRUD events are supported for both, active and draft entities. -Please note that draft-enabled entities must follow a specific draft choreography. +In the special case of the Fiori Elements filter "Editing Status: All", two separate `READ` events are triggered for either the active or draft entity. +The individual results are then combined behind the scenes. -The examples are provided for `.on` handlers, but the same is true for `.before` and `.after` handlers. +Manual filtering on draft-related properties is not allowed, only certain draft scenarios are supported. - ```js - // only active entities - srv.on(['CREATE', 'READ', 'UPDATE', 'DELETE'], 'MyEntity', /*...*/) - // only draft entities - srv.on(['CREATE', 'READ', 'UPDATE', 'DELETE'], 'MyEntity.drafts', /*...*/) - // bound action/function on active entity - srv.on('boundActionOrFunction', 'MyEntity', /*...*/) - // bound action/function on draft entity - srv.on('boundActionOrFunction', 'MyEntity.drafts', /*...*/) - ``` -It's also possible to use the array variant to register a handler for both entities, for example: `srv.on('boundActionOrFunction', ['MyEntity', 'MyEntity.drafts'], /*...*/)`. -:::warning Bound actions/functions modifying active entity instances -If a bound action/function modifies an active entity instance, custom handlers need to take care that a draft entity doesn't exist, otherwise all changes are overridden when saving the draft. -::: +## Draft-specific Events + +In addition to the standard CRUD events, draft entities provide draft-specific events in the lifecycle of a draft, as outlined in the following subsections. + + +### `NEW` + +```js +srv.before('NEW', MyEntity.drafts, req => { + req.data.ID = uuid() +}) +srv.after('NEW', MyEntity.drafts, /*...*/) +srv.on('NEW', MyEntity.drafts, /*...*/) +``` + +The `NEW` event is triggered when the user created a new draft. +As a result `MyEntity.drafts` is created in the database. +You can modify the initial draft data in a `before` handler. + + +### `EDIT` + +```js +srv.before('EDIT', MyEntity, /*...*/) +srv.after('EDIT', MyEntity, /*...*/) +srv.on('EDIT', MyEntity, /*...*/) +``` + +The `EDIT` event is triggered when the user starts editing an active entity. +As a result, a new entry to `MyEntity.drafts` is created. + +For logical reasons handlers for the `EDIT` event are registered on the active entity, i.e. `MyEntity` in the code above, not on the `MyEntity.drafts` entity. + +You can also register handlers on the standard `CREATE` events for draft entities, which would be called whenever a new draft is created, be it via `NEW` or `EDIT`, like so: + +```js +srv.before('CREATE', MyEntity.drafts, /*...*/) +srv.after('CREATE', MyEntity.drafts, /*...*/) +srv.on('CREATE', MyEntity.drafts, /*...*/) +``` + + +### `DISCARD` + +```js +srv.before('DISCARD', MyEntity.drafts, /*...*/) +srv.on('DISCARD', MyEntity.drafts, /*...*/) +``` + +The `DISCARD` event is triggered when the user discards a draft started before. +In this case, the draft entity is deleted and the active entity isn't changed. -Additionally, you can add your logic to the draft-specific events as follows: +`CANCEL`, as a synonym for `DISCARD`, works as well. - ```js - // When a new draft is created - srv.on('NEW', 'MyEntity.drafts', /*...*/) - // When a draft is discarded - srv.on('CANCEL', 'MyEntity.drafts', /*...*/) - // When a new draft is created from an active instance - srv.on('EDIT', 'MyEntity', /*...*/) - // When the active entity is changed - srv.on('SAVE', 'MyEntity', /*...*/) - ``` -- The `CANCEL` event is triggered when you cancel the draft. In this case, the draft entity is deleted and the active entity isn't changed. -- The `EDIT` event is triggered when you start editing an active entity. As a result `MyEntity.drafts` is created. -- The `SAVE` event is just a shortcut for `['UPDATE', 'CREATE']` on an active entity. This event is also triggered when you press the `SAVE` button in UI after finishing editing your draft. Note, that composition children of the active entity will also be updated or created. +### `PATCH` -### Draft Locks +```js +srv.before('PATCH', MyEntity.drafts, /*...*/) +srv.after('PATCH', MyEntity.drafts, /*...*/) +srv.on('PATCH', MyEntity.drafts, /*...*/) +``` + +The `PATCH` event is triggered whenever the user edits a field in a draft. +It's actually an alias for the standard CRUD `UPDATE` event. + + +### `SAVE` + +```js +srv.before('SAVE', MyEntity.drafts, /*...*/) +srv.after('SAVE', MyEntity.drafts, /*...*/) +srv.on('SAVE', MyEntity.drafts, /*...*/) +``` + +The `SAVE` event is triggered when the user saves / activates a draft. This results in either a CREATE or an UPDATE on the active entity depending on whether the draft was created via `NEW` or `EDIT`. + +> [!note] +> The `SAVE` event is also available for non-draft, i.e. active entities. In that case it acts as an convenience shortcut for registering handlers for the combination of `CREATE` and `UPDATE` events. In contrast to that, the `SAVE` event on draft entities is a distinct event that is only triggered when **activating** a draft. + + +### Custom Actions + +Custom bound actions and functions defined for draft-enabled entities are also inherited by the draft entities. +This allows you to implement different logic depending on whether the action/function is called on the active or draft entity, like so: + +```js +srv.on('someAction', MyEntity, /*...*/) +srv.on('someAction', MyEntity.drafts, /*...*/) +``` + +If you want the same handler logic for both, do that: + +```js +srv.on('someAction', [ MyEntity, MyEntity.drafts ], /*...*/) +``` + + +## Draft Locks To prevent inconsistency, the entities with draft are locked for modifications by other users. The lock is released when the draft is saved, canceled or a timeout is hit. The default timeout is 15 minutes. You can configure this timeout by the following application configuration property: @@ -73,7 +151,7 @@ cds.fiori.draft_lock_timeout=30min ``` You can set the property to one of the following: -- number of hours like `'1h'` +- number of hours like `'1h'` - number of minutes like `'10min'` - number of milliseconds like `1000` @@ -81,7 +159,8 @@ You can set the property to one of the following: If the `draft_lock_timeout` has been reached, every user can delete other users' drafts to create an own draft. There can't be two drafts at the same time on the same entity. ::: -### Garbage Collection of Stale Drafts + +## Draft Timeouts Inactive drafts are deleted automatically after the default timeout of 30 days. You can configure or deactivate this timeout by the following configuration: @@ -97,7 +176,7 @@ Inactive drafts are deleted automatically after the default timeout of 30 days. You can set the property to one of the following: - `false` in order to deactivate the timeout -- number of days like `'30d'` +- number of days like `'30d'` - number of hours like `'72h'` - number of milliseconds like `1000` @@ -105,7 +184,8 @@ You can set the property to one of the following: It can occur that inactive drafts are still in the database after the configured timeout. The deletion is implemented as a side effect of creating new drafts and there's no periodic job that does the garbage collection. ::: -### Bypassing the SAP Fiori Draft Flow + +## Bypassing Drafts Creating or modifying active instances directly is possible without creating drafts. This comes in handy when technical services without a UI interact with each other. To enable this feature, set this feature flag in your configuration: @@ -149,36 +229,8 @@ Note that this feature creates additional entry points to your application. Cust payloads rather than the complete business object. ::: -### Differences to Previous Version - -- Draft-enabled entities have corresponding CSN entities for drafts: - - ```js - const { MyEntity } = srv.entities - MyEntity.drafts // points to model.definitions['MyEntity.drafts'] - ``` - -- Queries are now cleansed from draft-related properties (like `IsActiveEntity`) -- `PATCH` event isn't supported anymore. -- The target is resolved before the handler execution and points to either the active or draft entity: - - ```js - srv.on('READ', 'MyEntity.drafts', (req, next) => { - assert.equal(req.target.name, 'MyEntity.drafts') - return next() - }) - ``` - - ::: info Special case: "Editing Status: All" - In the special case of the Fiori Elements filter "Editing Status: All", two separate `READ` events are triggered for either the active or draft entity. - The individual results are then combined behind the scenes. - ::: - -- Draft-related properties (with the exception of `IsActiveEntity`) are only computed for the target entity, not for expanded sub entities since this is not required by Fiori Elements. -- Manual filtering on draft-related properties is not allowed, only certain draft scenarios are supported. - -### Programmatic Invocation of Draft Actions +## Programmatic APIs You can programmatically invoke draft actions with the following APIs: From 0f29425af12167198b4abf598f5f38f1086eb005 Mon Sep 17 00:00:00 2001 From: Steffen Waldmann Date: Thu, 2 Oct 2025 17:20:31 +0200 Subject: [PATCH 25/43] Prepare `cds add app-front` (#2095) Using the new `app-front` as the suggested way to deploy single-tenant UI apps, instead of the former solution relying on the predecessor HTML5 repo (transitively via WorkZone). --- guides/deployment/to-cf.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/guides/deployment/to-cf.md b/guides/deployment/to-cf.md index bff80285d4..9c4f408fbc 100644 --- a/guides/deployment/to-cf.md +++ b/guides/deployment/to-cf.md @@ -194,22 +194,20 @@ Two deployment options are available: #### Option A: SAP Cloud Portal -If you intend to deploy user interface applications, you also need to set up the [HTML5 Application Repository](https://discovery-center.cloud.sap/serviceCatalog/html5-application-repository-service) in combination with the [SAP Cloud Portal service](https://discovery-center.cloud.sap/serviceCatalog/cloud-portal-service): +If you intend to deploy **multi-tenant** user interface applications, you also need to set up the [HTML5 Application Repository](https://discovery-center.cloud.sap/serviceCatalog/html5-application-repository-service) in combination with the [SAP Cloud Portal service](https://discovery-center.cloud.sap/serviceCatalog/cloud-portal-service): ```sh cds add portal ``` -#### Option B: SAP Build Work Zone, Standard Edition +#### Option B: SAP BTP Application Frontend -For **single-tenant applications**, you can use [SAP Build Work Zone, Standard Edition](https://discovery-center.cloud.sap/serviceCatalog/sap-build-work-zone-standard-edition): +For **single-tenant** applications, you can use the new [SAP BTP Application Frontend](https://help.sap.com/docs/application-frontend-service) service: ```sh -cds add workzone +cds add app-front ``` -**Important:** This also requires you to set up SAP Build Work Zone, Standard Edition [according to the SAP Learning tutorial](https://developers.sap.com/tutorials/spa-configure-workzone.html). - ### 6. Optional: Multitenancy { #add-multitenancy } To enable multitenancy for production, run the following command: From fb39edabc3cc3b9eb3dc8b192518b3686f163427 Mon Sep 17 00:00:00 2001 From: Steffen Waldmann Date: Fri, 3 Oct 2025 20:26:27 +0200 Subject: [PATCH 26/43] Fill in LICENSE copyright owner (#2126) --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index 261eeb9e9f..8627616a5c 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2019-2025 SAP SE Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. From d15b55acfd069cd4f56bd5660ea2036b6a7296b0 Mon Sep 17 00:00:00 2001 From: Johannes Vogel <31311694+johannes-vogel@users.noreply.github.com> Date: Mon, 6 Oct 2025 12:21:16 +0200 Subject: [PATCH 27/43] [cds^9.4] feat(node.js): translated error messages (#2087) delivered with cds 9.4 Co-authored-by: sjvans <30337871+sjvans@users.noreply.github.com> --- node.js/cds-i18n.md | 10 +++++----- node.js/events.md | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/node.js/cds-i18n.md b/node.js/cds-i18n.md index 2df1c38d17..6c32988efe 100644 --- a/node.js/cds-i18n.md +++ b/node.js/cds-i18n.md @@ -674,11 +674,11 @@ Ensure you correctly understand how the config option `cds.i18n.folders` work be These are the current i18n entries for [`cds.i18n.messages`](#messages) used by the CAP runtime, which you can provide own translations for in your app-specific `_i18n/messages_.properties` files: ```properties -MULTIPLE_ERRORS = Multiple errors occurred. Please see the details for more information. -ASSERT_FORMAT = Value "{0}" is not in specified format "{1}" -ASSERT_RANGE = Value {0} is not in specified range [{1}, {2}] -ASSERT_ENUM = Value {0} is invalid according to enum declaration {{1}} -ASSERT_NOT_NULL = Value is required +MULTIPLE_ERRORS = Multiple errors occurred, see details below. +ASSERT_FORMAT = Enter a value matching the pattern {1}. +ASSERT_RANGE = Enter a value between {1} and {2}. +ASSERT_ENUM = Enter one of the allowed values: {1}. +ASSERT_MANDATORY = Provide the missing value. ``` In addition the following HTTP status codes can be translated: diff --git a/node.js/events.md b/node.js/events.md index 1207671052..8fdb54101b 100644 --- a/node.js/events.md +++ b/node.js/events.md @@ -612,3 +612,21 @@ Content-Type: application/json > In production, error responses should never disclose internal information that could be exploited by attackers. To ensure that, all errors with a `5xx` status code are returned to the client with only the respective generic message (example: `500 Internal Server Error`). > > In very rare cases, you might want to return 5xx errors with a meaningful message to the client. This can be achieved with `err.$sanitize = false`. Use that option with care! + + +## Translations for Validation Errors + +For the following annotations/error codes, the runtime provides default translations: + +| Annotation | Error Code | +|-------------------------|---------------------------------| +| `@mandatory` | ASSERT_MANDATORY(1) | +| `@assert.range` | ASSERT_RANGE | +| `@assert.range` on enum | ASSERT_ENUM | +| `@assert.format` | ASSERT_FORMAT | +| `@assert.target` | ASSERT_TARGET | + +(1) Falls back to error code `ASSERT_NOT_NULL` if provided in custom translations. + +These can be overridden by the known technique of providing [custom i18n messages](cds-i18n#localized-messages). + From bbf62d07a1ea702c72e8ba47543abe6467907759 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 17:15:04 +0200 Subject: [PATCH 28/43] chore(deps): update cap java sdk to v4.3.2 (#2128) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > [!NOTE] > Mend has cancelled [the proposed renaming](https://redirect.github.com/renovatebot/renovate/discussions/37842) of the Renovate GitHub app being renamed to `mend[bot]`. > > This notice will be removed on 2025-10-07.
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [com.sap.cds:cds-services-api](https://cap.cloud.sap/docs/java) | `4.3.1` -> `4.3.2` | [![age](https://developer.mend.io/api/mc/badges/age/maven/com.sap.cds:cds-services-api/4.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.sap.cds:cds-services-api/4.3.1/4.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [com.sap.cds:cds4j-api](http://www.sap.com) ([source](https://cap.cloud.sap/docs/java/)) | `4.3.0` -> `4.3.2` | [![age](https://developer.mend.io/api/mc/badges/age/maven/com.sap.cds:cds4j-api/4.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.sap.cds:cds4j-api/4.3.0/4.3.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/capire/docs). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .vitepress/config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.vitepress/config.js b/.vitepress/config.js index 70caf1db55..31fd790e6b 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -106,8 +106,8 @@ config.rewrites = rewrites // Add custom capire info to the theme config config.themeConfig.capire = { versions: { - java_services: '4.3.1', - java_cds4j: '4.3.0' + java_services: '4.3.2', + java_cds4j: '4.3.2' }, gotoLinks: [] } From 27c2a3126d1e1fedcaa9cd6f94212c078851d618 Mon Sep 17 00:00:00 2001 From: sjvans <30337871+sjvans@users.noreply.github.com> Date: Tue, 7 Oct 2025 09:43:34 +0200 Subject: [PATCH 29/43] AEM plugins are GA (#2129) --- plugins/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/index.md b/plugins/index.md index 887cadbb6d..d5eb5a76c9 100644 --- a/plugins/index.md +++ b/plugins/index.md @@ -392,7 +392,7 @@ Available for: [![Java logo](../assets/logos/java.svg){style="height:3em; display:inline; margin:0 0.2em;"}](https://github.com/cap-java/cds-feature-event-hub#readme) -## SAP Integration Suite, Advanced Event Mesh {#advanced-event-mesh} +## SAP Integration Suite, Advanced Event Mesh {#advanced-event-mesh} [SAP Integration Suite, advanced event mesh](https://www.sap.com/products/technology-platform/integration-suite/advanced-event-mesh.html) allows you to, amongst others, integrate non-SAP systems into your event-driven architecture. From 8b977db7c2476fa402c1139d7cc9cf1d338867b6 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 12:55:06 +0200 Subject: [PATCH 30/43] chore(deps): update eslint (#2127) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > [!NOTE] > Mend has cancelled [the proposed renaming](https://redirect.github.com/renovatebot/renovate/discussions/37842) of the Renovate GitHub app being renamed to `mend[bot]`. > > This notice will be removed on 2025-10-07.
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.45.0` -> `8.46.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.45.0/8.46.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/8.46.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/8.45.0/8.46.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [eslint](https://eslint.org) ([source](https://redirect.github.com/eslint/eslint)) | [`9.36.0` -> `9.37.0`](https://renovatebot.com/diffs/npm/eslint/9.36.0/9.37.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/eslint/9.37.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint/9.36.0/9.37.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes
typescript-eslint/typescript-eslint (@​typescript-eslint/parser) ### [`v8.46.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8460-2025-10-06) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.45.0...v8.46.0) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website.
eslint/eslint (eslint) ### [`v9.37.0`](https://redirect.github.com/eslint/eslint/compare/v9.36.0...d5d1bdf5fdfad75197aadd3e894182135158c3b1) [Compare Source](https://redirect.github.com/eslint/eslint/compare/v9.36.0...v9.37.0)
--- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://redirect.github.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/capire/docs). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package-lock.json | 111 ++++++++++++++++++++++++---------------------- 1 file changed, 57 insertions(+), 54 deletions(-) diff --git a/package-lock.json b/package-lock.json index 674af15dbd..6d4615ca1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1486,19 +1486,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", - "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz", + "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1557,9 +1560,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", - "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz", + "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==", "dev": true, "license": "MIT", "peer": true, @@ -1581,13 +1584,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.16.0", "levn": "^0.4.1" }, "engines": { @@ -2879,17 +2882,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/parser": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.45.0.tgz", - "integrity": "sha512-TGf22kon8KW+DeKaUmOibKWktRY8b2NSAZNdtWh798COm1NWx8+xJ6iFBtk3IvLdv6+LGLJLRlyhrhEDZWargQ==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz", + "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/typescript-estree": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/scope-manager": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/typescript-estree": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4" }, "engines": { @@ -2905,14 +2908,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.45.0.tgz", - "integrity": "sha512-3pcVHwMG/iA8afdGLMuTibGR7pDsn9RjDev6CCB+naRsSYs2pns5QbinF4Xqw6YC/Sj3lMrm/Im0eMfaa61WUg==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz", + "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.45.0", - "@typescript-eslint/types": "^8.45.0", + "@typescript-eslint/tsconfig-utils": "^8.46.0", + "@typescript-eslint/types": "^8.46.0", "debug": "^4.3.4" }, "engines": { @@ -2927,14 +2930,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.45.0.tgz", - "integrity": "sha512-clmm8XSNj/1dGvJeO6VGH7EUSeA0FMs+5au/u3lrA3KfG8iJ4u8ym9/j2tTEoacAffdW1TVUzXO30W1JTJS7dA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz", + "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0" + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2945,9 +2948,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.45.0.tgz", - "integrity": "sha512-aFdr+c37sc+jqNMGhH+ajxPXwjv9UtFZk79k8pLoJ6p4y0snmYpPA52GuWHgt2ZF4gRRW6odsEj41uZLojDt5w==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz", + "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==", "dev": true, "license": "MIT", "engines": { @@ -2962,9 +2965,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.45.0.tgz", - "integrity": "sha512-WugXLuOIq67BMgQInIxxnsSyRLFxdkJEJu8r4ngLR56q/4Q5LrbfkFRH27vMTjxEK8Pyz7QfzuZe/G15qQnVRA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz", + "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==", "dev": true, "license": "MIT", "engines": { @@ -2976,16 +2979,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.45.0.tgz", - "integrity": "sha512-GfE1NfVbLam6XQ0LcERKwdTTPlLvHvXXhOeUGC1OXi4eQBoyy1iVsW+uzJ/J9jtCz6/7GCQ9MtrQ0fml/jWCnA==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz", + "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.45.0", - "@typescript-eslint/tsconfig-utils": "8.45.0", - "@typescript-eslint/types": "8.45.0", - "@typescript-eslint/visitor-keys": "8.45.0", + "@typescript-eslint/project-service": "8.46.0", + "@typescript-eslint/tsconfig-utils": "8.46.0", + "@typescript-eslint/types": "8.46.0", + "@typescript-eslint/visitor-keys": "8.46.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3005,13 +3008,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.45.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.45.0.tgz", - "integrity": "sha512-qsaFBA3e09MIDAGFUrTk+dzqtfv1XPVz8t8d1f0ybTzrCY7BKiMC5cjrl1O/P7UmHsNyW90EYSkU/ZWpmXelag==", + "version": "8.46.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz", + "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.45.0", + "@typescript-eslint/types": "8.46.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -4396,9 +4399,9 @@ } }, "node_modules/eslint": { - "version": "9.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", - "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "version": "9.37.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz", + "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==", "dev": true, "license": "MIT", "peer": true, @@ -4406,11 +4409,11 @@ "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.1", - "@eslint/core": "^0.15.2", + "@eslint/config-helpers": "^0.4.0", + "@eslint/core": "^0.16.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.36.0", - "@eslint/plugin-kit": "^0.3.5", + "@eslint/js": "9.37.0", + "@eslint/plugin-kit": "^0.4.0", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", From cebcdc05e89278663a106ff6f68cfa3975d1d006 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 13:36:17 +0200 Subject: [PATCH 31/43] chore(deps): update cap java sdk to v4.4.0 (#2133) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit > [!NOTE] > Mend has cancelled [the proposed renaming](https://redirect.github.com/renovatebot/renovate/discussions/37842) of the Renovate GitHub app being renamed to `mend[bot]`. > > This notice will be removed on 2025-10-07.
This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [com.sap.cds:cds-services-api](https://cap.cloud.sap/docs/java) | `4.3.2` -> `4.4.0` | [![age](https://developer.mend.io/api/mc/badges/age/maven/com.sap.cds:cds-services-api/4.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.sap.cds:cds-services-api/4.3.2/4.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [com.sap.cds:cds4j-api](http://www.sap.com) ([source](https://cap.cloud.sap/docs/java/)) | `4.3.2` -> `4.4.0` | [![age](https://developer.mend.io/api/mc/badges/age/maven/com.sap.cds:cds4j-api/4.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.sap.cds:cds4j-api/4.3.2/4.4.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about these updates again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/capire/docs). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .vitepress/config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.vitepress/config.js b/.vitepress/config.js index 31fd790e6b..082dff225c 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -106,8 +106,8 @@ config.rewrites = rewrites // Add custom capire info to the theme config config.themeConfig.capire = { versions: { - java_services: '4.3.2', - java_cds4j: '4.3.2' + java_services: '4.4.0', + java_cds4j: '4.4.0' }, gotoLinks: [] } From f15a844e09563580f500081114b64ffecb9f2914 Mon Sep 17 00:00:00 2001 From: Dietrich Mostowoj <34100436+dimamost@users.noreply.github.com> Date: Tue, 7 Oct 2025 14:06:38 +0200 Subject: [PATCH 32/43] Introduce outbox shared db workaround docs (#2108) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: BraunMatthias <59841349+BraunMatthias@users.noreply.github.com> Co-authored-by: René Jeglinsky --- java/outbox.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/java/outbox.md b/java/outbox.md index 80b8139a4e..0bd0d0c2a8 100644 --- a/java/outbox.md +++ b/java/outbox.md @@ -163,6 +163,73 @@ To be sure that the deployment version has been set correctly, you can find a lo And finally, if for some reason you don't want to use a version check for a particular outbox collector, you can switch it off via the outbox configuration [cds.outbox.services.MyCustomOutbox.checkVersion: false](../java/developing-applications/properties#cds-outbox-services--checkVersion). +### Outbox for Shared Databases + +Currently, CAP Java does not yet support microservices with shared database out of the box, as this can lead to unexpected behavior when different isolated services use the same outboxes. +Since CAP automatically creates two outboxes with a static name — **DefaultOutboxOrdered** and **DefaultOutboxUnordered** — these would be shared across all services which introduces conflicts. + +To avoid this, you can apply a manual workaround as follows: + + 1. Customize the outbox configuration and isolating them via distinct namespaces for each service. + 2. Adapt the Audit Log outbox configuration. + 3. Adapt the messaging outbox configuration per service. + + These steps are described in the following sections. + +#### Deactivate Default Outboxes + +First, deactivate the two default outboxes and create custom outboxes with configurations tailored to your needs. + +```yaml +cds: + outbox: + services: + # deactivate default outboxes + DefaultOutboxUnordered.enabled: false + DefaultOutboxOrdered.enabled: false + # custom outboxes with unique names + Service1CustomOutboxOrdered: + maxAttempts: 10 + storeLastError: true + ordered: true + Service1CustomOutboxUnordered: + maxAttempts: 10 + storeLastError: true + ordered: false + +``` + +#### Adapt Audit Log Configuration + +The **DefaultOutboxUnordered** outbox is automatically used for audit logging. Therefore, you must update the audit log configuration to point to the custom one. + +```yaml +cds: + ... + auditlog: + outbox.name: Service1CustomOutboxUnordered +``` + +#### Adapt Messaging Configuration + +Next, adapt the messaging configuration of **every** messaging service in the application so that they use the custom-defined outboxes. + +```yaml +cds: + messaging: + services: + MessagingService1: + outbox.name: Service1CustomOutboxOrdered + MessagingService2: + outbox.name: Service1CustomOutboxOrdered +``` + + +::: tip Important Note +It is crucial to **deactivate** the default outboxes, and ensure **unique outbox namespaces** in order to achieve proper isolation between services in a shared DB scenario. +::: + + ## Outboxing CAP Service Events Outbox services support outboxing of arbitrary CAP services. A typical use case is to outbox remote OData From b58526d4fa8522540ac09317ee1662349ab8b9e7 Mon Sep 17 00:00:00 2001 From: Evgeny Andreev Date: Tue, 7 Oct 2025 15:10:40 +0200 Subject: [PATCH 33/43] Describe usage of `concat` (#2131) --- java/working-with-cql/query-api.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/java/working-with-cql/query-api.md b/java/working-with-cql/query-api.md index a4a1a410ed..2d8dcc5f4c 100644 --- a/java/working-with-cql/query-api.md +++ b/java/working-with-cql/query-api.md @@ -1409,6 +1409,10 @@ Scalar functions are values that are calculated from other values. This calculat .where(e -> e.get("name").substring(2).eq("ter")); ``` +* Concat + + See [`Concat`](#string-expressions) String Expression + #### Case-When-Then Expressions Use a case expression to compute a value based on the evaluation of conditions. The following query converts the stock of Books into a textual representation as 'stockLevel': @@ -1420,6 +1424,17 @@ Select.from(BOOKS).columns( .when(b.stock().gt(100)).then("high") .orElse("medium").as("stockLevel").type(CdsBaseType.STRING)); ``` +#### String Expressions + +* Concat + + Function `concat` creates a string expression to concatenate a specified value to this value. + + ```java + // SELECT from Author {name || ' - the Author' as author_name : String} + Select.from(AUTHOR) + .columns(a -> a.name().concat(" - the Author").as("author_name")); + ``` #### Arithmetic Expressions From 79e317505234e320f473c610ed4c634e6305d9c7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:21:47 +0200 Subject: [PATCH 34/43] chore: Update CLI texts (#2136) Updates the output of cds CLI texts to the latest version. Co-authored-by: chgeo <7470719+chgeo@users.noreply.github.com> --- tools/assets/help/cds-version-md.out.md | 2 +- tools/assets/help/cds-version.out.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/assets/help/cds-version-md.out.md b/tools/assets/help/cds-version-md.out.md index d34da248da..7e55547b30 100644 --- a/tools/assets/help/cds-version-md.out.md +++ b/tools/assets/help/cds-version-md.out.md @@ -14,5 +14,5 @@ | @cap-js/db-service | 2.5.1 | | @cap-js/openapi | 1.2.3 | | @cap-js/sqlite | 2.0.3 | -| Node.js | v22.19.0 | +| Node.js | v22.20.0 | diff --git a/tools/assets/help/cds-version.out.md b/tools/assets/help/cds-version.out.md index 41d2f5b66b..4672eb584b 100644 --- a/tools/assets/help/cds-version.out.md +++ b/tools/assets/help/cds-version.out.md @@ -12,5 +12,5 @@ @cap-js/db-service: 2.5.1 @cap-js/openapi: 1.2.3 @cap-js/sqlite: 2.0.3 -Node.js: v22.19.0 +Node.js: v22.20.0 From 1e54329ba4fe86dcccad1b2ef237a0df571ebdce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:22:25 +0200 Subject: [PATCH 35/43] chore: Update Java Properties (#2135) Updates Java properties to the latest version. Co-authored-by: chgeo <7470719+chgeo@users.noreply.github.com> --- java/developing-applications/properties.json | 27 +++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/java/developing-applications/properties.json b/java/developing-applications/properties.json index e799703212..b9966611ab 100644 --- a/java/developing-applications/properties.json +++ b/java/developing-applications/properties.json @@ -168,7 +168,7 @@ "header": false, "name": "cds.model.provider.cache.expirationTime", "type": "int", - "default": "600", + "default": "3600", "doc": "The lifetime of an entry in seconds after the entry's creation, the most recent
replacement of its value, or its last access." }, { @@ -959,6 +959,24 @@ "default": "PT30S", "doc": "The oauth token retrieval timeout (as Duration)." }, + { + "header": true, + "name": "cds.multiTenancy.hanaMtService", + "doc": "Properties for the Hana multi tenant service" + }, + { + "header": false, + "name": "cds.multiTenancy.hanaMtService.tokenRetrievalTimeout", + "type": "Duration", + "default": "PT30S", + "doc": "The oauth token retrieval timeout (as Duration)." + }, + { + "header": false, + "name": "cds.multiTenancy.hanaMtService.hanaTenantPrefix", + "type": "String", + "doc": "Optional prefix for HANA tenant id calculation as hash from _id>" + }, { "header": true, "name": "cds.multiTenancy.security", @@ -1455,6 +1473,13 @@ "default": "joint", "doc": "Determines the persistence mode for draft-enabled entities. In case of `joint` persistence
queries with JOINs between databases tables/views of active instances and databases tables of
draft instances can occur. If set to `split` such queries are avoided. Possible values are:
`joint`, `split`." }, + { + "header": false, + "name": "cds.drafts.enforceReadonly", + "type": "boolean", + "default": "false", + "doc": "Determines, if @readonly, @Core.Computed and similar annotations are enforced on draft
instances already and therefore no longer during activation." + }, { "header": true, "name": "cds.drafts.gc", From dd25b6cc0ea0f2f4b04b4c30a680c12bbcb27626 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 8 Oct 2025 22:39:22 +0200 Subject: [PATCH 36/43] chore(deps): update dependency com.sap.cds:cds4j-api to v4.4.1 (#2140) --- .vitepress/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vitepress/config.js b/.vitepress/config.js index 082dff225c..a9e776b9fd 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -107,7 +107,7 @@ config.rewrites = rewrites config.themeConfig.capire = { versions: { java_services: '4.4.0', - java_cds4j: '4.4.0' + java_cds4j: '4.4.1' }, gotoLinks: [] } From 82936eaac1b5cbcb253ba49458d59e7d8e64abfc Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Thu, 9 Oct 2025 09:10:29 +0200 Subject: [PATCH 37/43] fix profile (#2134) ~~This somehow found it's way in... the build does not work with `with-mtx-sidecar`, the correct profile here is `mtx-sidecar` as also described in the node section.~~ Updating the sidecar package.json to what is currently generated (incl java profile). --- guides/multitenancy/index.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/guides/multitenancy/index.md b/guides/multitenancy/index.md index a937b9d0e9..9363531382 100644 --- a/guides/multitenancy/index.md +++ b/guides/multitenancy/index.md @@ -175,12 +175,18 @@ cds add multitenancy "devDependencies": { "@cap-js/sqlite": "^2" }, + "engines": { + "node": ">=20" + }, "scripts": { "start": "cds-serve", "build": "cds build ../.. --for mtx-sidecar --production && npm ci --prefix gen" }, "cds": { - "profile": "mtx-sidecar" + "profiles": [ + "mtx-sidecar", + "java" + ] } } ``` From 8fdb41903989847057e7a00131d8c6f32bee2b6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Jeglinsky?= Date: Thu, 9 Oct 2025 09:37:30 +0200 Subject: [PATCH 38/43] DB HANA: update reference by removing version from link (#2137) Thanks Erich! --- guides/databases-hana.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/databases-hana.md b/guides/databases-hana.md index a0089e768f..9fc25a5443 100644 --- a/guides/databases-hana.md +++ b/guides/databases-hana.md @@ -202,7 +202,7 @@ cds deploy --to hana Behind the scenes, `cds deploy` does the following: * Compiles the CDS model to SAP HANA files (usually in _gen/db_, or _db/src/gen_) -* Generates _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata?)_ files for the [CSV files](databases#providing-initial-data) in the project. If a _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata?)_ file is already present next to the CSV files, no new file is generated. +* Generates _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata)_ files for the [CSV files](databases#providing-initial-data) in the project. If a _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata)_ file is already present next to the CSV files, no new file is generated. * Creates a Cloud Foundry service of type `hdi-shared`, which creates an HDI container. Also, you can explicitly specify the name like so: `cds deploy --to hana:`. * Starts `@sap/hdi-deploy` locally. If you need a tunnel to access the database, you can specify its address with `--tunnel-address `. * Stores the binding information with profile `hybrid` in the _.cdsrc-private.json_ file of your project. You can use a different profile with parameter `--for`. With this information, `cds watch`/`run` can fetch the SAP HANA credentials at runtime, so that the server can connect to it. @@ -652,7 +652,7 @@ Only use CSV files for _configuration data_ that can't be changed by application ::: -Yet, if you need to support initial data with user changes, you can use the `include_filter` option that _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata?version=2024_1_QRC)_ offers. +Yet, if you need to support initial data with user changes, you can use the `include_filter` option that _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata)_ offers. From 13611180a6c79f76dfff7ae2dfe0d83a75305b7b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 9 Oct 2025 10:28:19 +0200 Subject: [PATCH 39/43] chore(deps): update dependency @sap/cds to v9.4.2 (#2139) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | Age | Confidence | |---|---|---|---| | [@sap/cds](https://cap.cloud.sap/) | [`9.3.1` -> `9.4.2`](https://renovatebot.com/diffs/npm/@sap%2fcds/9.3.1/9.4.2) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@sap%2fcds/9.4.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@sap%2fcds/9.3.1/9.4.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR was generated by [Mend Renovate](https://mend.io/renovate/). View the [repository job log](https://developer.mend.io/github/capire/docs). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Steffen Waldmann --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6d4615ca1b..b77653585b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2398,9 +2398,9 @@ ] }, "node_modules/@sap/cds": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-9.3.1.tgz", - "integrity": "sha512-xA9EN29X8HKaz83Aod1e3Bs6LRvqcCVoaTvCtyOup5rMYDQumcoZ7UOKH6NIUTeO0zOtafUiMHucMG+dBnq5XQ==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-9.4.2.tgz", + "integrity": "sha512-+MtNRviAgyZnPkSkT9sZ52rKRrNcTSpjIL88HfPtS5VzWX17Niu9PRANba/dd8aF4lxSQEEqb85zqJkga6MwKA==", "dev": true, "license": "SEE LICENSE IN LICENSE", "peer": true, From f489bc50287cbc172578a78de995e75dac43ca28 Mon Sep 17 00:00:00 2001 From: Matthias Schur <107557548+MattSchur@users.noreply.github.com> Date: Thu, 9 Oct 2025 10:51:11 +0200 Subject: [PATCH 40/43] Java: Aggregation API (#2125) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Adrian Görler --- java/working-with-cql/query-api.md | 80 ++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 3 deletions(-) diff --git a/java/working-with-cql/query-api.md b/java/working-with-cql/query-api.md index 2d8dcc5f4c..b783766985 100644 --- a/java/working-with-cql/query-api.md +++ b/java/working-with-cql/query-api.md @@ -621,7 +621,22 @@ Select.from("bookshop.Books") b.get("title").startsWith("Wuth"))); ``` -### Grouping + +### Aggregating Data { #aggregating } + +You can aggregate data in two ways: + +- **Aggregate the current entity:** Use [aggregate functions](#aggregation-functions) like `sum` in the columns clause of your `Select` statement, usually together with [groupBy](#group-by), to summarize or group data. + +- **Aggregate associated entities:** Use dedicated aggregation methods to calculate values over to-many associations directly in your queries. See [Aggregating over Associations](#aggregating-associations). + + +#### Aggregation Functions { #aggregation-functions } + +Use [aggregation functions](/guides/databases#aggregate-functions) to calculate minimums, maximums, totals, averages, and counts of values. You can use them in *columns* of `Select` statements to include the aggregated values in the result set, or in the [having](#having) clause to filter based on aggregated values. + + +#### Grouping { #grouping } The Query Builder API offers a way to group the results into summarized rows (in most cases these are aggregate functions) and apply certain criteria on it. @@ -635,7 +650,7 @@ Let's assume the following dataset for our examples: |103 |Hugo | |104 |Smith | -#### Group By +##### Group By { #group-by } The `groupBy` clause groups by one or more elements and usually involves aggregate [functions](query-api#scalar-functions), such as `count`, `countDistinct`, `sum`, `max`, `avg`, and so on. It returns one row for each group. @@ -658,7 +673,7 @@ If we execute the query on our dataset, we get the following result: |Hugo |1 | -#### Having +##### Having { #having } To filter the [grouped](#group-by) result, `having` is used. Both, `having` and `where`, filter the result before `group by` is applied and can be used in the same query. @@ -678,6 +693,65 @@ If we execute the query on our dataset, we get the following result: |Smith |3 | +#### Aggregating over Associations { #aggregating-associations } + +Use the aggregation methods `min`, `max`, `sum`, and `count` to calculate minimums, maximums, totals, and counts of values of associated entities directly in your CQL queries. You can use these aggregation methods in *columns* to include the aggregated values in the result set, or in the *where* clause to filter the result set based on aggregated values. + +::: tip +Use [infix filters](/cds/cql#with-infix-filters) to aggregate only a subset of a (to-many) association. +::: + +##### min + +Find the minimum value of an element in a collection. + +```java +Select.from(ORDERS).columns( + o -> o.id(), + o -> o.items() + .filter(i -> i.amount().gt(0)) // optional filter + .min(i -> i.amount()).as("minAmount") +); +``` + +This query selects each order’s id and the minimum item amount greater than 0 as "minAmount". + +##### max + +Find the maximum value of an element in a collection. + +```java +Select.from(ORDERS) + .where(o -> o.items().max(i -> i.amount()).gt(100)); +``` + +This query selects all orders where the maximum item amount is greater than 100. + +##### sum + +Calculate the total of a numeric element across related entities. + +```java +Select.from(ORDERS).columns( + o -> o.id(), + o -> o.items().sum(i -> i.amount().times(i.price())).as("orderTotal") +); +``` + +This query selects each order's id and the total order amount (sum of amount times price) as "orderTotal". + +##### count + +Count non-null values of an element in a collection. + +```java +Select.from(ORDERS) + .where(o -> o.items().count(i -> i.discount()).gt(0)); +``` + +This query selects all orders where at least one item has a discount. + + ### Ordering and Pagination The Query Builder API allows to specify the sort order of query results. The _sort specification_ governs, according to which elements the result is sorted, and which sort order (ascending or descending) is applied. From 6570dca6ae3e477044627bac337d1d13775d683c Mon Sep 17 00:00:00 2001 From: sjvans <30337871+sjvans@users.noreply.github.com> Date: Thu, 9 Oct 2025 10:53:30 +0200 Subject: [PATCH 41/43] fix: add missing `srv.after('DISCARD', MyEntity.drafts, /*...*/)` (#2130) @danjoa @johannes-vogel or is there a reason not to list it? --- node.js/fiori.md | 1 + 1 file changed, 1 insertion(+) diff --git a/node.js/fiori.md b/node.js/fiori.md index b644485465..249b783d52 100644 --- a/node.js/fiori.md +++ b/node.js/fiori.md @@ -90,6 +90,7 @@ srv.on('CREATE', MyEntity.drafts, /*...*/) ```js srv.before('DISCARD', MyEntity.drafts, /*...*/) +srv.after('DISCARD', MyEntity.drafts, /*...*/) srv.on('DISCARD', MyEntity.drafts, /*...*/) ``` From 4b76c68e66f088fcbc672fe73109130eddda9ca8 Mon Sep 17 00:00:00 2001 From: Steffen Waldmann Date: Thu, 9 Oct 2025 10:55:46 +0200 Subject: [PATCH 42/43] Troubleshooting entry for missing index page and "Cannot GET /" (#2132) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Christian Georgi Co-authored-by: Mahati Shankar <93712176+smahati@users.noreply.github.com> Co-authored-by: Christian Georgi Co-authored-by: René Jeglinsky --- get-started/troubleshooting.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/get-started/troubleshooting.md b/get-started/troubleshooting.md index 5d0ce4e616..e3de313b8b 100644 --- a/get-started/troubleshooting.md +++ b/get-started/troubleshooting.md @@ -626,8 +626,7 @@ Now you can build the archive with: mbt build -t gen --mtar mta.tar -e less.mtaext ``` -::: warning -This approach is only recommended +::: warning Not recommended for production deployments - For test deployments during _development_. For _production_ deployments, self-contained archives are preferrable. - If all your dependencies are available in _public_ registries like npmjs.org or Maven Central. Dependencies from _corporate_ registries are not resolvable in this mode. ::: @@ -768,7 +767,16 @@ If you receive an error response `404 Not Found: Requested route ('') doe ::: +### Why do I get a _404 Cannot GET /_ error? +For security reasons, the **index page is not served in production** by default in both [Node.js](../node.js/cds-server#toggle-generic-index-page) and [Java](../java/developing-applications/configuring#production-profile). + +If you try to access your backend URL, you will therefore see a _404 Cannot GET /_ error. +This also means you **cannot use the `/` path as a health status indicator**. See the [Health Checks guide](../guides/deployment/health-checks) for the correct paths. + +Only if absolutely required and you understand the security implications to your application, you can enable this page in your deployment. + +Learn more about the generic index page in [Java](../java/developing-applications/properties#cds-indexPage) and in [Node.js](../node.js/cds-server#toggle-generic-index-page).{.learn-more} ## CAP on Kyma From 3972baa963821decd27c33da47f31bd96be7077b Mon Sep 17 00:00:00 2001 From: Markus Ofterdinger Date: Thu, 9 Oct 2025 10:57:53 +0200 Subject: [PATCH 43/43] cds-services-archetype: JDK 25 support (#2118) Co-authored-by: Mahati Shankar <93712176+smahati@users.noreply.github.com> --- java/developing-applications/building.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/developing-applications/building.md b/java/developing-applications/building.md index 4fe2d173ac..7199d28a6e 100644 --- a/java/developing-applications/building.md +++ b/java/developing-applications/building.md @@ -335,10 +335,10 @@ It supports the following command-line options: | `-Dpackage=` | The Java package for your project's classes. Defaults to `${groupId}.${artifactId}`. | | `-DincludeModel=true` | Adds a minimalistic sample CDS model to the project. | | `-DincludeIntegrationTest=true` | Adds an integration test module to the project. | -| `-DodataVersion=[v2\|v4]` | Specify which protocol adapter is activated by default. | +| `-DodataVersion=[v2\|v4]` | Specify which protocol adapter is activated by default. Defaults to `v4`| | `-DtargetPlatform=cloudfoundry` | Adds CloudFoundry target platform support to the project. | | `-DinMemoryDatabase=[h2\|sqlite]` | Specify which in-memory database is used for local testing. If not specified, the default value is `h2`. | -| `-DjdkVersion=[17\|21]` | Specifies the target JDK version. If not specified, the default value is `21`. | +| `-DjdkVersion=[17\|21\|25]` | Specifies the target JDK version. Defaults to `21`. | | `-Dpersistence=[true\|false]` | Specify whether persistence is enabled (`true`) or disabled (`false`). Defaults to `true`. | | `-DcdsdkVersion=` | Sets the provided cds-dk version in the project. If not specified, the default of CAP Java is used. |