From 30d2a1efd5860d4fae445d909d28dae86542ed70 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Tue, 28 Apr 2026 13:13:59 +0200 Subject: [PATCH 001/156] Fix default for `validateStatus` --- node.js/cds-test.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node.js/cds-test.md b/node.js/cds-test.md index c668b4a3b3..eadf66cd2f 100644 --- a/node.js/cds-test.md +++ b/node.js/cds-test.md @@ -235,7 +235,7 @@ To stay portable across different HTTP clients, it's recommended to only use the - `baseURL` as defined in [Axios](https://axios-http.com/docs/req_config#baseurl) - `auth` as defined in [Axios](https://axios-http.com/docs/req_config) - `headers` as defined in [Fetch API](https://developer.mozilla.org/en-US/docs/Web/API/Request/headers) and [Axios](https://axios-http.com/docs/req_config#headers) -- `validateStatus` as defined in [Axios](https://axios-http.com/docs/handling_errors) (default: `status < 200 && status >= 300`) +- `validateStatus` as defined in [Axios](https://axios-http.com/docs/handling_errors) (default: `status >= 200 && status < 300`) In addition, you can use all of the config options understood by the underlying HTTP client, that is, for Fetch API, its [RequestInit](https://developer.mozilla.org/en-US/docs/Web/API/Request/Request) options, and for Axios, its [request config options](https://axios-http.com/docs/req_config) options. From 97e4a18a51452034983d16fe4b9f61b41f7462d8 Mon Sep 17 00:00:00 2001 From: Samyuktha Prabhu <33195453+samyuktaprabhu@users.noreply.github.com> Date: Tue, 28 Apr 2026 14:23:58 +0200 Subject: [PATCH 002/156] Update SQLite Decimal precision limitation (#2524) Document that Decimal values on SQLite are stored as IEEE 754 double-precision floats, enabling arithmetic but with potential precision loss. --------- Co-authored-by: Mahati Shankar <93712176+smahati@users.noreply.github.com> --- java/cqn-services/persistence-services.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java/cqn-services/persistence-services.md b/java/cqn-services/persistence-services.md index b456b004db..cc060a5de7 100644 --- a/java/cqn-services/persistence-services.md +++ b/java/cqn-services/persistence-services.md @@ -80,6 +80,7 @@ CAP does support most of the major features on SQLite, although there are a few 6. Views in SQLite are read-only. However, the CAP Java SDK supports some views to be updatable as described in [Updatable Views](../working-with-cql/query-execution#updatable-views). 7. Foreign key constraints are supported, but are disabled by default. To activate the feature using JDBC URL, append the `foreign_keys=on` parameter to the connection URL, for example, `url=jdbc:sqlite:file:testDb?mode=memory&foreign_keys=on`. For more information, visit the [SQLite Foreign Key Support](https://sqlite.org/foreignkeys.html) in the official documentation. 8. CAP enables regular expressions on SQLite via a Java implementation. The matching behaviour is an equivalent of the `Matcher.find()` call for the given pattern. +9. `Decimal` values are stored as IEEE 754 double-precision floating-point numbers on SQLite which allows arithmetic operations to be performed directly in the database. Note, when values can't be represented exactly in this binary floating-point format, they lose some precision. ## Datasources From 95c64791adb6e00b8a02c365bca1216c9615c613 Mon Sep 17 00:00:00 2001 From: Evgeny Andreev Date: Tue, 28 Apr 2026 14:28:54 +0200 Subject: [PATCH 003/156] CAP Java 5.x Migration Guide: removed repackaged `Olingo` (#2528) Co-authored-by: BraunMatthias <59841349+BraunMatthias@users.noreply.github.com> Co-authored-by: Mahati Shankar <93712176+smahati@users.noreply.github.com> --- java/migration.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/java/migration.md b/java/migration.md index 62d42c9a12..8d7cf5f611 100644 --- a/java/migration.md +++ b/java/migration.md @@ -138,6 +138,17 @@ None 3. Changed default value of properties: None +### Removed repackaged Olingo Dependencies { #removed-olingo-4-to-5 } + +The internally used maven modules `repackaged/odata-v4-lib` and `repackaged/odata-v2-lib` are removed from the delivery. If the project directly references these modules and doesn't compile after migrating to CAP Java 5.x, there are 3 options to keep the compatibility of the code base: + +1. [**Recommended**] Remove `mvn` dependencies to `repackaged/odata-v4-lib`, `repackaged/odata-v2-lib`, and rewrite code using CAP Java native APIs. + +2. Use `maven-dependency-plugin` to unpack (extract contents of dependency) Olingo sources into your code base during the project build. + +3. Use upstream open-source Apache Olingo. Change dependencies from corresponding internal CAP `mvn` modules to OSS packages `org.apache.olingo:olingo-odata4`, `org.apache.olingo:olingo-odata2` + + ## CAP Java 3.10 to CAP Java 4.0 { #three-to-four } ### New License From 50ea6c38f5edc142c6de9045af684a1ef2f64a64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20G=C3=B6rler?= Date: Wed, 29 Apr 2026 00:24:37 +0200 Subject: [PATCH 004/156] Java protocols (#2523) Co-authored-by: Mahati Shankar <93712176+smahati@users.noreply.github.com> --- java/cqn-services/application-services.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/java/cqn-services/application-services.md b/java/cqn-services/application-services.md index 3d1062874b..6ba19fc37c 100644 --- a/java/cqn-services/application-services.md +++ b/java/cqn-services/application-services.md @@ -379,7 +379,7 @@ cds: With the annotation `@path`, you can configure the relative path of a service under which it's served by protocol adapters. The path is appended to the protocol adapter's base path. -With the annotations `@protocol` or `@protocols`, you can configure a list of protocol adapters a service should be served by. By default, a service is served by all installed protocol adapters. If you explicitly define a protocol, the service is only served by that protocol adapter. +With the annotations `@protocol` or `@protocols`, you can configure a list of protocol adapters a service should be served by. By default, a service is served by the protocols `odata-v4` and [odata-v2](../../java/migration#v2adapter). If you explicitly specify a protocol, the service is only served by that protocol adapter. In the following example, the service `CatalogService` is available on the combined paths `/odata/v4/browse` with OData V4 and `/odata/v2/browse` with OData V2: @@ -401,22 +401,33 @@ cds.application.services.CatalogService.serve: - 'odata-v2' ``` -Alternatively to the `@protocol` and `@protocols` annotation you can also use explicit protocol annotations like `@odata` (OData V4): +Alternatively to the `@protocol` and `@protocols` annotation you can also use explicit protocol annotations. For example, `@odata` (OData V4), `@odata-v4`, `@odata-v2`, and `@mcp`: ```cds -@odata service CatalogService { ... } +@odata +service CatalogService { ... } +``` + +You can also specify the path directly in the protocol annotation: + +```cds +@mcp: 'catalog' +service CatalogService { ... } ``` You can also disable serving a service if needed: ```cds -@path : 'browse' @protocol: 'none' service InternalService { ... } ``` +:::tip +Use the property cds.protocols.defaults: [] to prevent that a protocol is served accidentally. +::: + [Learn more about all `cds.application.services..serve` configuration possibilities.](../developing-applications/properties#cds-application-services--serve){.learn-more} From e25bd3dfdd65ab26160e09e4c4a6659618494e9b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 08:30:09 +0200 Subject: [PATCH 005/156] chore: Update Java Properties (#2543) Updates Java properties to the latest version. Co-authored-by: chgeo <7470719+chgeo@users.noreply.github.com> --- java/developing-applications/properties.json | 72 +++++++++++++++++--- 1 file changed, 61 insertions(+), 11 deletions(-) diff --git a/java/developing-applications/properties.json b/java/developing-applications/properties.json index 023b4143c3..e73fd301e0 100644 --- a/java/developing-applications/properties.json +++ b/java/developing-applications/properties.json @@ -502,6 +502,18 @@ "default": "true", "doc": "Determines, if it is enabled." }, + { + "header": true, + "name": "cds.protocols", + "doc": "Properties for all protocols." + }, + { + "header": false, + "name": "cds.protocols.defaults", + "type": "List", + "default": "odata-v2, odata-v4, odata-x4", + "doc": "The default protocols each ApplicationService serves, if protocols are not explicitly
configured otherwise. The default protocols are \"odata-v2\", \"odata-v4\" and \"odata-x4\". If the
defaults are overwritten with an empty list, all ApplicationServices are served by all
available protocol adapters." + }, { "header": true, "name": "cds.odataV4", @@ -689,10 +701,10 @@ }, { "header": false, - "name": "cds.mcp.queryPerEntityTool", + "name": "cds.mcp.callPerActionTool", "type": "boolean", "default": "false", - "doc": "True, if the MCP server should offer a query tool per entity, instead of one generic query
tool." + "doc": "True, if the MCP server should offer a call tool per action/function, instead of one generic
call_action tool." }, { "header": false, @@ -701,6 +713,13 @@ "default": "true", "doc": "True, if the MCP server should use TOON format for tool output, otherwise JSON." }, + { + "header": false, + "name": "cds.mcp.maxInputChars", + "type": "int", + "default": "2000", + "doc": "Maximum allowed size of MCP tool input arguments in characters." + }, { "header": true, "name": "cds.mcp.endpoint", @@ -722,38 +741,38 @@ }, { "header": true, - "name": "cds.mcp.autoConfig", - "doc": "Properties for auto-configuration of local MCP clients." + "name": "cds.mcp.autoWired", + "doc": "Properties for auto-wiring of local MCP clients." }, { "header": false, - "name": "cds.mcp.autoConfig.host", + "name": "cds.mcp.autoWired.host", "type": "String", "default": "localhost", "doc": "The MCP server host." }, { "header": false, - "name": "cds.mcp.autoConfig.port", + "name": "cds.mcp.autoWired.port", "type": "Integer", "doc": "The MCP server port." }, { "header": false, - "name": "cds.mcp.autoConfig.user", + "name": "cds.mcp.autoWired.user", "type": "String", "default": "privileged", "doc": "The mock-user to use." }, { "header": false, - "name": "cds.mcp.autoConfig.password", + "name": "cds.mcp.autoWired.password", "type": "String", "doc": "The mock-user's password." }, { "header": false, - "name": "cds.mcp.autoConfig.enabled", + "name": "cds.mcp.autoWired.enabled", "type": "boolean", "default": "false", "doc": "Determines, if it is enabled." @@ -1125,6 +1144,13 @@ "default": "PT10S", "doc": "The time a health check result is cached and no further health checks are performed." }, + { + "header": false, + "name": "cds.multiTenancy.healthCheck.timeout", + "type": "Duration", + "default": "PT1S", + "doc": "The timeout for health check requests to the MTX sidecar." + }, { "header": false, "name": "cds.multiTenancy.healthCheck.enabled", @@ -1560,8 +1586,7 @@ "header": false, "name": "cds.drafts.postActive", "type": "boolean", - "default": "false", - "doc": "When enabled, a plain POST request on a draft-enabled entity without an explicit
IsActiveEntity value creates an active entity instead of a draft. The draft-enabled entity
must also have a draft new action defined." + "doc": "When enabled, a plain POST request on a draft-enabled entity without an explicit
IsActiveEntity value creates an active entity instead of a draft. The draft-enabled entity
must also have a draft new action defined. If not set, defaults to {@code true} when the
entity has a draft-new action and to {@code false} otherwise." }, { "header": true, @@ -1952,6 +1977,31 @@ "default": "false", "doc": "Determines, if it is enabled." }, + { + "header": true, + "name": "cds.outbox.persistent.scheduler.hotTenantTask", + "doc": "Properties to configure hot tenant management to avoid all tenants iterations." + }, + { + "header": false, + "name": "cds.outbox.persistent.scheduler.hotTenantTask.sharedOutbox", + "type": "String", + "doc": "The name of the outbox to be used for hot tenants events." + }, + { + "header": false, + "name": "cds.outbox.persistent.scheduler.hotTenantTask.maxTaskDelay", + "type": "Duration", + "default": "PT2H", + "doc": "The time to wait after tenant event to check the tenant outbox." + }, + { + "header": false, + "name": "cds.outbox.persistent.scheduler.hotTenantTask.enabled", + "type": "boolean", + "default": "false", + "doc": "Determines, if it is enabled." + }, { "header": true, "name": "cds.outbox.services", From 429e5518a57aa50ea71e1b2df5bac4b75de5108e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 08:31:08 +0200 Subject: [PATCH 006/156] chore: Update CLI texts (#2544) 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-add.out.md | 18 ++++++++++++++++++ tools/assets/help/cds-init.out.md | 2 ++ tools/assets/help/cds-version-md.out.md | 10 +++++----- tools/assets/help/cds-version.out.md | 10 +++++----- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/tools/assets/help/cds-add.out.md b/tools/assets/help/cds-add.out.md index f8e9561851..078f062199 100644 --- a/tools/assets/help/cds-add.out.md +++ b/tools/assets/help/cds-add.out.md @@ -10,6 +10,8 @@ Pick any of these: completion - shell completion for cds commands + java - creates a Java-based project + nodejs - creates a Node.js-based project esm - ESM-compatible Node.js project typer - type generation for CDS models typescript - minimum configuration for a bare TypeScript project @@ -54,6 +56,8 @@ notifications - SAP BTP Notification Service workzone-standard - SAP BTP Work Zone, Standard Edition ui5 - SAP UI5 integration + vue - user interface for Vue.js + react - user interface for React data - add CSV headers for modeled entities http - add .http files for modeled services lint - configure cds lint @@ -189,9 +193,16 @@ cds add kyma + --y + Skip interactive prompts. + cds add react + + --into | -i + + Name of the app folder in 'app/'. Example: 'catalog' → 'app/catalog'. cds add test @@ -207,6 +218,13 @@ Custom output directory. For Node.js, the default is 'test'. + cds add vue + + --into | -i + + Name of the app folder in 'app/'. Example: 'catalog' → 'app/catalog'. + + cds add xsuaa --plan diff --git a/tools/assets/help/cds-init.out.md b/tools/assets/help/cds-init.out.md index 7ced747e8e..660e5beef3 100644 --- a/tools/assets/help/cds-init.out.md +++ b/tools/assets/help/cds-init.out.md @@ -61,6 +61,8 @@ notifications - SAP BTP Notification Service workzone-standard - SAP BTP Work Zone, Standard Edition ui5 - SAP UI5 integration + vue - user interface for Vue.js + react - user interface for React data - add CSV headers for modeled entities http - add .http files for modeled services lint - configure cds lint diff --git a/tools/assets/help/cds-version-md.out.md b/tools/assets/help/cds-version-md.out.md index a05a05862d..35b531e839 100644 --- a/tools/assets/help/cds-version-md.out.md +++ b/tools/assets/help/cds-version-md.out.md @@ -4,12 +4,12 @@ | Package | Version | Location | | -------------------- | ------- | ------------------------------------------------------------------ | - | @sap/cds-dk (global) | 9.8.4 | .../node_modules/@sap/cds-dk | - | @sap/cds | 9.8.5 | .../node_modules/@sap/cds | - | @sap/cds-compiler | 6.8.0 | .../node_modules/@sap/cds-compiler | + | @sap/cds-dk (global) | 9.9.0 | .../node_modules/@sap/cds-dk | + | @sap/cds | 9.9.1 | .../node_modules/@sap/cds | + | @sap/cds-compiler | 6.9.0 | .../node_modules/@sap/cds-compiler | | @sap/cds-fiori | 2.3.0 | .../node_modules/@sap/cds-fiori | - | @cap-js/db-service | 2.9.0 | .../node_modules/@cap-js/db-service | - | @cap-js/sqlite | 2.2.0 | .../node_modules/@cap-js/sqlite | + | @cap-js/db-service | 2.10.0 | .../node_modules/@cap-js/db-service | + | @cap-js/sqlite | 2.2.1 | .../node_modules/@cap-js/sqlite | | cds.home | | .../node_modules/@sap/cds | | cds.root | | .../your-project | | npm root -l | | .../node_modules | diff --git a/tools/assets/help/cds-version.out.md b/tools/assets/help/cds-version.out.md index 6e34f5b5dd..66060c0082 100644 --- a/tools/assets/help/cds-version.out.md +++ b/tools/assets/help/cds-version.out.md @@ -2,12 +2,12 @@
 > cds version
 
-  @sap/cds-dk (global)  9.8.4    .../node_modules/@sap/cds-dk 
-  @sap/cds              9.8.5    .../node_modules/@sap/cds                                            
-  @sap/cds-compiler     6.8.0    .../node_modules/@sap/cds-compiler                                   
+  @sap/cds-dk (global)  9.9.0    .../node_modules/@sap/cds-dk 
+  @sap/cds              9.9.1    .../node_modules/@sap/cds                                            
+  @sap/cds-compiler     6.9.0    .../node_modules/@sap/cds-compiler                                   
   @sap/cds-fiori        2.3.0    .../node_modules/@sap/cds-fiori                                      
-  @cap-js/db-service    2.9.0    .../node_modules/@cap-js/db-service                                  
-  @cap-js/sqlite        2.2.0    .../node_modules/@cap-js/sqlite                                      
+  @cap-js/db-service    2.10.0   .../node_modules/@cap-js/db-service                                  
+  @cap-js/sqlite        2.2.1    .../node_modules/@cap-js/sqlite                                      
   cds.home                       .../node_modules/@sap/cds                                            
   cds.root                       .../your-project                                                  
   npm root -l                    .../node_modules                                                     

From 477c4b86b8ec008d4a9ad4e6afcfb359510ea9e9 Mon Sep 17 00:00:00 2001
From: Patrice Bender 
Date: Wed, 29 Apr 2026 09:00:13 +0200
Subject: [PATCH 007/156] docs: re-add paragraph about `ON DELETE CASCADE`
 (#2513)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

this is an important distinction. Users open issues because they dont
understand the feature scope, e.g. cap/issues/issues/20464

---------

Co-authored-by: Steffen Weinstock <79531202+stewsk@users.noreply.github.com>
Co-authored-by: René Jeglinsky 
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Mahati Shankar <93712176+smahati@users.noreply.github.com>
---
 guides/databases/cdl-to-ddl.md | 35 +++++++++++++++++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)

diff --git a/guides/databases/cdl-to-ddl.md b/guides/databases/cdl-to-ddl.md
index b48ef4f7a2..2c3f186e12 100644
--- a/guides/databases/cdl-to-ddl.md
+++ b/guides/databases/cdl-to-ddl.md
@@ -611,7 +611,40 @@ CREATE TABLE Books ( ...
 :::
 
 > [!tip] Consider using @assert.target instead
-> Database constraints are meant to protect against data corruption due to programming errors. Prefer using the [`@assert.target`](../services/constraints#assert-target) for application-level input validation, which is more tuned for typical application scenarios, with error messages taylored for end users.
+> Database constraints are meant to protect against data corruption due to programming errors. Prefer using the [`@assert.target`](../services/constraints#assert-target) for application-level input validation, which is more tuned for typical application scenarios, with error messages tailored for end users.
+
+#### `ON DELETE CASCADE`
+
+Think of the example above: a book can still exist, even if its author is deleted. However, this differs for existential relationships like the one between a book and its pages: a page cannot exist without a corresponding book. In such cases, you want the pages to be automatically deleted when the book (parent) is deleted.
+
+Typically such existential relationships are modeled in CDS using [compositions](../../cds/cdl#compositions).
+That is why for managed **backlink** associations (those used in a composition's on-condition via `$self = .`), the foreign key constraints are generated with `ON DELETE CASCADE` by default, instead of `ON DELETE RESTRICT`:
+
+::: code-group
+```cds [CDS Source]
+entity Books {
+  key ID : Integer;
+  pages: Composition of many Pages on pages.book = $self;
+}
+entity Pages {
+  key number: Integer;
+  key book: Association to Books; // → ON DELETE CASCADE
+}
+```
+:::
+
+::: code-group
+```sql [=>  Generated DDL]
+…
+ALTER TABLE Pages ADD CONSTRAINT c__Pages_book
+  FOREIGN KEY(book_ID) REFERENCES Books(ID)
+  ON UPDATE RESTRICT
+  ON DELETE CASCADE
+  VALIDATED
+  ENFORCED
+  INITIALLY DEFERRED;
+```
+:::
 
 #### Skipping with `@assert.integrity:false`
 

From 12e72691d833046154015d20d5ebfdccc4430ffc Mon Sep 17 00:00:00 2001
From: Johannes Vogt 
Date: Wed, 29 Apr 2026 11:24:10 +0200
Subject: [PATCH 008/156] leaf elements can not be looped (#2389)

---
 cds/assets/cxl/ref.drawio.svg | 109 +++++++++++++++++-----------------
 1 file changed, 55 insertions(+), 54 deletions(-)

diff --git a/cds/assets/cxl/ref.drawio.svg b/cds/assets/cxl/ref.drawio.svg
index be2c7c82bd..235c64f74a 100644
--- a/cds/assets/cxl/ref.drawio.svg
+++ b/cds/assets/cxl/ref.drawio.svg
@@ -1,27 +1,27 @@
-
+
     
     
         
-            
-            
+            
+            
         
         
             
-                
+                
             
             
                 
                     
                         
-                            
+
-
+
leaf element
- + leaf element @@ -29,33 +29,33 @@ - - + + - + - - + + - + -
+
-
+
struct
- + struct @@ -63,26 +63,26 @@
- - + + - + -
+
-
+
association
- + association @@ -90,29 +90,29 @@
- + - - + + - + -
+
-
+
infix filter
- + infix filter @@ -120,51 +120,44 @@
- - + + - - + + - + - - + - + + - - + + - - + - + + - - - - - - - - + -
+
-
+
. @@ -172,12 +165,20 @@
- + . + + + + + + + + @@ -187,4 +188,4 @@ - + \ No newline at end of file From 46e560a0cf59b384ef3985ee1aba977399e92e80 Mon Sep 17 00:00:00 2001 From: Rene Jeglinsky Date: Wed, 29 Apr 2026 19:36:15 +0200 Subject: [PATCH 009/156] remove ai review action --- .github/workflows/ai-review.yml | 37 --------------------------------- 1 file changed, 37 deletions(-) delete mode 100644 .github/workflows/ai-review.yml diff --git a/.github/workflows/ai-review.yml b/.github/workflows/ai-review.yml deleted file mode 100644 index 934c649d84..0000000000 --- a/.github/workflows/ai-review.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: AI Review - -on: - pull_request: - branches: [main] - merge_group: - -concurrency: - group: pr-sap-${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -jobs: - ai-review: - name: AI Review - if: ${{ contains(github.event.pull_request.labels.*.name, 'AI Review') }} - runs-on: ubuntu-latest - permissions: - contents: read - pull-requests: write - steps: - - uses: SAP/ai-assisted-github-actions/pr-review@v3 - with: - aicore-service-key: ${{ secrets.AICORE_SERVICE_KEY }} - model: anthropic--claude-4-sonnet - model-parameters: '{"temperature": 0.1}' - prompt: | - - As an AI bot reviewing documentation pull requests on GitHub, please focus on the following areas to ensure high-quality and effective documentation: - - Use U.S. English spelling and punctuation. - - Check for spelling errors and provide corrections. - - Identify and correct grammatical errors and incorrect punctuation. - - Provide suggestions for improving the clarity and conciseness of the text to make it more understandable. Use the comments to create real suggestions and include all proposals that target the same line into one suggestions. Do not create multiple suggestions for the same line or paragraph. - - Consider the guidelines that can be found in .github/workflows/assets/editor.md and apply them. - - Ensure that the tone is appropriate for technical documentation, maintaining a professional and informative style. - - Verify that the structure of the document is logical and that headings and subheadings are used effectively. - - Check for consistency in terminology and style throughout the document. - - Use active voice instead of passive voice - - Use present tense and **avoid future tense**! \ No newline at end of file From 80b6016c0a25ba5417f12eb8fbbbc40be09e4640 Mon Sep 17 00:00:00 2001 From: Markus Ofterdinger Date: Sat, 2 May 2026 08:28:42 +0200 Subject: [PATCH 010/156] cds-services-archetype: Changed default JDK version to 25 (#2548) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BLI: https://github.wdf.sap.corp/cds-java/home/issues/2645 --------- Co-authored-by: René Jeglinsky --- java/migration.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/java/migration.md b/java/migration.md index 8d7cf5f611..56064f85ec 100644 --- a/java/migration.md +++ b/java/migration.md @@ -138,6 +138,14 @@ None 3. Changed default value of properties: None +### Changes in the `cds-services-archetype` + +The `cds-services-archetype` is used by the `@sap/cds-dk` to generate initial CAP Java projects. + +#### Default JDK Version + +The default JDK version of new CAP Java projects has been changed to JDK **25**. The minimum required JDK version hasn't changed and is still 17. + ### Removed repackaged Olingo Dependencies { #removed-olingo-4-to-5 } The internally used maven modules `repackaged/odata-v4-lib` and `repackaged/odata-v2-lib` are removed from the delivery. If the project directly references these modules and doesn't compile after migrating to CAP Java 5.x, there are 3 options to keep the compatibility of the code base: From 378abaf7e348072ad27122ed5edb53b5390e3455 Mon Sep 17 00:00:00 2001 From: Matthias Schur <107557548+MattSchur@users.noreply.github.com> Date: Mon, 4 May 2026 08:23:11 +0200 Subject: [PATCH 011/156] Vector embeddings: Use `OrchestrationEmbeddingRequest` (#2547) Update AI SDK example to use new `Orchestration` API: https://sap.github.io/ai-sdk/docs/java/orchestration/embedding#embedding --- guides/databases/vector-embeddings.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/guides/databases/vector-embeddings.md b/guides/databases/vector-embeddings.md index cb4ebe69fa..99f2822ed1 100644 --- a/guides/databases/vector-embeddings.md +++ b/guides/databases/vector-embeddings.md @@ -60,10 +60,14 @@ Alternatively, you can compute vector embeddings in your application layer using :::details Example using SAP Cloud SDK for AI ```Java -var aiClient = OpenAiClient.forModel(OpenAiModel.TEXT_EMBEDDING_3_SMALL); -var response = aiClient.embedding( - new OpenAiEmbeddingRequest(List.of(book.getDescription()))); -book.setEmbedding(CdsVector.of(response.getEmbeddingVectors().get(0))); +String question = "Are there patterns with overheating solar inverters?"; +var request = OrchestrationEmbeddingRequest + .forModel(TEXT_EMBEDDING_3_SMALL) + .forInputs(question).asQuery(); +OrchestrationEmbeddingResponse response = client.embed(request); +float[] embedding = response.getEmbeddingVectors().get(0); + +CdsVector vector = CdsVector.of(embedding); ``` ::: From ad8b40b7923e0e7184fad18fc6990ba11934b05b Mon Sep 17 00:00:00 2001 From: sjvans <30337871+sjvans@users.noreply.github.com> Date: Mon, 4 May 2026 11:09:40 +0200 Subject: [PATCH 012/156] req.subject ignores query options (#2003) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: René Jeglinsky --- node.js/events.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/node.js/events.md b/node.js/events.md index cd36f9de62..eb0f9fb618 100644 --- a/node.js/events.md +++ b/node.js/events.md @@ -348,7 +348,10 @@ For bound custom operations, `req.query` contains the query to the entity on whi ### . subject {.property} Acts as a pointer to the instances targeted by the request. -For example for the equivalents of inbound requests addressing _single rows_ like these: +The _target_ of a request is equivalent to the [`source` of a query](../cds/cqn#from). +That is, additional query options, such as CQL's `.where()` or OData's `$filter`, are not considered. + +For example, for the equivalents of inbound requests, addressing _single rows_ like these: ```js AdminService.read(Books,201) @@ -376,8 +379,16 @@ DELETE.from(req.subject) //> deletes the single target row > [!warning] > You can use `req.subject` in custom handlers for inbound `READ`, `UPDATE` and `DELETE` requests, as well as in _bound_ actions, addressing **_single rows_**. -> **You can't use it** reasonably in custom handlers for `INSERT` requests or other requests addressing **_multiple row_**. +> **You can't use it** reasonably in custom handlers for `INSERT` requests or other requests addressing **_multiple rows_**. + +The following example further illustrates the difference between request target and additional query options: +```js +// GET Books/201 +req.subject = { ref: [{ id: 'AdminService.Books', where: [{ ref: ['ID']}, '=', { val: 201 }] }] } +// GET Books?$filter=ID eq 201 +req.subject = { ref: [{ id: 'AdminService.Books' }] } +``` From e0859267b1a67c9e09ab178408e18525fba4351a Mon Sep 17 00:00:00 2001 From: ecklie <52252271+ecklie@users.noreply.github.com> Date: Tue, 5 May 2026 14:18:00 +0200 Subject: [PATCH 013/156] admin plan warning (#2551) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: René Jeglinsky --- guides/multitenancy/index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/guides/multitenancy/index.md b/guides/multitenancy/index.md index 5d0bbb6c14..6994ab476c 100644 --- a/guides/multitenancy/index.md +++ b/guides/multitenancy/index.md @@ -832,6 +832,10 @@ If you start with a multitenant application that's configured to use to SAP HANA service: hana-cloud service-plan: hana-multitenancy ``` + +> [!danger] Only use the `hana-multitenancy` plan +> As the tenant containers are filtered by the SAP HANA Cloud service instance, applications will potentially access data of other applications when using a different plan. + For SAP HANA TMS v2, you also need to specify the database ID of the database that you plan to use for your tenant containers. You can specify this using the [`cds.xt.DeploymentService` configuration](/@external/guides/multitenancy/mtxs#deployment-config). To keep the application configuration agnostic, we recommend adding the cds/requires/cds.xt.DeploymentService/hdi/create/database_id configuration as an environment variable to the MTX service in _mta.yaml_: From 592d84e864e57d172d9b8c1f59903597a326ef50 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 14:46:49 +0200 Subject: [PATCH 014/156] Update dependency globals to v17.6.0 (#2549) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [globals](https://redirect.github.com/sindresorhus/globals) | [`17.5.0` → `17.6.0`](https://renovatebot.com/diffs/npm/globals/17.5.0/17.6.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/globals/17.6.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/globals/17.5.0/17.6.0?slim=true) | --- ### Release Notes
sindresorhus/globals (globals) ### [`v17.6.0`](https://redirect.github.com/sindresorhus/globals/compare/v17.5.0...6b15870f1c08b60b5b57afe45a703d9ed0be39bc) [Compare Source](https://redirect.github.com/sindresorhus/globals/compare/v17.5.0...v17.6.0)
--- ### Configuration 📅 **Schedule**: (UTC) - 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 fb05720f9c..877f0a1460 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5084,9 +5084,9 @@ } }, "node_modules/globals": { - "version": "17.5.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.5.0.tgz", - "integrity": "sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==", + "version": "17.6.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", + "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==", "dev": true, "license": "MIT", "engines": { From 9a0ef0025cc96399ba326eebed447a124c2eb201 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 14:47:18 +0200 Subject: [PATCH 015/156] Update dependency @typescript-eslint/parser to v8.59.2 (#2540) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.59.0` → `8.59.2`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.59.0/8.59.2) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/8.59.2?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/8.59.0/8.59.2?slim=true) | --- ### Release Notes
typescript-eslint/typescript-eslint (@​typescript-eslint/parser) ### [`v8.59.2`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8592-2026-05-04) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.1...v8.59.2) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.2) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.59.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8591-2026-04-27) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.0...v8.59.1) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.1) for more information. 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**: (UTC) - 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 877f0a1460..b44966f7a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3037,16 +3037,16 @@ "license": "MIT" }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz", - "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.2.tgz", + "integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", + "@typescript-eslint/scope-manager": "8.59.2", + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/typescript-estree": "8.59.2", + "@typescript-eslint/visitor-keys": "8.59.2", "debug": "^4.4.3" }, "engines": { @@ -3062,14 +3062,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz", - "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.2.tgz", + "integrity": "sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.0", - "@typescript-eslint/types": "^8.59.0", + "@typescript-eslint/tsconfig-utils": "^8.59.2", + "@typescript-eslint/types": "^8.59.2", "debug": "^4.4.3" }, "engines": { @@ -3084,14 +3084,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz", - "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz", + "integrity": "sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0" + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/visitor-keys": "8.59.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3102,9 +3102,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz", - "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz", + "integrity": "sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==", "dev": true, "license": "MIT", "engines": { @@ -3119,9 +3119,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", - "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz", + "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==", "dev": true, "license": "MIT", "engines": { @@ -3133,16 +3133,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", - "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz", + "integrity": "sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.0", - "@typescript-eslint/tsconfig-utils": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", + "@typescript-eslint/project-service": "8.59.2", + "@typescript-eslint/tsconfig-utils": "8.59.2", + "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/visitor-keys": "8.59.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -3161,13 +3161,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", - "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", + "version": "8.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz", + "integrity": "sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/types": "8.59.2", "eslint-visitor-keys": "^5.0.0" }, "engines": { From 5d81a5b5085a7d4e1fd94bd283e16693e135b1a9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 5 May 2026 15:49:41 +0200 Subject: [PATCH 016/156] Update dependency vite-plugin-cds to ^0.3.0 (#2542) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [vite-plugin-cds](https://redirect.github.com/Akatuoro/vite-plugin-cds) | [`^0.2.0` → `^0.3.0`](https://renovatebot.com/diffs/npm/vite-plugin-cds/0.2.0/0.3.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vite-plugin-cds/0.3.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite-plugin-cds/0.2.0/0.3.0?slim=true) | --- ### Release Notes
Akatuoro/vite-plugin-cds (vite-plugin-cds) ### [`v0.3.0`](https://redirect.github.com/Akatuoro/vite-plugin-cds/releases/tag/v0.3.0) [Compare Source](https://redirect.github.com/Akatuoro/vite-plugin-cds/compare/v0.2.0...v0.3.0) vite8 support
--- ### Configuration 📅 **Schedule**: (UTC) - 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 Co-authored-by: Johannes Vogt --- package-lock.json | 709 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 365 insertions(+), 346 deletions(-) diff --git a/package-lock.json b/package-lock.json index b44966f7a5..0269417b89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,21 +31,21 @@ "monaco-editor": "^0.55.1", "sass": "^1.62.1", "vite": "^7", - "vite-plugin-cds": "^0.2.0", + "vite-plugin-cds": "^0.3.1", "vitepress": "^1" } }, "node_modules/@algolia/abtesting": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.16.2.tgz", - "integrity": "sha512-n9s6bEV6imdtIEd+BGP7WkA4pEZ5YTdgQ05JQhHwWawHg3hyjpNwC0TShGz6zWhv+jfLDGA/6FFNbySFS0P9cw==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.18.0.tgz", + "integrity": "sha512-8siuLG+FIns1AjZ/g2SDVwHz9S+ObacDQISEJvS8XsNei1zl3FXqfqQrBpmrG7ACWCyesXHbicMJtvRbg00FEw==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" @@ -101,41 +101,41 @@ } }, "node_modules/@algolia/client-abtesting": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.50.2.tgz", - "integrity": "sha512-52iq0vHy1sphgnwoZyx5PmbEt8hsh+m7jD123LmBs6qy4GK7LbYZIeKd+nSnSipN2zvKRZ2zScS6h9PW3J7SXg==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.52.0.tgz", + "integrity": "sha512-wtwPgyPmO7b7sQPVgoK29c1VpfS08DnnJCmxX/oU1pV2DlMRJCzQcLN7JSloYpodyKHwM8+9wOzlAM0co3TDmA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.50.2.tgz", - "integrity": "sha512-WpPIUg+cSG2aPUG0gS8Ko9DwRgbRPUZxJkolhL2aCsmSlcEEZT65dILrfg5ovcxtx0Kvr+xtBVsTMtsQWRtPDQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.52.0.tgz", + "integrity": "sha512-9KY36bRl4AH7RjqSeDDOKnjsz4IxQFBEOB8/fWmEbdQe+Isbs5jGzVJu9NEPQ1Tgwxlf8Uf07Swj3jZyMNUZ2g==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.50.2.tgz", - "integrity": "sha512-Gj2MgtArGcsr82kIqRlo6/dCAFjrs2gLByEqyRENuT7ugrSMFuqg1vDzeBjRL1t3EJEJCFtT0PLX3gB8A6Hq4Q==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.52.0.tgz", + "integrity": "sha512-3a/qM3dzJqqfTx7Yrw7uGQ98I3Q0rDfb4Vkv0wEzko96l7YQMxfBVz/VbLq2N+c59GweYv6Vhp8mPeqnWJSITw==", "dev": true, "license": "MIT", "engines": { @@ -143,151 +143,151 @@ } }, "node_modules/@algolia/client-insights": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.50.2.tgz", - "integrity": "sha512-CUqoid5jDpmrc0oK3/xuZXFt6kwT0P9Lw7/nsM14YTr6puvmi+OUKmURpmebQF22S2vCG8L1DAoXXujxQUi/ug==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.52.0.tgz", + "integrity": "sha512-Rki7ACbMcvbQW0BuM84x9dkGHY47ABmv4jU6tYssat2k02p3mIUms2YOLUAMeknhmnFsj6lb6ZzOXdMWMyc1sA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.50.2.tgz", - "integrity": "sha512-AndZWFoc0gbP5901OeQJ73BazgGgSGiBEba4ohdoJuZwHTO2Gio8Q4L1VLmytMBYcviVigB0iICToMvEJxI4ug==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.52.0.tgz", + "integrity": "sha512-96s4Uzc3kk+/f4jJXIVVGWP5XlngOGNQ1x6hW9AT59pOixHlOs5tqJg+ZUS/GQ6h/iYP0ceQcmxDQeLyCLTaDQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.50.2.tgz", - "integrity": "sha512-NWoL+psEkz5dIzweaByVXuEB45wS8/rk0E0AhMMnaVJdVs7TcACPH2/OURm+N0xRDITkTHqCna823rd6Uqntdg==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.52.0.tgz", + "integrity": "sha512-lqeycNpSPe5Qa0OUWpejVvYQjQWV5nQuLT0a4aq7XzRAvCxprV/6Lf841EygdD2nrFnuS58ok7Au1uOtXzpnkg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.50.2.tgz", - "integrity": "sha512-ypSboUJ3XJoQz5DeDo82hCnrRuwq3q9ZdFhVKAik9TnZh1DvLqoQsrbBjXg7C7zQOtV/Qbge/HmyoV6V5L7MhQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.52.0.tgz", + "integrity": "sha512-ly1wETVGRo30cx61O7fetESN+ElL9c9K+bD/AVgnT1ar4c6v+/Yqjrhdtu6Fm4D0s4NZP081Isf6tunH1wUXHg==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { - "version": "1.50.2", - "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.50.2.tgz", - "integrity": "sha512-VlR2FRXLw2bCB94SQo6zxg/Qi+547aOji6Pb+dKE7h1DMCCY317St+OpjpmgzE+bT2O9ALIc0V4nVIBOd7Gy+Q==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.52.0.tgz", + "integrity": "sha512-U4EeTvgmluRjj39ykZSAd5X+a6LD5m7/mcOWDmB7hqm1R6QY0yT8jLxpNVEjYhzgEN5hcDGW6X67EWQY8KiYGQ==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { - "version": "1.50.2", - "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.50.2.tgz", - "integrity": "sha512-Cmvfp2+qopzQt8OilU97rhLhosq7ZrB6uieok3EwFUqG/aalPg6DgfCmu0yJMrYe+KMC1qRVt1MTRAUwLknUMQ==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.52.0.tgz", + "integrity": "sha512-FCPnDcILfpTE94u7BVlV4DmnSV5wE3+j25EEF+3dYPrVzkVCSoAHs318oWDGxnxsAgiL4HpL12Jc4XHmw9shpA==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.50.2.tgz", - "integrity": "sha512-jrkuyKoOM7dFWQ/6Y4hQAse2SC3L/RldG6GnPjMvAj65h+7Ubb51S0pKk4ofSStF0xm4LCNe0C4T6XX4nOFDiQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.52.0.tgz", + "integrity": "sha512-br3DO7n4N8CXwTRbZS0MnB4WQ9YHfNjCwkCEzVR/wek/qNTDQKDb0nROmkFaNZ8ucUqUVKZi074dbwMwRDlK8Q==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/client-common": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.50.2.tgz", - "integrity": "sha512-4107YLJqCudPiBUlwnk6oTSUVwU7ab+qL1SfQGEDYI8DZH5gsf1ekPt9JykXRKYXf2IfouFL5GiCY/PHTFIjYw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.52.0.tgz", + "integrity": "sha512-b0T/Ca2c9KyEslKsVrGZvbe1UrrKKSdfXhBZ2pbpKahFUzJfziRZ0urbOm7V65O0tO/jwU+Lo/+bIiiyhzGt8w==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2" + "@algolia/client-common": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.50.2.tgz", - "integrity": "sha512-vOrd3MQpLgmf6wXAueTuZ/cA0W4uRwIHHaxNy3h+a6YcNn6bCV/gFdZuv3F13v593zRU2k5R75NmvRWLenvMrw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.52.0.tgz", + "integrity": "sha512-ozBT8J/mtD4H4IAojw8QPirlcL2gHrI1BGuZ4/ZXXO/rTE1yQ4VIPJj4mTTbwo4FbkS1MoJsD/DsrqLzhnc4/g==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2" + "@algolia/client-common": "5.52.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.50.2.tgz", - "integrity": "sha512-Mu9BFtgzGqDUy5Bcs2nMyoILIFSN13GKQaklKAFIsd0K3/9CpNyfeBc+/+Qs6mFZLlxG9qzullO7h+bjcTBuGQ==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.52.0.tgz", + "integrity": "sha512-gyyWcLD22tnabmoit4iukCXuoRc5HYJuUjPSEa8a0D/f/NlRafpWi52AlAaa4Uu/rsl7saHsJFTNjTptWbu2+A==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/client-common": "5.50.2" + "@algolia/client-common": "5.52.0" }, "engines": { "node": ">= 14.0.0" @@ -314,9 +314,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", "dev": true, "license": "MIT", "dependencies": { @@ -376,9 +376,9 @@ } }, "node_modules/@cap-js/db-service": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@cap-js/db-service/-/db-service-2.9.0.tgz", - "integrity": "sha512-WCXhoqezaF6A5I2l0MNZeHKXXtHRNEq7Rp0R89/uccOHQIx0DuU0U9NuJJPV/1G5RGk2QKQ9VBo/KYn+MZuuNQ==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/@cap-js/db-service/-/db-service-2.11.0.tgz", + "integrity": "sha512-sl33LcxZYAJgMCQZDw4lMGe4kWYq6685Xc6ze4qcoM+rd6aqiyVsSC6C7XH5yerXs7cVHhRC+Dgo8AsaapFzlQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -389,13 +389,13 @@ } }, "node_modules/@cap-js/sqlite": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@cap-js/sqlite/-/sqlite-2.2.0.tgz", - "integrity": "sha512-FPj+uVU/14vtGUl2P/Q8y7XhZbsLgrCav2O5PjHPXnupegjby4sMJkgVNxVHnkyKPFgO/W8uEsq9r5TU9VPx8w==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@cap-js/sqlite/-/sqlite-2.4.0.tgz", + "integrity": "sha512-Ao+AzIN6BWHNpLbGxAzF79OezFNHzDG2srwiBABs0FYxIxEGkc2hg6ETo79pTTt66gcWtx7pWh/N9xk2M6SFBQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@cap-js/db-service": "^2.9.0", + "@cap-js/db-service": "^2.11.0", "better-sqlite3": "^12.0.0" }, "peerDependencies": { @@ -1695,31 +1695,46 @@ "license": "MIT" }, "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", "peer": true, + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.7", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", - "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@humanfs/core": "^0.19.1", + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=18.18.0" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1751,9 +1766,9 @@ } }, "node_modules/@iconify-json/simple-icons": { - "version": "1.2.78", - "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.78.tgz", - "integrity": "sha512-I3lkNp0Qu7q2iZWkdcf/I2hqGhzK6qxdILh9T7XqowQrnpmG/BayDsiCf6PktDoWlW0U971xA5g+panm+NFrfQ==", + "version": "1.2.80", + "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.80.tgz", + "integrity": "sha512-iglncJJ6X/dVuzFDU32MrHwwo4RBwivGf108dgyYg+HKS78ifx0h7sTenpDZMVT+UhdS6CSgZcvY/SvRXlIEUg==", "dev": true, "license": "CC0-1.0", "dependencies": { @@ -2124,9 +2139,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", - "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.3.tgz", + "integrity": "sha512-x35CNW/ANXG3hE/EZpRU8MXX1JDN86hBb2wMGAtltkz7pc6cxgjpy1OMMfDosOQ+2hWqIkag/fGok1Yady9nGw==", "cpu": [ "arm" ], @@ -2138,9 +2153,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", - "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.3.tgz", + "integrity": "sha512-xw3xtkDApIOGayehp2+Rz4zimfkaX65r4t47iy+ymQB2G4iJCBBfj0ogVg5jpvjpn8UWn/+q9tprxleYeNp3Hw==", "cpu": [ "arm64" ], @@ -2152,9 +2167,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", - "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.3.tgz", + "integrity": "sha512-vo6Y5Qfpx7/5EaamIwi0WqW2+zfiusVihKatLvtN1VFVy3D13uERk/6gZLU1UiHRL6fDXqj/ELIeVRGnvcTE1g==", "cpu": [ "arm64" ], @@ -2166,9 +2181,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", - "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.3.tgz", + "integrity": "sha512-D+0QGcZhBzTN82weOnsSlY7V7+RMmPuF1CkbxyMAGE8+ZHeUjyb76ZiWmBlCu//AQQONvxcqRbwZTajZKqjuOw==", "cpu": [ "x64" ], @@ -2180,9 +2195,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", - "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.3.tgz", + "integrity": "sha512-6HnvHCT7fDyj6R0Ph7A6x8dQS/S38MClRWeDLqc0MdfWkxjiu1HSDYrdPhqSILzjTIC/pnXbbJbo+ft+gy/9hQ==", "cpu": [ "arm64" ], @@ -2194,9 +2209,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", - "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.3.tgz", + "integrity": "sha512-KHLgC3WKlUYW3ShFKnnosZDOJ0xjg9zp7au3sIm2bs/tGBeC2ipmvRh/N7JKi0t9Ue20C0dpEshi8WUubg+cnA==", "cpu": [ "x64" ], @@ -2208,9 +2223,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", - "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.3.tgz", + "integrity": "sha512-DV6fJoxEYWJOvaZIsok7KrYl0tPvga5OZ2yvKHNNYyk/2roMLqQAbGhr78EQ5YhHpnhLKJD3S1WFusAkmUuV5g==", "cpu": [ "arm" ], @@ -2225,9 +2240,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", - "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.3.tgz", + "integrity": "sha512-mQKoJAzvuOs6F+TZybQO4GOTSMUu7v0WdxEk24krQ/uUxXoPTtHjuaUuPmFhtBcM4K0ons8nrE3JyhTuCFtT/w==", "cpu": [ "arm" ], @@ -2242,9 +2257,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", - "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.3.tgz", + "integrity": "sha512-Whjj2qoiJ6+OOJMGptTYazaJvjOJm+iKHpXQM1P3LzGjt7Ff++Tp7nH4N8J/BUA7R9IHfDyx4DJIflifwnbmIA==", "cpu": [ "arm64" ], @@ -2259,9 +2274,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", - "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.3.tgz", + "integrity": "sha512-4YTNHKqGng5+yiZt3mg77nmyuCfmNfX4fPmyUapBcIk+BdwSwmCWGXOUxhXbBEkFHtoN5boLj/5NON+u5QC9tg==", "cpu": [ "arm64" ], @@ -2276,9 +2291,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", - "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.3.tgz", + "integrity": "sha512-SU3kNlhkpI4UqlUc2VXPGK9o886ZsSeGfMAX2ba2b8DKmMXq4AL7KUrkSWVbb7koVqx41Yczx6dx5PNargIrEA==", "cpu": [ "loong64" ], @@ -2293,9 +2308,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", - "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.3.tgz", + "integrity": "sha512-6lDLl5h4TXpB1mTf2rQWnAk/LcXrx9vBfu/DT5TIPhvMhRWaZ5MxkIc8u4lJAmBo6klTe1ywXIUHFjylW505sg==", "cpu": [ "loong64" ], @@ -2310,9 +2325,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", - "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.3.tgz", + "integrity": "sha512-BMo8bOw8evlup/8G+cj5xWtPyp93xPdyoSN16Zy90Q2QZ0ZYRhCt6ZJSwbrRzG9HApFabjwj2p25TUPDWrhzqQ==", "cpu": [ "ppc64" ], @@ -2327,9 +2342,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", - "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.3.tgz", + "integrity": "sha512-E0L8X1dZN1/Rph+5VPF6Xj2G7JJvMACVXtamTJIDrVI44Y3K+G8gQaMEAavbqCGTa16InptiVrX6eM6pmJ+7qA==", "cpu": [ "ppc64" ], @@ -2344,9 +2359,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", - "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.3.tgz", + "integrity": "sha512-oZJ/WHaVfHUiRAtmTAeo3DcevNsVvH8mbvodjZy7D5QKvCefO371SiKRpxoDcCxB3PTRTLayWBkvmDQKTcX/sw==", "cpu": [ "riscv64" ], @@ -2361,9 +2376,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", - "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.3.tgz", + "integrity": "sha512-Dhbyh7j9FybM3YaTgaHmVALwA8AkUwTPccyCQ79TG9AJUsMQqgN1DDEZNr4+QUfwiWvLDumW5vdwzoeUF+TNxQ==", "cpu": [ "riscv64" ], @@ -2378,9 +2393,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", - "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.3.tgz", + "integrity": "sha512-cJd1X5XhHHlltkaypz1UcWLA8AcoIi1aWhsvaWDskD1oz2eKCypnqvTQ8ykMNI0RSmm7NkTdSqSSD7zM0xa6Ig==", "cpu": [ "s390x" ], @@ -2395,9 +2410,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", - "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.3.tgz", + "integrity": "sha512-DAZDBHQfG2oQuhY7mc6I3/qB4LU2fQCjRvxbDwd/Jdvb9fypP4IJ4qmtu6lNjes6B531AI8cg1aKC2di97bUxA==", "cpu": [ "x64" ], @@ -2412,9 +2427,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", - "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.3.tgz", + "integrity": "sha512-cRxsE8c13mZOh3vP+wLDxpQBRrOHDIGOWyDL93Sy0Ga8y515fBcC2pjUfFwUe5T7tqvTvWbCpg1URM/AXdWIXA==", "cpu": [ "x64" ], @@ -2429,9 +2444,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", - "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.3.tgz", + "integrity": "sha512-QaWcIgRxqEdQdhJqW4DJctsH6HCmo5vHxY0krHSX4jMtOqfzC+dqDGuHM87bu4H8JBeibWx7jFz+h6/4C8wA5Q==", "cpu": [ "x64" ], @@ -2443,9 +2458,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", - "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.3.tgz", + "integrity": "sha512-AaXwSvUi3QIPtroAUw1t5yHGIyqKEXwH54WUocFolZhpGDruJcs8c+xPNDRn4XiQsS7MEwnYsHW2l0MBLDMkWg==", "cpu": [ "arm64" ], @@ -2457,9 +2472,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", - "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.3.tgz", + "integrity": "sha512-65LAKM/bAWDqKNEelHlcHvm2V+Vfb8C6INFxQXRHCvaVN1rJfwr4NvdP4FyzUaLqWfaCGaadf6UbTm8xJeYfEg==", "cpu": [ "arm64" ], @@ -2471,9 +2486,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", - "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.3.tgz", + "integrity": "sha512-EEM2gyhBF5MFnI6vMKdX1LAosE627RGBzIoGMdLloPZkXrUN0Ckqgr2Qi8+J3zip/8NVVro3/FjB+tjhZUgUHA==", "cpu": [ "ia32" ], @@ -2485,9 +2500,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", - "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.3.tgz", + "integrity": "sha512-E5Eb5H/DpxaoXH++Qkv28RcUJboMopmdDUALBczvHMf7hNIxaDZqwY5lK12UK1BHacSmvupoEWGu+n993Z0y1A==", "cpu": [ "x64" ], @@ -2499,9 +2514,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", - "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.3.tgz", + "integrity": "sha512-hPt/bgL5cE+Qp+/TPHBqptcAgPzgj46mPcg/16zNUmbQk0j+mOEQV/+Lqu8QRtDV3Ek95Q6FeFITpuhl6OTsAA==", "cpu": [ "x64" ], @@ -2513,16 +2528,16 @@ ] }, "node_modules/@sap/cds": { - "version": "9.8.5", - "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-9.8.5.tgz", - "integrity": "sha512-AU7HzrdEf8u13W2Aff8GyqKpJh6w9yXK/68xvXD+6cuU21JcGOLQ+dInbNV8vRKaCMn2cVVrsx7OoR+j7z5QKA==", + "version": "9.9.1", + "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-9.9.1.tgz", + "integrity": "sha512-GqdsBsRkZThhpOyzj8ihf/jDmf/2zprZFgaun6ZymUw4/ahzjK/bbdd6eQ8txDuv88pnUl2HPFjvUVq3O/6hCA==", "dev": true, "license": "SEE LICENSE IN LICENSE", "dependencies": { "@sap/cds-compiler": "^6.4", "@sap/cds-fiori": "^2", "express": "^4.22.1 || ^5", - "js-yaml": "^4.1.1" + "yaml": "^2" }, "bin": { "cds-deploy": "bin/deploy.js", @@ -2542,9 +2557,9 @@ } }, "node_modules/@sap/cds-compiler": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@sap/cds-compiler/-/cds-compiler-6.8.0.tgz", - "integrity": "sha512-yRoTZcH8DFiP4PcEuIHe42YAaNt51V736+6RRr+U4nbO91sz36L8be2djcE8n760t8IbqLxzZ/UkATiL0fjRmA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@sap/cds-compiler/-/cds-compiler-6.9.0.tgz", + "integrity": "sha512-UXQ5pomb+Fw48Ch1mJoN1JkDy0loZX8nZKXjy4qxY2s9FMwNOwKJP9wPomAVlYcuzq6u8Viqh5j70ty8ciGWGg==", "dev": true, "license": "SEE LICENSE IN LICENSE", "bin": { @@ -2805,11 +2820,14 @@ "license": "MIT" }, "node_modules/@sqlite.org/sqlite-wasm": { - "version": "3.51.2-build9", - "resolved": "https://registry.npmjs.org/@sqlite.org/sqlite-wasm/-/sqlite-wasm-3.51.2-build9.tgz", - "integrity": "sha512-tj2Sa6X4gVZqS9SiT2xlEeChSUklSGq8Hz6zKNbHW6NRiGyrSXiFcspnrWru1wPBT76RX/VxweESKxawCxfDxg==", + "version": "3.53.0-build1", + "resolved": "https://registry.npmjs.org/@sqlite.org/sqlite-wasm/-/sqlite-wasm-3.53.0-build1.tgz", + "integrity": "sha512-PfWPWN2n+/37doa8oh2/oUXk4OOsRYZsxc1W1sDXIGb/Pu5Yrb+f2eyYpgQMGITVX7HVgxhs9P18Rc6I97ym/g==", "dev": true, "license": "Apache-2.0", + "workspaces": [ + "demos/*" + ], "engines": { "node": ">=22" } @@ -3216,14 +3234,14 @@ "license": "MIT" }, "node_modules/@vue/compiler-core": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.32.tgz", - "integrity": "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==", + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.33.tgz", + "integrity": "sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.2", - "@vue/shared": "3.5.32", + "@vue/shared": "3.5.33", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" @@ -3243,43 +3261,43 @@ } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz", - "integrity": "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==", + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.33.tgz", + "integrity": "sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.32", - "@vue/shared": "3.5.32" + "@vue/compiler-core": "3.5.33", + "@vue/shared": "3.5.33" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz", - "integrity": "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==", + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.33.tgz", + "integrity": "sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.2", - "@vue/compiler-core": "3.5.32", - "@vue/compiler-dom": "3.5.32", - "@vue/compiler-ssr": "3.5.32", - "@vue/shared": "3.5.32", + "@vue/compiler-core": "3.5.33", + "@vue/compiler-dom": "3.5.33", + "@vue/compiler-ssr": "3.5.33", + "@vue/shared": "3.5.33", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.8", + "postcss": "^8.5.10", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz", - "integrity": "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==", + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.33.tgz", + "integrity": "sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.32", - "@vue/shared": "3.5.32" + "@vue/compiler-dom": "3.5.33", + "@vue/shared": "3.5.33" } }, "node_modules/@vue/devtools-api": { @@ -3319,73 +3337,73 @@ } }, "node_modules/@vue/language-core": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.6.tgz", - "integrity": "sha512-xYYYX3/aVup576tP/23sEUpgiEnujrENaoNRbaozC1/MA9I6EGFQRJb4xrt/MmUCAGlxTKL2RmT8JLTPqagCkg==", + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.8.tgz", + "integrity": "sha512-9OiSPQFiAAWNVnXb0d2dcTmcKnFQamhuNES6ayyISrb/mwPWVgoGdAqSfCWqKhQpa3D5gDTcYD+w7ObiheZ81g==", "dev": true, "license": "MIT", "dependencies": { "@volar/language-core": "2.4.28", "@vue/compiler-dom": "^3.5.0", "@vue/shared": "^3.5.0", - "alien-signals": "^3.0.0", + "alien-signals": "^3.1.2", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", - "picomatch": "^4.0.2" + "picomatch": "^4.0.4" } }, "node_modules/@vue/reactivity": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.32.tgz", - "integrity": "sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==", + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.33.tgz", + "integrity": "sha512-p8UfIqyIhb0rYGlSgSBV+lPhF2iUSBcRy7enhTmPqKWadHy9kcOFYF1AejYBP9P+avnd3OBbD49DU4pLWX/94A==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.5.32" + "@vue/shared": "3.5.33" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.32.tgz", - "integrity": "sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==", + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.33.tgz", + "integrity": "sha512-UpFF45RI9//a7rvq7RdOQblb4tup7hHG9QsmIrxkFQLzQ7R8/iNQ5LE15NhLZ1/WcHMU2b47u6P33CPUelHyIQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.32", - "@vue/shared": "3.5.32" + "@vue/reactivity": "3.5.33", + "@vue/shared": "3.5.33" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.32.tgz", - "integrity": "sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==", + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.33.tgz", + "integrity": "sha512-IOxMsAOwquhfITgmOgaPYl7/j8gKUxUFoflRc+u4LxyD3+783xne8vNta1PONVCvCV9A0w7hkyEepINDqfO0tw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.32", - "@vue/runtime-core": "3.5.32", - "@vue/shared": "3.5.32", + "@vue/reactivity": "3.5.33", + "@vue/runtime-core": "3.5.33", + "@vue/shared": "3.5.33", "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.32.tgz", - "integrity": "sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==", + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.33.tgz", + "integrity": "sha512-0xylq/8/h44lVG0pZFknv1XIdEgymq2E9n59uTWJBG+dIgiT0TMCSsxrN7nO16Z0MU0MPjFcguBbZV8Itk52Hw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.32", - "@vue/shared": "3.5.32" + "@vue/compiler-ssr": "3.5.33", + "@vue/shared": "3.5.33" }, "peerDependencies": { - "vue": "3.5.32" + "vue": "3.5.33" } }, "node_modules/@vue/shared": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.32.tgz", - "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==", + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.33.tgz", + "integrity": "sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==", "dev": true, "license": "MIT" }, @@ -3545,9 +3563,9 @@ } }, "node_modules/ajv": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", - "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, "license": "MIT", "peer": true, @@ -3563,26 +3581,26 @@ } }, "node_modules/algoliasearch": { - "version": "5.50.2", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.50.2.tgz", - "integrity": "sha512-Tfp26yoNWurUjfgK4GOrVJQhSNXu9tJtHfFFNosgT2YClG+vPyUjX/gbC8rG39qLncnZg8Fj34iarQWpMkqefw==", + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.52.0.tgz", + "integrity": "sha512-0ZzY9mjqV7gop/AH8pIBiAS8giXP7WcSiUfoFYIzYAK9QC5c37E4SIVtJVBMwlURc0/uNt2o4RcNRvdHa4CJ5w==", "dev": true, "license": "MIT", "dependencies": { - "@algolia/abtesting": "1.16.2", - "@algolia/client-abtesting": "5.50.2", - "@algolia/client-analytics": "5.50.2", - "@algolia/client-common": "5.50.2", - "@algolia/client-insights": "5.50.2", - "@algolia/client-personalization": "5.50.2", - "@algolia/client-query-suggestions": "5.50.2", - "@algolia/client-search": "5.50.2", - "@algolia/ingestion": "1.50.2", - "@algolia/monitoring": "1.50.2", - "@algolia/recommend": "5.50.2", - "@algolia/requester-browser-xhr": "5.50.2", - "@algolia/requester-fetch": "5.50.2", - "@algolia/requester-node-http": "5.50.2" + "@algolia/abtesting": "1.18.0", + "@algolia/client-abtesting": "5.52.0", + "@algolia/client-analytics": "5.52.0", + "@algolia/client-common": "5.52.0", + "@algolia/client-insights": "5.52.0", + "@algolia/client-personalization": "5.52.0", + "@algolia/client-query-suggestions": "5.52.0", + "@algolia/client-search": "5.52.0", + "@algolia/ingestion": "1.52.0", + "@algolia/monitoring": "1.52.0", + "@algolia/recommend": "5.52.0", + "@algolia/requester-browser-xhr": "5.52.0", + "@algolia/requester-fetch": "5.52.0", + "@algolia/requester-node-http": "5.52.0" }, "engines": { "node": ">= 14.0.0" @@ -4508,19 +4526,19 @@ } }, "node_modules/eslint": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.2.0.tgz", - "integrity": "sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz", + "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", - "@eslint/config-array": "^0.23.4", - "@eslint/config-helpers": "^0.5.4", - "@eslint/core": "^1.2.0", - "@eslint/plugin-kit": "^0.7.0", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.5.5", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -5123,9 +5141,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "dev": true, "license": "MIT", "dependencies": { @@ -6700,9 +6718,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", "dev": true, "funding": [ { @@ -6744,9 +6762,9 @@ } }, "node_modules/node-abi": { - "version": "3.89.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.89.0.tgz", - "integrity": "sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==", + "version": "3.90.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.90.0.tgz", + "integrity": "sha512-pZNQT7UnYlMwMBy5N1lV5X/YLTbZM5ncytN3xL7CHEzhDN8uVe0u55yaPUJICIJjaCW8NrM5BFdqr7HLweStNA==", "dev": true, "license": "MIT", "dependencies": { @@ -6808,20 +6826,20 @@ } }, "node_modules/oniguruma-parser": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.1.tgz", - "integrity": "sha512-8Unqkvk1RYc6yq2WBYRj4hdnsAxVze8i7iPfQr8e4uSP3tRv0rpZcbGUDvxfQQcdwHt/e9PrMvGCsa8OqG9X3w==", + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz", + "integrity": "sha512-6HVa5oIrgMC6aA6WF6XyyqbhRPJrKR02L20+2+zpDtO5QAzGHAUGw5TKQvwi5vctNnRHkJYmjAhRVQF2EKdTQw==", "dev": true, "license": "MIT" }, "node_modules/oniguruma-to-es": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.5.tgz", - "integrity": "sha512-Zjygswjpsewa0NLTsiizVuMQZbp0MDyM6lIt66OxsF21npUDlzpHi1Mgb/qhQdkb+dWFTzJmFbEWdvZgRho8eQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-4.3.6.tgz", + "integrity": "sha512-csuQ9x3Yr0cEIs/Zgx/OEt9iBw9vqIunAPQkx19R/fiMq2oGVTgcMqO/V3Ybqefr1TBvosI6jU539ksaBULJyA==", "dev": true, "license": "MIT", "dependencies": { - "oniguruma-parser": "^0.12.1", + "oniguruma-parser": "^0.12.2", "regex": "^6.1.0", "regex-recursion": "^6.0.2" } @@ -6984,9 +7002,9 @@ } }, "node_modules/postcss": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz", - "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==", + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", "dev": true, "funding": [ { @@ -7258,9 +7276,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.60.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", - "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "version": "4.60.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.3.tgz", + "integrity": "sha512-pAQK9HalE84QSm4Po3EmWIZPd3FnjkShVkiMlz1iligWYkWQ7wHYd1PF/T7QZ5TVSD6uSTon5gBVMSM4JfBV+A==", "dev": true, "license": "MIT", "dependencies": { @@ -7274,31 +7292,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.60.1", - "@rollup/rollup-android-arm64": "4.60.1", - "@rollup/rollup-darwin-arm64": "4.60.1", - "@rollup/rollup-darwin-x64": "4.60.1", - "@rollup/rollup-freebsd-arm64": "4.60.1", - "@rollup/rollup-freebsd-x64": "4.60.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", - "@rollup/rollup-linux-arm-musleabihf": "4.60.1", - "@rollup/rollup-linux-arm64-gnu": "4.60.1", - "@rollup/rollup-linux-arm64-musl": "4.60.1", - "@rollup/rollup-linux-loong64-gnu": "4.60.1", - "@rollup/rollup-linux-loong64-musl": "4.60.1", - "@rollup/rollup-linux-ppc64-gnu": "4.60.1", - "@rollup/rollup-linux-ppc64-musl": "4.60.1", - "@rollup/rollup-linux-riscv64-gnu": "4.60.1", - "@rollup/rollup-linux-riscv64-musl": "4.60.1", - "@rollup/rollup-linux-s390x-gnu": "4.60.1", - "@rollup/rollup-linux-x64-gnu": "4.60.1", - "@rollup/rollup-linux-x64-musl": "4.60.1", - "@rollup/rollup-openbsd-x64": "4.60.1", - "@rollup/rollup-openharmony-arm64": "4.60.1", - "@rollup/rollup-win32-arm64-msvc": "4.60.1", - "@rollup/rollup-win32-ia32-msvc": "4.60.1", - "@rollup/rollup-win32-x64-gnu": "4.60.1", - "@rollup/rollup-win32-x64-msvc": "4.60.1", + "@rollup/rollup-android-arm-eabi": "4.60.3", + "@rollup/rollup-android-arm64": "4.60.3", + "@rollup/rollup-darwin-arm64": "4.60.3", + "@rollup/rollup-darwin-x64": "4.60.3", + "@rollup/rollup-freebsd-arm64": "4.60.3", + "@rollup/rollup-freebsd-x64": "4.60.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.3", + "@rollup/rollup-linux-arm-musleabihf": "4.60.3", + "@rollup/rollup-linux-arm64-gnu": "4.60.3", + "@rollup/rollup-linux-arm64-musl": "4.60.3", + "@rollup/rollup-linux-loong64-gnu": "4.60.3", + "@rollup/rollup-linux-loong64-musl": "4.60.3", + "@rollup/rollup-linux-ppc64-gnu": "4.60.3", + "@rollup/rollup-linux-ppc64-musl": "4.60.3", + "@rollup/rollup-linux-riscv64-gnu": "4.60.3", + "@rollup/rollup-linux-riscv64-musl": "4.60.3", + "@rollup/rollup-linux-s390x-gnu": "4.60.3", + "@rollup/rollup-linux-x64-gnu": "4.60.3", + "@rollup/rollup-linux-x64-musl": "4.60.3", + "@rollup/rollup-openbsd-x64": "4.60.3", + "@rollup/rollup-openharmony-arm64": "4.60.3", + "@rollup/rollup-win32-arm64-msvc": "4.60.3", + "@rollup/rollup-win32-ia32-msvc": "4.60.3", + "@rollup/rollup-win32-x64-gnu": "4.60.3", + "@rollup/rollup-win32-x64-msvc": "4.60.3", "fsevents": "~2.3.2" } }, @@ -7887,36 +7905,36 @@ } }, "node_modules/twoslash": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/twoslash/-/twoslash-0.3.7.tgz", - "integrity": "sha512-f7YgM+6G5e3wRGwMiOV8Z0wfusR4zCcdDPSqgGjpLSiW0ymT9r/dM6g++IvOMtSO0KnP/yGTUFhH04y6uqpL6g==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/twoslash/-/twoslash-0.3.8.tgz", + "integrity": "sha512-OeDz0kDl8sqPUN3nr7gqcvOs70f5lZsdhKYTX3/SgB9OvdadzzoYJI/4SBXhXV1HG8E9fLc+e17itoRYTxmoig==", "dev": true, "license": "MIT", "dependencies": { "@typescript/vfs": "^1.6.4", - "twoslash-protocol": "0.3.7" + "twoslash-protocol": "0.3.8" }, "peerDependencies": { "typescript": "^5.5.0 || ^6.0.0" } }, "node_modules/twoslash-protocol": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/twoslash-protocol/-/twoslash-protocol-0.3.7.tgz", - "integrity": "sha512-mwDFdclG7DbFW3aZA/CGATzV2efV2uPai90mmRSblqPbrc1Z1cu+DpI5oKMNciGY4rw8EOXc7QGY8O0iw1hnzg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/twoslash-protocol/-/twoslash-protocol-0.3.8.tgz", + "integrity": "sha512-HmvAHoiEviK8LqvAQyc9/irkdvwTUiR1fHmNwH/0gq8EHxyBt4PWVPixjEXg6wJu1u6yBrILEWXGK9Kw58/8yQ==", "dev": true, "license": "MIT" }, "node_modules/twoslash-vue": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/twoslash-vue/-/twoslash-vue-0.3.7.tgz", - "integrity": "sha512-ReBiEd4xXIICSZDU06shPr+JNf5iFOfQjpjn2q/4vz7y6pEU4vNxEjjHL5hI+nbSASAO43CDOLbY9vXBH9yXUg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/twoslash-vue/-/twoslash-vue-0.3.8.tgz", + "integrity": "sha512-5HZAnkQ1R6NXqW9mqsHx4aHVWPb5gb4gfEKiaNczi3q6U7vDZeVv9eONRuPs4qdCd5OJSAIpHeXxIDZmjr0Jww==", "dev": true, "license": "MIT", "dependencies": { "@vue/language-core": "^3.2.6", - "twoslash": "0.3.7", - "twoslash-protocol": "0.3.7" + "twoslash": "0.3.8", + "twoslash-protocol": "0.3.8" }, "funding": { "url": "https://github.com/sponsors/antfu" @@ -7955,9 +7973,9 @@ } }, "node_modules/typescript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.2.tgz", - "integrity": "sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -8200,12 +8218,13 @@ } }, "node_modules/vite-plugin-cds": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/vite-plugin-cds/-/vite-plugin-cds-0.2.0.tgz", - "integrity": "sha512-dR6s3R5VqkZUvJ/PZeWG/j/Q670w85X0cQbvSfC4ucXysXHnm9s8QssDgumteN52a72s36Ld5T8MSQSPh6o3mQ==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/vite-plugin-cds/-/vite-plugin-cds-0.3.1.tgz", + "integrity": "sha512-Fm/zSh/Cn5QhyL7V/XbtT1b6osM2BSX7vlXqgwtDCVp/4aq8f5Ri+auy4WUtzqPeWljG6DP/PJs/HazBn5uERQ==", "dev": true, "license": "MIT", "workspaces": [ + ".", "test/*" ], "peerDependencies": { @@ -8871,17 +8890,17 @@ "license": "MIT" }, "node_modules/vue": { - "version": "3.5.32", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.32.tgz", - "integrity": "sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==", + "version": "3.5.33", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.33.tgz", + "integrity": "sha512-1AgChhx5w3ALgT4oK3acm2Es/7jyZhWSVUfs3rOBlGQC0rjEDkS7G4lWlJJGGNQD+BV3reCwbQrOe1mPNwKHBQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.32", - "@vue/compiler-sfc": "3.5.32", - "@vue/runtime-dom": "3.5.32", - "@vue/server-renderer": "3.5.32", - "@vue/shared": "3.5.32" + "@vue/compiler-dom": "3.5.33", + "@vue/compiler-sfc": "3.5.33", + "@vue/runtime-dom": "3.5.33", + "@vue/server-renderer": "3.5.33", + "@vue/shared": "3.5.33" }, "peerDependencies": { "typescript": "*" @@ -8951,9 +8970,9 @@ } }, "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.4.tgz", + "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==", "dev": true, "license": "ISC", "bin": { diff --git a/package.json b/package.json index 7380c072ab..2839c9d5fe 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "monaco-editor": "^0.55.1", "sass": "^1.62.1", "vite": "^7", - "vite-plugin-cds": "^0.2.0", + "vite-plugin-cds": "^0.3.1", "vitepress": "^1" } } From 820605cb950b374b2f1c666246a62b070c74c7e1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 16:54:52 +0200 Subject: [PATCH 017/156] chore: Update CLI texts (#2555) 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 | 4 ++-- tools/assets/help/cds-version.out.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/assets/help/cds-version-md.out.md b/tools/assets/help/cds-version-md.out.md index 35b531e839..e3c5730793 100644 --- a/tools/assets/help/cds-version-md.out.md +++ b/tools/assets/help/cds-version-md.out.md @@ -8,8 +8,8 @@ | @sap/cds | 9.9.1 | .../node_modules/@sap/cds | | @sap/cds-compiler | 6.9.0 | .../node_modules/@sap/cds-compiler | | @sap/cds-fiori | 2.3.0 | .../node_modules/@sap/cds-fiori | - | @cap-js/db-service | 2.10.0 | .../node_modules/@cap-js/db-service | - | @cap-js/sqlite | 2.2.1 | .../node_modules/@cap-js/sqlite | + | @cap-js/db-service | 2.11.0 | .../node_modules/@cap-js/db-service | + | @cap-js/sqlite | 2.4.0 | .../node_modules/@cap-js/sqlite | | cds.home | | .../node_modules/@sap/cds | | cds.root | | .../your-project | | npm root -l | | .../node_modules | diff --git a/tools/assets/help/cds-version.out.md b/tools/assets/help/cds-version.out.md index 66060c0082..8ace43a52d 100644 --- a/tools/assets/help/cds-version.out.md +++ b/tools/assets/help/cds-version.out.md @@ -6,8 +6,8 @@ @sap/cds 9.9.1 .../node_modules/@sap/cds @sap/cds-compiler 6.9.0 .../node_modules/@sap/cds-compiler @sap/cds-fiori 2.3.0 .../node_modules/@sap/cds-fiori - @cap-js/db-service 2.10.0 .../node_modules/@cap-js/db-service - @cap-js/sqlite 2.2.1 .../node_modules/@cap-js/sqlite + @cap-js/db-service 2.11.0 .../node_modules/@cap-js/db-service + @cap-js/sqlite 2.4.0 .../node_modules/@cap-js/sqlite cds.home .../node_modules/@sap/cds cds.root .../your-project npm root -l .../node_modules From 0590bcd52e7601f8cac03d3057012e0cd0d27576 Mon Sep 17 00:00:00 2001 From: Stefan Henke Date: Thu, 7 May 2026 08:28:07 +0200 Subject: [PATCH 018/156] =?UTF-8?q?Revert=20"Document=20tenant-specific=20?= =?UTF-8?q?IAS=20host=20injection=20in=20RequestContext=E2=80=A6=20(#2518)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As it turned out that the API provided by Subscription Manager does not offer the required field, we need to revert the docu. Once there is a final decision/solution, we will update the docu again … (#2474)" This reverts commit 66b451882b226922a59ddfc4c4862e1f314f8836. --- guides/security/cap-users.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/guides/security/cap-users.md b/guides/security/cap-users.md index 3cc579860e..599467b0e7 100644 --- a/guides/security/cap-users.md +++ b/guides/security/cap-users.md @@ -1529,16 +1529,6 @@ Avoid iterating through all subscriber tenants to perform tenant-specific tasks. Instead, prefer a task-based approach which processes specific subscriber tenants selectively. ::: -To use IAS-based Remote Services in background executions, you might in addition need to manually inject the tenant-specific IAS host into the created Request Context. If the background execution is initialized with a fresh Request Context, it will not carry inherited authentication details from a previous Request Context and thereby lacks the IAS host information required for remote service calls. The host can be retrieved from a `TenantInfo` object provided for example by the `TenantProviderService`. - -```java -TenantInto tenantInfo = ...; -String tenantHost = tenantInfo.get("subscriber").get("tenantHost"); -runtime.requestContext().systemUser(tenantId).modifyUser(user->user.setAdditionalAttribute("iss", tenantHost)).run((reqContext) -> { -… //call remote service -}); -``` -
From 2a58fe35d74978a6b6144377b581bb81a51a8d4d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 15:13:20 +0200 Subject: [PATCH 019/156] Update dependency vite to v7.3.3 (#2558) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [vite](https://vite.dev) ([source](https://redirect.github.com/vitejs/vite/tree/HEAD/packages/vite)) | [`7.3.2` → `7.3.3`](https://renovatebot.com/diffs/npm/vite/7.3.2/7.3.3) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vite/7.3.3?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite/7.3.2/7.3.3?slim=true) | --- ### Release Notes
vitejs/vite (vite) ### [`v7.3.3`](https://redirect.github.com/vitejs/vite/releases/tag/v7.3.3) [Compare Source](https://redirect.github.com/vitejs/vite/compare/v7.3.2...v7.3.3) Please refer to [CHANGELOG.md](https://redirect.github.com/vitejs/vite/blob/v7.3.3/packages/vite/CHANGELOG.md) for details.
--- ### Configuration 📅 **Schedule**: (UTC) - 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 0269417b89..ec0270434a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8143,9 +8143,9 @@ } }, "node_modules/vite": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", - "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", + "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", "dev": true, "license": "MIT", "dependencies": { From 452e976c751cb2ff5d617572e5e3c0e6a58a566b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 15:14:04 +0200 Subject: [PATCH 020/156] Update dependency vite-plugin-cds to v0.3.3 (#2554) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [vite-plugin-cds](https://redirect.github.com/Akatuoro/vite-plugin-cds) | [`0.3.1` → `0.3.3`](https://renovatebot.com/diffs/npm/vite-plugin-cds/0.3.1/0.3.3) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vite-plugin-cds/0.3.3?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite-plugin-cds/0.3.1/0.3.3?slim=true) | --- ### Release Notes
Akatuoro/vite-plugin-cds (vite-plugin-cds) ### [`v0.3.3`](https://redirect.github.com/Akatuoro/vite-plugin-cds/releases/tag/v0.3.3) [Compare Source](https://redirect.github.com/Akatuoro/vite-plugin-cds/compare/v0.3.2...v0.3.3) improved support for ssr scenarios ### [`v0.3.2`](https://redirect.github.com/Akatuoro/vite-plugin-cds/releases/tag/v0.3.2) [Compare Source](https://redirect.github.com/Akatuoro/vite-plugin-cds/compare/v0.3.1...v0.3.2) fixed warnings, improved rolldown compatibility
--- ### Configuration 📅 **Schedule**: (UTC) - 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 ec0270434a..b41c0e9af4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8218,9 +8218,9 @@ } }, "node_modules/vite-plugin-cds": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/vite-plugin-cds/-/vite-plugin-cds-0.3.1.tgz", - "integrity": "sha512-Fm/zSh/Cn5QhyL7V/XbtT1b6osM2BSX7vlXqgwtDCVp/4aq8f5Ri+auy4WUtzqPeWljG6DP/PJs/HazBn5uERQ==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/vite-plugin-cds/-/vite-plugin-cds-0.3.3.tgz", + "integrity": "sha512-Fea0bM/agWA+R5zHLp4HT8ZqCHR4usCZ08exGzMOfTd/8lhNL3qj4jYkjVlKDqEZhAGiWsz8zfpWSmGJfOLgoQ==", "dev": true, "license": "MIT", "workspaces": [ From 0da1990f05febde0aff5fa071d35d8f6d14fb1e8 Mon Sep 17 00:00:00 2001 From: Daniel O'Grady <103028279+daogrady@users.noreply.github.com> Date: Thu, 7 May 2026 15:31:46 +0200 Subject: [PATCH 021/156] Discourage `i18n.folders` config (#2559) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Discourage users from changing the `cds.i18n.folders` configuration, which lead to frequent confusion among users and often did not match their expectations/ lead to bugs. --------- Co-authored-by: René Jeglinsky --- node.js/cds-i18n.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node.js/cds-i18n.md b/node.js/cds-i18n.md index 1965160183..3d1f8e0845 100644 --- a/node.js/cds-i18n.md +++ b/node.js/cds-i18n.md @@ -655,9 +655,9 @@ cds.env.i18n = { | `cds.i18n.folders` | An array of (relative) folder names that will be appended to the source directories in a cross-product fashion of the default `cds.model` when fetching for existing i18n [`folders`](#folders).
*Default:* `["_i18n","i18n"]` | | `cds.i18n.default_language` | The locale used for [default translations](#defaults).
*Default:* `"en"` | -::: danger +::: danger Do not switch defaults without proper evaluation -Changing these configurations does not only affect your usage of your i18n bundles, but also all bundles provided by reuse packages you might use, including the ones provided by the CAP framework itself, such as the labels for the `@sap/cds/common` types, or the default messages used by the Node.js runtime. +Changing these configurations does not only affect your usage of your i18n bundles, but also all bundles provided by reuse packages you might use, including the ones provided by the CAP framework itself, such as the labels for the `@sap/cds/common` types, or the default messages used by the Node.js runtime. It is therefore highly recommended to leave this setting as is and adhere to the default name `_i18n` for your i18n directory. ::: From e5466ca49ff3c35181a68830997afb24852478e8 Mon Sep 17 00:00:00 2001 From: Matthias Schur <107557548+MattSchur@users.noreply.github.com> Date: Thu, 7 May 2026 16:40:25 +0200 Subject: [PATCH 022/156] Vector functions with local MTXS (#2553) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: René Jeglinsky Co-authored-by: Mahati Shankar <93712176+smahati@users.noreply.github.com> --- java/working-with-cql/query-api.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/working-with-cql/query-api.md b/java/working-with-cql/query-api.md index 926f2303c6..02261a8d75 100644 --- a/java/working-with-cql/query-api.md +++ b/java/working-with-cql/query-api.md @@ -1645,6 +1645,10 @@ Scalar functions are values that are calculated from other values. This calculat Vector functions allow you to compute similarity and distance of [vectors](../cds-data.md#vector-embeddings), as well as [vector embeddings](../../guides/databases/vector-embeddings) of text data directly in the database. +::: warning Not supported with local MTXS on SQLite +Using vector functions in [stored calculated elements](../../cds/cdl#on-write) with [local MTXS](../../guides/multitenancy/mtxs#test-drive-locally) on SQLite isn't supported. +::: + ##### Computing Vector Embeddings in SAP HANA CAP Java supports the [VECTOR_EMBEDDING](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-sql-reference-guide/vector-embedding-function-vector) function via `CQL.vectorEmbedding` to generate vector embeddings from text data directly in SAP HANA. From 2ab6ebe2f14d80833dcdece9675390cb5ae42939 Mon Sep 17 00:00:00 2001 From: Vitaly Kozyura <58591662+vkozyura@users.noreply.github.com> Date: Fri, 8 May 2026 13:24:00 +0200 Subject: [PATCH 023/156] Troubleshooting empty HDI if subscribed on Windows (#2550) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: René Jeglinsky --- get-started/get-help.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/get-started/get-help.md b/get-started/get-help.md index 0eec9b0a0e..2704d41c6e 100644 --- a/get-started/get-help.md +++ b/get-started/get-help.md @@ -283,6 +283,22 @@ npm add -D tar ``` On macOS and Linux, the built-in implementation continues to be used. +### How to fix "SqlError: invalid table name: Could not find table/view ..."? + +On Windows there's a known issue, where `cds build --production` may silently fail to create the _resources.tgz_ in the MTX sidecar build output. +After deployment and subscription, you can then notice the mentioned SqlError or similar error messages that point to tables/views not being available. + +:::warning The build log will incorrectly report the file as written. +::: + +To fix this on Windows, install the tar library: + +```sh +npm add -D tar +``` + +Even with this dependency added, on macOS and Linux the built-in implementation continues to be used. + ## Java From 4a96c2632f716f2366751fc3b9bc263e18aead44 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Mon, 11 May 2026 14:22:51 +0200 Subject: [PATCH 024/156] Auto-toggled code groups (#2538) Synchronize tab selections of certain code groups across pages and persist them locally. Known values: - Node.js / Java - macOS / Linux / Windows - Cloud Foundry / Kyma --------- Co-authored-by: Johannes Vogt --- .vitepress/config.js | 26 ++- .../restoreCodeGroupPreferences.js | 145 ++++++++++++++ .vitepress/lib/code-groups/shared.js | 156 +++++++++++++++ .../lib/code-groups/useCodeGroupSync.ts | 180 ++++++++++++++++++ .vitepress/theme/index.ts | 7 + 5 files changed, 505 insertions(+), 9 deletions(-) create mode 100644 .vitepress/lib/code-groups/restoreCodeGroupPreferences.js create mode 100644 .vitepress/lib/code-groups/shared.js create mode 100644 .vitepress/lib/code-groups/useCodeGroupSync.ts diff --git a/.vitepress/config.js b/.vitepress/config.js index 4b9b2d721d..4266e5873c 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -2,12 +2,18 @@ const base = process.env.GH_BASE || '/docs/' // Construct vitepress config object... -import path from 'node:path' +import { dirname, join, resolve } from 'node:path' +import { readFileSync } from 'node:fs' +import { fileURLToPath } from 'node:url' import { defineConfig } from 'vitepress' import playground from './lib/cds-playground/index.js' import languages from './languages' import { Menu } from './menu.js' +const __dirname = dirname(fileURLToPath(import.meta.url)) +const codeGrSharedScript = readFileSync(resolve(__dirname, './lib/code-groups/shared.js'),'utf-8').replace(/^export\s+/gm, '') +const codeGrRestoreScript = readFileSync(resolve(__dirname, './lib/code-groups/restoreCodeGroupPreferences.js'),'utf-8').replace('__CODE_GROUP_SHARED__', codeGrSharedScript) + const config = defineConfig({ title: 'capire', @@ -77,7 +83,9 @@ const config = defineConfig({ ['link', { rel: 'shortcut icon', href: base+'favicon.ico' }], ['link', { rel: 'apple-touch-icon', sizes: '180x180', href: base+'logos/cap.png' }], // Inline script to restore impl-variant selection immediately (before first paint) - ['script', { id: 'check-impl-variant' }, `{const p=new URLSearchParams(location.search),v=p.get('impl-variant')||localStorage.getItem('impl-variant');if(v)document.documentElement.classList.add(v)}`] + ['script', { id: 'check-impl-variant' }, `{const p=new URLSearchParams(location.search),v=p.get('impl-variant')||localStorage.getItem('impl-variant');if(v)document.documentElement.classList.add(v)}`], + // Inline script to restore code group tab preferences (before Vue hydration) + ['script', {}, codeGrRestoreScript] ], vite: { @@ -113,7 +121,7 @@ import rewrites from './rewrites' config.rewrites = rewrites // Read menu from local menu.md, but only if we run standalone, not embeded as @external -if (process.cwd() === path.dirname(__dirname)) { +if (process.cwd() === dirname(__dirname)) { const menu = await Menu.from ('./menu.md', rewrites) config.themeConfig.sidebar = menu.items config.themeConfig.nav = menu.navbar @@ -140,8 +148,8 @@ if (process.env.VITE_CAPIRE_PREVIEW) { // Add link to survey if (process.env.NODE_ENV !== 'production') { // open in VS Code - const home = path.resolve(__dirname, '..') - let href = 'vscode://' + path.join('file', home, encodeURIComponent('${filePath}')).replaceAll(/\\/g, '/').replace('@external/', '') + const home = resolve(__dirname, '..') + let href = 'vscode://' + join('file', home, encodeURIComponent('${filePath}')).replaceAll(/\\/g, '/').replace('@external/', '') config.themeConfig.capire.gotoLinks.push({ href, key: 'o', name: 'VS Code' }) } @@ -219,13 +227,13 @@ import { promises as fs } from 'node:fs' import * as cdsMavenSite from './lib/cds-maven-site' config.buildEnd = async ({ outDir, site }) => { const sitemapURL = new URL(config.themeConfig.capire.siteURL.href) - sitemapURL.pathname = path.join(sitemapURL.pathname, 'sitemap.xml') + sitemapURL.pathname = join(sitemapURL.pathname, 'sitemap.xml') console.debug('✓ writing robots.txt with sitemap URL', sitemapURL.href) // eslint-disable-line no-console - const robots = (await fs.readFile(path.resolve(__dirname, 'robots.txt'))).toString().replace('{{SITEMAP}}', sitemapURL.href) - await fs.writeFile(path.join(outDir, 'robots.txt'), robots) + const robots = (await fs.readFile(resolve(__dirname, 'robots.txt'))).toString().replace('{{SITEMAP}}', sitemapURL.href) + await fs.writeFile(join(outDir, 'robots.txt'), robots) // disabled by default to avoid online fetches during local build if (process.env.VITE_CAPIRE_EXTRA_ASSETS) { - await cdsMavenSite.copySiteAssets(path.join(outDir, 'java/assets/cds-maven-plugin-site'), site) + await cdsMavenSite.copySiteAssets(join(outDir, 'java/assets/cds-maven-plugin-site'), site) } } diff --git a/.vitepress/lib/code-groups/restoreCodeGroupPreferences.js b/.vitepress/lib/code-groups/restoreCodeGroupPreferences.js new file mode 100644 index 0000000000..1268e3823b --- /dev/null +++ b/.vitepress/lib/code-groups/restoreCodeGroupPreferences.js @@ -0,0 +1,145 @@ +;(() => { + // Code Group Tab Synchronization - Early Execution Script + // This script loads preferences and applies them before Vue hydration to prevent flicker + // + // Features: + // - Syncs tabs with exact or fuzzy matching ("/" delimiter) + // - "macOS/Linux" matches "macOS/Linux", "macOS", and "Linux" + // - "macOS" matches "macOS" and "macOS/Linux" + // - Stores preferences by independent dimensions (runtime vs OS) + // - runtime: Node.js ↔ Java + // - os: macOS ↔ Windows ↔ Linux (+ combinations) + // - Storage format: { "runtime": "Java", "os": "macOS" } + // - First entry in each dimension array is the default + + // eslint-disable-next-line no-undef + __CODE_GROUP_SHARED__ + + // Clean up old localStorage entries from previous implementation + const cleanupOldEntries = () => { + try { + const keysToRemove = [] + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i) + if (key && (key.startsWith('code-group-preference:') || key.startsWith('code-group-tab:'))) { + keysToRemove.push(key) + } + } + keysToRemove.forEach(key => localStorage.removeItem(key)) + } catch { + // localStorage might not be available + } + } + + cleanupOldEntries() + + const activeTabs = getActiveTabsByDimension() // eslint-disable-line no-undef + window.__CODE_GROUP_ACTIVE_TABS__ = activeTabs + + const applyToCodeGroup = (element) => { + const tabElements = element.querySelectorAll('.tabs label') + const tabs = Array.from(tabElements).map((label) => + (label.textContent || '').trim() + ).filter(Boolean) + + if (tabs.length === 0) return + + const selectedTab = getBestTab(tabs, activeTabs) // eslint-disable-line no-undef + const selectedIndex = tabs.indexOf(selectedTab) + + if (selectedIndex === -1) return + + setActiveTab(element, selectedIndex) // eslint-disable-line no-undef + } + + const getScrollOffset = () => 134 + + const scrollToHash = (hash) => { + try { + const target = document.getElementById(decodeURIComponent(hash).slice(1)) + if (target) { + const targetPadding = parseInt(window.getComputedStyle(target).paddingTop, 10) + const targetTop = window.scrollY + + target.getBoundingClientRect().top - + getScrollOffset() + + targetPadding + + window.scrollTo(0, targetTop) + } + } catch { /* ignore invalid hash */ } + } + + const applyToAllCodeGroups = () => { + const codeGroups = document.querySelectorAll('.vp-code-group') + codeGroups.forEach(applyToCodeGroup) + + return codeGroups.length + } + + const initialHash = window.location.hash + let hashScrollPending = false + + if (initialHash) { + history.replaceState(null, '', window.location.pathname + window.location.search) + hashScrollPending = true + } + + const restoreHashScroll = () => { + if (hashScrollPending) { + history.replaceState(null, '', window.location.pathname + window.location.search + initialHash) + requestAnimationFrame(() => { + scrollToHash(initialHash) + hashScrollPending = false + }) + } + } + + const initialCodeGroupCount = applyToAllCodeGroups() + + if (initialCodeGroupCount > 0) restoreHashScroll() + + let observer + const stopObserving = () => { + observer?.disconnect() + observer = null + } + + if (document.readyState === 'loading' || hashScrollPending) { + observer = new MutationObserver((mutations) => { + for (const mutation of mutations) { + for (const node of mutation.addedNodes) { + if (node instanceof HTMLElement) { + if (node.classList?.contains('vp-code-group')) { + applyToCodeGroup(node) + restoreHashScroll() + } else if (node.querySelector) { + const codeGroups = node.querySelectorAll('.vp-code-group') + codeGroups.forEach(applyToCodeGroup) + + if (codeGroups.length > 0) { + restoreHashScroll() + } + } + } + } + } + }) + + if (document.documentElement) { + observer.observe(document.documentElement, { + childList: true, + subtree: true + }) + } + } + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => { + applyToAllCodeGroups() + restoreHashScroll() + stopObserving() + }) + } else if (!hashScrollPending) { + stopObserving() + } +})() \ No newline at end of file diff --git a/.vitepress/lib/code-groups/shared.js b/.vitepress/lib/code-groups/shared.js new file mode 100644 index 0000000000..c8d734c105 --- /dev/null +++ b/.vitepress/lib/code-groups/shared.js @@ -0,0 +1,156 @@ +/** + * Shared helpers for code-group preference matching and activation. + */ + +export const STORAGE_KEY = 'code-group-active-tabs' + +export const TAB_DIMENSIONS = { + runtime: ['Node.js', 'Java'], + os: ['macOS', 'Windows', 'Linux'], + 'cloud-runtime': ['Cloud Foundry', 'Kyma'] +} + +/** + * @param {unknown} value + * @returns {value is Record} + */ +export function isTabMap(value) { + return Boolean(value) && typeof value === 'object' && !Array.isArray(value) +} + +/** + * @param {string} tab1 + * @param {string} tab2 + */ +export function tabsMatch(tab1, tab2) { + if (tab1 === tab2) return true + + const normalized1 = tab1.trim().toLowerCase() + const normalized2 = tab2.trim().toLowerCase() + + if (normalized1 && normalized2 && (normalized1.includes(normalized2) || normalized2.includes(normalized1))) { + return true + } + + const components1 = tab1.split('/').map(s => s.trim()) + const components2 = tab2.split('/').map(s => s.trim()) + + return components1.some(c1 => components2.includes(c1)) || + components2.some(c2 => components1.includes(c2)) +} + +/** + * @param {string} tabLabel + * @returns {string | null} + */ +export function getTabDimension(tabLabel) { + for (const [dimension, tabs] of Object.entries(TAB_DIMENSIONS)) { + for (const dimTab of tabs) { + if (tabsMatch(tabLabel, dimTab)) { + return dimension + } + } + } + + return null +} + +/** + * @param {Record | undefined} [seedTabs] + * @returns {Record} + */ +export function getActiveTabsByDimension(seedTabs) { + const activeTabs = {} + + if (isTabMap(seedTabs)) { + Object.assign(activeTabs, seedTabs) + } + + try { + const stored = localStorage.getItem(STORAGE_KEY) + if (stored) { + const parsed = JSON.parse(stored) + if (Array.isArray(parsed)) { + return activeTabs + } + if (isTabMap(parsed)) { + Object.assign(activeTabs, parsed) + } + } + } catch { + // localStorage might not be available or JSON parsing failed + } + + return activeTabs +} + +/** + * @param {Record} activeTabs + */ +export function saveActiveTabsByDimension(activeTabs) { + try { + localStorage.setItem(STORAGE_KEY, JSON.stringify(activeTabs)) + } catch { + // localStorage might not be available + } +} + +/** + * @param {string} tabLabel + */ +export function addActiveTab(tabLabel) { + const activeTabs = getActiveTabsByDimension() + const dimension = getTabDimension(tabLabel) + + if (dimension) { + activeTabs[dimension] = tabLabel + saveActiveTabsByDimension(activeTabs) + } + + return activeTabs +} + +/** + * @param {string[]} tabs + * @param {Record} [activeTabs] + */ +export function getBestTab(tabs, activeTabs = getActiveTabsByDimension()) { + for (const tab of tabs) { + const dimension = getTabDimension(tab) + if (dimension && activeTabs[dimension]) { + const activeTab = activeTabs[dimension] + if (tab === activeTab || tabsMatch(tab, activeTab)) { + return tab + } + } + } + + for (const tab of tabs) { + const dimension = getTabDimension(tab) + if (dimension && TAB_DIMENSIONS[dimension]) { + const defaultTab = TAB_DIMENSIONS[dimension][0] + if (tab === defaultTab || tabsMatch(tab, defaultTab)) { + return tab + } + } + } + + return tabs[0] +} + +/** + * @param {HTMLElement} element + * @param {number} activeIndex + */ +export function setActiveTab(element, activeIndex) { + const inputs = element.querySelectorAll('.tabs input') + const blocks = element.querySelectorAll('div[class*="language-"], .vp-block') + + inputs.forEach((input, index) => { + input.checked = index === activeIndex + }) + + blocks.forEach((block, index) => { + block.classList.toggle('active', index === activeIndex) + }) +} \ No newline at end of file diff --git a/.vitepress/lib/code-groups/useCodeGroupSync.ts b/.vitepress/lib/code-groups/useCodeGroupSync.ts new file mode 100644 index 0000000000..8efdbbd3c7 --- /dev/null +++ b/.vitepress/lib/code-groups/useCodeGroupSync.ts @@ -0,0 +1,180 @@ +/** + * Code Group Tab Synchronization Composable + * + * Manages tab preferences for VitePress code groups: + * - Synchronizes tab selection across all code groups with exact or fuzzy matching + * - Fuzzy matching treats "/" as delimiter: "macOS/Linux" matches both "macOS" and "Linux" + * - Stores preferences by independent dimensions (runtime vs OS) + * - Selecting a tab only updates its own dimension in persistent storage + */ + +import { + addActiveTab, + getActiveTabsByDimension, + getBestTab, + setActiveTab, + tabsMatch +} from './shared.js' + +interface CodeGroupInfo { + element: HTMLElement + tabs: string[] +} + +let hasClickListener = false +let codeGroupObserver: MutationObserver | null = null + +function findCodeGroups(): CodeGroupInfo[] { + const codeGroups: CodeGroupInfo[] = [] + const elements = document.querySelectorAll('.vp-code-group') + + elements.forEach((element) => { + const tabElements = element.querySelectorAll('.tabs label') + const tabs = Array.from(tabElements).map((label) => + (label.textContent || '').trim() + ).filter(Boolean) + + if (tabs.length > 0) { + codeGroups.push({ + element: element as HTMLElement, + tabs + }) + } + }) + + return codeGroups +} + +function applyPreference(codeGroup: CodeGroupInfo): void { + const { element, tabs } = codeGroup + const selectedTab = getBestTab( + tabs, + getActiveTabsByDimension((window as any).__CODE_GROUP_ACTIVE_TABS__) + ) + const selectedIndex = tabs.indexOf(selectedTab) + + if (selectedIndex !== -1) { + setActiveTab(element, selectedIndex) + } +} + +function syncTabs(selectedTab: string): void { + const codeGroups = findCodeGroups() + + codeGroups.forEach((codeGroup) => { + const matchingTab = codeGroup.tabs.find(tab => tabsMatch(tab, selectedTab)) + + if (matchingTab) { + const { element, tabs } = codeGroup + const tabIndex = tabs.indexOf(matchingTab) + + if (tabIndex !== -1) { + setActiveTab(element, tabIndex) + } + } + }) + + ;(window as any).__CODE_GROUP_ACTIVE_TABS__ = addActiveTab(selectedTab) +} + +function handleDocumentClick(event: Event): void { + const target = event.target as HTMLElement | null + const label = target?.closest('.vp-code-group .tabs label') as HTMLLabelElement | null + if (!label) return + + const codeGroup = target?.closest('.vp-code-group') as HTMLElement | null + if (!codeGroup) return + + const tabLabel = (label.textContent || '').trim() + if (!tabLabel) return + + const clickedRect = label.getBoundingClientRect() + + syncTabs(tabLabel) + + requestAnimationFrame(() => { + const newRect = label.getBoundingClientRect() + const scrollDelta = newRect.top - clickedRect.top + + if (scrollDelta !== 0) { + window.scrollTo({ + top: (window.pageYOffset || document.documentElement.scrollTop) + scrollDelta, + behavior: 'instant' + }) + } + }) +} + +function ensureClickListener(enabled: boolean): void { + if (enabled && !hasClickListener) { + document.addEventListener('click', handleDocumentClick) + hasClickListener = true + return + } + + if (!enabled && hasClickListener) { + document.removeEventListener('click', handleDocumentClick) + hasClickListener = false + } +} + +function startObservingCodeGroups(): void { + if (codeGroupObserver || !document.body) return + + codeGroupObserver = new MutationObserver((mutations) => { + let shouldReapply = false + + for (const mutation of mutations) { + if (mutation.addedNodes.length === 0) continue + + for (const node of mutation.addedNodes) { + if (node instanceof HTMLElement && + (node.classList?.contains('vp-code-group') || node.querySelector?.('.vp-code-group'))) { + shouldReapply = true + break + } + } + + if (shouldReapply) break + } + + if (shouldReapply) { + reinitCodeGroupSync() + } + }) + + codeGroupObserver.observe(document.body, { + childList: true, + subtree: true + }) +} + +function initCodeGroupSync(): void { + startObservingCodeGroups() + + const codeGroups = findCodeGroups() + codeGroups.forEach(applyPreference) + ensureClickListener(codeGroups.length > 0) +} + +function reinitCodeGroupSync(): void { + const codeGroups = findCodeGroups() + codeGroups.forEach(applyPreference) + ensureClickListener(codeGroups.length > 0) +} + +export function setupCodeGroupSync(): void { + if (typeof window === 'undefined') return + + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => initCodeGroupSync(), { once: true }) + } else { + initCodeGroupSync() + } +} + +export function onRouteChange(): void { + if (typeof window !== 'undefined') { + setTimeout(() => { reinitCodeGroupSync() }, 0) + } +} \ No newline at end of file diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts index 18433e6ad3..3e04212ca9 100644 --- a/.vitepress/theme/index.ts +++ b/.vitepress/theme/index.ts @@ -12,6 +12,7 @@ import Since from './components/Since.vue'; import UnderConstruction from './components/UnderConstruction.vue'; import CfgInspect from './components/ConfigInspect.vue'; import TwoslashFloatingVue from '@shikijs/vitepress-twoslash/client' +import { setupCodeGroupSync, onRouteChange } from '../lib/code-groups/useCodeGroupSync' import '@shikijs/vitepress-twoslash/style.css' import './styles.scss' @@ -36,5 +37,11 @@ export default { ctx.app.component('Since', Since) ctx.app.component('UnderConstruction', UnderConstruction) ctx.app.use(TwoslashFloatingVue) + + // Setup code group tab synchronization + setupCodeGroupSync() + + // Reinitialize on route changes (SPA navigation) + ctx.router.onAfterRouteChange = () => onRouteChange() } } \ No newline at end of file From 27b7a766b425741b77b88eb0118b878a8e4259ba Mon Sep 17 00:00:00 2001 From: Robin Date: Tue, 12 May 2026 10:51:02 +0200 Subject: [PATCH 025/156] fix(java): update OpenRewrite recipe namespaces to com.sap.cds.services.migrations (#2561) ## Summary - Updates all `com.sap.cds.services.recipes.*` recipe name references in `java/migration.md` to `com.sap.cds.services.migrations.*` - Aligns with the namespace consolidation in `cds-services-recipes` (commit `1cc8c93276`), which moved all Java classes and YAML recipe names from `.recipes` to `.migrations` ## Test plan - [ ] Verify the recipe names in the CLI example, prose, table description, and table entries all use the `com.sap.cds.services.migrations` namespace --- java/migration.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/java/migration.md b/java/migration.md index 56064f85ec..7d6b4d281d 100644 --- a/java/migration.md +++ b/java/migration.md @@ -37,21 +37,21 @@ As migration is a one-time operation, run the OpenRewrite `recipes` as a command ```bash-vue mvn org.openrewrite.maven:rewrite-maven-plugin:run \ -Drewrite.recipeArtifactCoordinates=com.sap.cds:cds-services-recipes:{{ versions.java_services }} \ - -Drewrite.activeRecipes=com.sap.cds.services.recipes.Cap_4.9 + -Drewrite.activeRecipes=com.sap.cds.services.migrations.Cap_4.9 ``` -Here, the *recipe* `com.sap.cds.services.recipes.Cap_4.9` from CAP Java's OpenRewrite Maven artifact `com.sap.cds:cds-services-recipes` is called in the given project context. The *recipe* is a container for one or more recipes. A recipe is a rule that tells OpenRewrite how to transform code. +Here, the *recipe* `com.sap.cds.services.migrations.Cap_4.9` from CAP Java's OpenRewrite Maven artifact `com.sap.cds:cds-services-recipes` is called in the given project context. The *recipe* is a container for one or more recipes. A recipe is a rule that tells OpenRewrite how to transform code. ### Currently Released CAP Java Migrations -The following table lists the individual recipes provided by CAP for APIs that have been deprecated and are subject for removal. Besides these fine grained recipes, course grained recipes might be provided per release (e.g. `com.sap.cds.services.recipes.Cap_4.9`). These type of recipes include all recipes for APIs deprecated in this AND previous releases. Consequently, it is sufficient to execute the latest recipe matching the version of the CAP Java SDK you are upgrading to. +The following table lists the individual recipes provided by CAP for APIs that have been deprecated and are subject for removal. Besides these fine grained recipes, course grained recipes might be provided per release (e.g. `com.sap.cds.services.migrations.Cap_4.9`). These type of recipes include all recipes for APIs deprecated in this AND previous releases. Consequently, it is sufficient to execute the latest recipe matching the version of the CAP Java SDK you are upgrading to. |Name |Description|Available since| |--------|-----------|---------------| |[com.sap.cds.services.migrations.MigrateStatements](../releases/2025/aug25#typed-query-results)|Migrates CQN statements to comply with typed Query API changes in 4.3.0.|4.3.0| |[com.sap.cds.services.migrations.ServiceExceptionUtils](#removed-java-apis-4-to-5)|Replaces deprecated methods in `ServiceExceptionUtils`.|4.9.0| |[com.sap.cds.services.migrations.MigrateSaasRegistryDependency](#removed-java-apis-4-to-5)|Replaces deprecated `SaasRegistryDependency` methods `setAppId`/`setAppName`/`getAppId`/`getAppName` with their `xsappname`-based replacements.|4.9.0| -|[com.sap.cds.services.recipes.UclMigration](#removed-java-apis-4-to-5)|Migrates deprecated UCL result getter and setter methods to the new API.|4.9.0| +|[com.sap.cds.services.migrations.UclMigration](#removed-java-apis-4-to-5)|Migrates deprecated UCL result getter and setter methods to the new API.|4.9.0| ## CAP Java 4.9 to CAP Java 5.0 (TBA) { #four-to-five } From bcce364363c55c45b0d3e34f912ea2faf09dafb9 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Tue, 12 May 2026 13:48:35 +0200 Subject: [PATCH 026/156] Use latest versions for ESLint playground --- tools/cds-lint/rules/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/cds-lint/rules/package.json b/tools/cds-lint/rules/package.json index 4da85e4e9a..7ebb3171de 100644 --- a/tools/cds-lint/rules/package.json +++ b/tools/cds-lint/rules/package.json @@ -3,10 +3,10 @@ "version": "1.0.0", "type": "module", "dependencies": { - "@sap/cds": "^9" + "@sap/cds": "latest" }, "devDependencies": { - "@sap/eslint-plugin-cds": "^4", - "eslint": "^9" + "@sap/eslint-plugin-cds": "latest", + "eslint": "latest" } } \ No newline at end of file From 047453877a490ef621b01a6a425a0778e73f92e2 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Wed, 13 May 2026 08:31:52 +0200 Subject: [PATCH 027/156] Updated fiori draft docs --- .vitepress/theme/code.scss | 5 +- guides/uis/fiori-draft.drawio.svg | 4 + guides/uis/fiori.md | 928 +++++++++++------------------- node.js/fiori.md | 51 +- 4 files changed, 366 insertions(+), 622 deletions(-) create mode 100644 guides/uis/fiori-draft.drawio.svg diff --git a/.vitepress/theme/code.scss b/.vitepress/theme/code.scss index 20fce2e416..6ca9d796c3 100644 --- a/.vitepress/theme/code.scss +++ b/.vitepress/theme/code.scss @@ -1,6 +1,9 @@ main .vp-doc { + div.vp-code-group .tabs label { + line-height: 40px; + } div.vp-code-group + div[class*='language-'] { margin-top: -8px !important; // override code group margin } @@ -11,7 +14,7 @@ main .vp-doc { pre { padding: 12px 0 !important; - code { + code { padding: 0 22px !important; } } diff --git a/guides/uis/fiori-draft.drawio.svg b/guides/uis/fiori-draft.drawio.svg new file mode 100644 index 0000000000..a672c74dc6 --- /dev/null +++ b/guides/uis/fiori-draft.drawio.svg @@ -0,0 +1,4 @@ + + + +
 EDIT 
 EDIT 
Active
Entity
Active...
Draft
Entity
Draft...
NEW  
NEW  
SAVE
SAVE
DISCARD  
DISCARD  
PATCH
PATCH
X
X
Text is not SVG - cannot display
\ No newline at end of file diff --git a/guides/uis/fiori.md b/guides/uis/fiori.md index df05962d96..dab1241ec9 100644 --- a/guides/uis/fiori.md +++ b/guides/uis/fiori.md @@ -1,6 +1,3 @@ ---- - ---- # Serving SAP Fiori UIs @@ -13,20 +10,17 @@ CAP provides out-of-the-box support for SAP Fiori elements. This guide explains -## SAP Fiori Preview - -For entities exposed via OData V4 there is a _Fiori preview_ link on the index page. It dynamically serves an SAP Fiori elements list page that allows you to quickly see the effect of annotation changes without having to create a UI application first. - -::: details Be aware that this is **not meant for production**. +## Getting Started -The preview is not meant as a replacement for a proper SAP Fiori elements (UI5) application. +### Using Fiori Previews -It's active by default, but disabled automatically in production. To also enable it in cloud deployments, for test or demo purposes maybe, set cds.fiori.preview:true for Node.js apps, or cds.index-page.enabled:true for Java. +For entities exposed via OData V4 there is a _Fiori preview_ link on the index page. It dynamically serves an SAP Fiori elements list page that allows you to quickly see the effect of annotation changes without having to create a UI application first. -::: +> [!important] Not for production +> The preview is meant for quick tests and iterations during development, but not for production use, and hence automatically disabled in production. To also enable it in cloud deployments, for test or demo purposes maybe, set cds.fiori.preview:true for Node.js apps, or cds.index-page.enabled:true for Java -## Adding Fiori Apps +### Adding Fiori Apps As showcased in [cap/samples](https://github.com/capire/bookstore/tree/main/app), SAP Fiori apps should be added as sub folders to the `app/` of a CAP project. Each sub folder constitutes an individual SAP Fiori application, with [local annotations](#fiori-annotations), _manifest.json_, etc. So, a typical folder layout would look like this: @@ -45,33 +39,31 @@ As showcased in [cap/samples](https://github.com/capire/bookstore/tree/main/app) Links to Fiori applications created in the `app/` folder are automatically added to the index page of your CAP application for local development. ::: -### Using SAP Fiori Tools +### SAP Fiori Tools The SAP Fiori tools provide advanced support for [adding SAP Fiori apps](https://help.sap.com/docs/SAP_FIORI_tools/17d50220bcd848aa854c9c182d65b699/db44d45051794d778f1dd50def0fa267.html) to existing CAP projects as well as a wealth of productivity tools, for example for adding SAP Fiori annotations, or graphical modeling and editing. They can be used locally in [Visual Studio Code (VS Code)](https://marketplace.visualstudio.com/items?itemName=SAPSE.sap-ux-fiori-tools-extension-pack) or in [SAP Business Application Studio](https://help.sap.com/docs/SAP_FIORI_tools/17d50220bcd848aa854c9c182d65b699/b0110400b44748d7b844bb5977a657fa.html). -### Using [`cds add`](../../tools/cds-cli#sample) +### OData Annotations Plugin -Use `cds add sample` to add Fiori sample code to an existing project, or create a new Node.js project with `cds init --nodejs --add sample`. To create a Java project use `cds init --java --add sample`. +The [SAP CDS language support plugin](https://marketplace.visualstudio.com/items?itemName=SAPSE.vscode-cds) includes a plugin. It helps you adding and editing OData annotations in CDS syntax in VS Code by providing the following features: +- Code completion +- Validation against the OData vocabularies and project metadata +- Navigation to the referenced annotations +- Quick view of vocabulary information +- Internationalization support -### From [Capire Samples](https://github.com/capire) - -For example, you can copy the [SAP Fiori apps from capire/bookshop](https://github.com/capire/bookstore/tree/main/app) as a template and modify the content as appropriate. +These assisting features are provided for [OData annotations in CDS syntax](../protocols/odata#annotations) and can't be used yet for the [core data services common annotations](../../cds/annotations). +The [@sap/ux-cds-odata-language-server-extension](https://www.npmjs.com/package/@sap/ux-cds-odata-language-server-extension) module doesn't require any manual installation. The latest version is fetched by default from [npmjs.com](https://npmjs.com) as indicated in the user preference setting **CDS > Contributions: Registry**. -### From [Incidents Sample](https://github.com/SAP-samples/fiori-elements-incident-management/tree/sampleSolution) +[Learn more about the **CDS extension for VS Code**.](https://www.youtube.com/watch?v=eY7BTzch8w0){.learn-more} -This is a sample to create an incident management app with SAP Fiori elements for OData V4. ## Fiori Annotations -The main content to add is service definitions annotated with information about how to render respective data. - - -### What Are SAP Fiori Annotations? - SAP Fiori elements apps are generic front ends, which construct and render the pages and controls based on annotated metadata documents. The annotations provide semantic annotations used to render such content, for example: @@ -117,203 +109,6 @@ While CDS in principle allows you to add such annotations everywhere in your mod **Reasoning:** This recommendation essentially follows the best practices and guiding principles of [Conceptual Modeling](../domain/index#domain-driven-design) and [Separation of Concerns](../domain/index#separation-of-concerns). -### Maintaining Annotations - -Maintaining OData annotations in _.cds_ files is accelerated by the SAP Fiori tools - CDS OData Language Server [@sap/ux-cds-odata-language-server-extension](https://www.npmjs.com/package/@sap/ux-cds-odata-language-server-extension) in the [SAP CDS language support plugin](https://marketplace.visualstudio.com/items?itemName=SAPSE.vscode-cds). It helps you add and edit OData annotations in CDS syntax with: - -- Code completion -- Validation against the OData vocabularies and project metadata -- Navigation to the referenced annotations -- Quick view of vocabulary information -- Internationalization support - -These assisting features are provided for [OData annotations in CDS syntax](../protocols/odata#annotations) and can't be used yet for the [core data services common annotations](../../cds/annotations). - -The [@sap/ux-cds-odata-language-server-extension](https://www.npmjs.com/package/@sap/ux-cds-odata-language-server-extension) module doesn't require any manual installation. The latest version is fetched by default from [npmjs.com](https://npmjs.com) as indicated in the user preference setting **CDS > Contributions: Registry**. - -[Learn more about the **CDS extension for VS Code**.](https://www.youtube.com/watch?v=eY7BTzch8w0){.learn-more} - -### Code Completion - -The CDS OData Language Server provides a list of context-sensitive suggestions based on the service metadata and OData vocabularies. You can use it to choose OData annotation terms, their properties, and values from the list of suggestions in annotate directives applied to service entities and entity elements. See [annotate directives](../../cds/cdl#annotate) for more details. - - -#### Using Code Completion - -To trigger code completion, choose CtrlSpace. The list of suggested values is displayed. - -> Note: You can filter the list of suggested values by typing more characters. - -Navigate to the desired value using the up or down arrows or your mouse. Accept the highlighted value by pressing Enter or by clicking the mouse. -Use code completion to add and change individual values (word-based completion) and to add small code blocks containing annotation structures along with mandatory properties (micro-snippets). In an active code snippet, you can use the (tab) key to quickly move to the next tab stop. - - -##### Example: Annotating Service Entities - - \(cursor position indicated by `|`\) - -1. Place cursor in the `annotate` directive for a service entity, for example `annotate Foo.Bar with ;` and trigger code completion. - -2. Type `u` to filter the suggestions and choose `{} UI`. Micro-snippet `@UI : {|}` is inserted: `annotate Foo.Bar with @UI : {|};` - -3. Use code completion again to add an annotation term from the UI vocabulary, in this example `SelectionFields`. The micro snippet for this annotation is added and the cursor is placed directly after the term name letting you define a qualifier: `annotate Foo.Bar with @UI : {SelectionFields | : []};` - -4. Press the (tab) key to move the cursor to the next tab stop and use code completion again to add values. Because the `UI.SelectionFields` annotation is a collection of entity elements \(entity properties\), all elements of the annotated entity are suggested. - - ::: tip - To choose an element of an associated entity, first select the corresponding association from the list and type *. \(period\)*. Elements of associated entity are suggested. - - Note: You can add multiple values separated by comma. - ::: - - ```cds - annotate Foo.Bar with @UI : { SelectionFields : [ - description, assignedIndividual.lastName| - ], - }; - ``` - -5. Add a new line after `,` (comma) and use code completion again to add another annotation from the UI vocabulary, such as `LineItem`. Line item is a collection of `DataField` records. To add a record, select the record type you need from the completion list. - - - ```cds - annotate Foo.Bar with @UI : { - SelectionFields : [ - description, assignedIndividual.lastName - ], - LineItem : [{ - $Type:'UI.DataField', - Value : |, - }, - }; - ``` - - > Note: For each record type, two kinds of micro-snippets are provided: one containing only mandatory properties and one containing all properties defined for this record \(full record\). Usually you need just a subset of properties. So, you either select a full record and then remove the properties you don't need, or add the record containing only required properties and then add the remaining properties. - -6. Use code completion to add values for the annotation properties. - - - ```cds - annotate Foo.Bar with @UI : { - SelectionFields : [ - description, assignedIndividual.lastName - ], - LineItem : [ - { - $Type:'UI.DataField', - Value : description, - }, - { - $Type:'UI.DataFieldForAnnotation', - Target : 'assignedIndividual/@Communication.Contact', - },| - ] - }; - ``` - - > Note: To add values pointing to annotations defined in another CDS source, you must reference this source with the `using` directive. See [The `using` Directive](../../cds/cdl#using) for more details. - - -##### Example: Annotating Entity Elements - - \(cursor position indicated by `|`\) - -1. Place the cursor in the `annotate` directive, for example `annotate Foo.Bar with {|};`, add a new line and trigger code completion. You get the list of entity elements. Choose the one that you want to annotate. - - ```cds - annotate Foo.Bar with { - code| - }; - ``` - -2. Press the key, use code completion again, and choose `{} UI`. The `@UI : {|}` micro-snippet is inserted: - - ```cds - annotate Foo.Bar with { - code @UI : { | } - }; - ``` - -3. Trigger completion again and choose an annotation term from the UI vocabulary, in this example: **Hidden**. - - - ```cds - annotate Foo.Bar with { - code @UI : {Hidden : |} - }; - ``` - -4. Press the (tab) key to move the cursor to the next tab stop and use code completion again to add the value. Because the `UI.Hidden` annotation is of Boolean type, the values true and false are suggested: - - - ```cds - annotate Foo.Bar with { - code @UI : {Hidden : false } - }; - ``` - -### Diagnostics - -The CDS OData Language Server validates OData annotations in _.cds_ files against the service metadata and OData vocabularies. It also checks provided string content for language-dependent annotation values and warns you if the format doesn't match the internationalization (i18n) key reference. It shows you that this string is hard coded and won't change based on the language setting in your application. See [Internationalization support](#internationalization-support) for more details. - -Validation is performed when you open a _.cds_ file and then is retriggered with each change to the relevant files. - -You can view the diagnostic messages by hovering over the highlighted part in the annotation file or by opening the problems panel. Click on the message in the problems panel to navigate to the related place in the annotation file. - -> Note: If an annotation value points to the annotation defined in another CDS source, you must reference this source with a `using` directive to avoid warnings. See [The `using` Directive](../../cds/cdl#using) for more details. - - -### Navigation to Referenced Annotations - -CDS OData Language Server enables quick navigation to the definition of referenced annotations. For example, if your annotation file contains a `DataFieldForAnnotation` record referencing an `Identification` annotation defined in the service file, you can view which file it's defined in and what fields or labels this annotation contains. You can even update the `Identification` annotation or add comments. - -You can navigate to the referenced annotation using the [Peek Definition](#peek-definition) and [Go To Definition](#go-to-definition) features. - -> Note: If the referenced annotation is defined in another CDS source, you must reference this source with the `using` directive to enable the navigation. See [The `using` Directive](../../cds/cdl#using) for more details. - - -#### Peek Definition { #peek-definition} - -Peek Definition lets you preview and update the referenced annotation without switching away from the code that you're writing. It's triggered when your cursor is inside the referenced annotation value. -- Using a keyboard: choose F12 (macOS) or AltF12 (other platforms) -- Using a mouse: right-click and select **Peek Definition** -If an annotation is defined in multiple sources, all these sources are listed. You can select which one you want to view or update. Annotation layering isn't considered. - - -#### Go to Definition { #go-to-definition} - -Go To Definition lets you navigate to the source of the referenced annotation and opens the source file scrolled to the respective place in a new tab. It's triggered when your cursor is inside the referenced annotation value. - -Place your cursor inside the path referencing the annotation term segment or translatable string value, and trigger Go to Definition: - -- Using a keyboard: choose F12 in VS Code, or CtrlF12 in SAP Business Application Studio -- Using a mouse: right-click and select **Go To Definition** -- Using a keyboard and mouse: + mouse click (macOS) or Ctrl + mouse click (other platforms) - -If an annotation is defined in multiple sources, a Peek definition listing these sources will be shown instead. Annotation layering isn't considered. - - -### Documentation \(Quick Info\) - -The annotation language server provides quick information for annotation terms, record types, and properties used in the annotation file, or provided as suggestions in code completion lists. This information is retrieved from the respective OData vocabularies and can provide answers to the following questions: - -- What is the type and purpose of the annotation term/record type/property? -- What targets can the annotation term apply to? -- Is the annotation term/record type/property experimental? Is it deprecated? -- Is this annotation property mandatory or optional? - -> Note: The exact content depends on the availability in OData vocabularies. - -To view the quick info for an annotation term, record type, or property used in the annotation file, hover your mouse over it. The accompanying documentation is displayed in a hover window, if provided in the respective OData vocabularies. - -To view the quick info for each suggestion in the code completion list, either pressing CtrlSpace, or click the *info* icon. The accompanying documentation for the suggestion expands to the side. The expanded documentation stays open and updates as you navigate the list. - - -#### Internationalization Support - -When you open an annotation file, all language-dependent string values are checked against the _i18n.properties_ file. Each value that doesn't represent a valid reference to the existing text key in the _i18n.properties_ file, is indicated with a warning. A Quick Fix action is suggested to generate a text key in i18n file and substitute your string value with the reference to that entry. - - ### Prefer `@title` and `@description` Influenced by the [JSON Schema](https://json-schema.org), CDS supports the [common annotations](../../cds/annotations#common-annotations) `@title` and `@description`, which are mapped to corresponding [OData annotations](../protocols/odata#annotations) as follows: @@ -360,483 +155,414 @@ entity Foo @(Capabilities:{ Similar recommendations apply to `@mandatory` and others → see [Common Annotations](../../cds/annotations#common-annotations). -## Draft Support -SAP Fiori supports edit sessions with draft states stored on the server, so users can interrupt and continue later on, possibly from different places and devices. CAP, as well as SAP Fiori elements, provide out-of-the-box support for drafts as outlined in the following sections. **We recommend to always use draft** when your application needs data input by end users. +## Simple Value Helps -[For details and guidelines, see **SAP Fiori Design Guidelines for Draft**.](https://experience.sap.com/fiori-design-web/draft-handling/){.learn-more} +In addition to supporting the standard `@Common.ValueList` annotations as defined in the [OData Vocabularies](../protocols/odata#annotations), CAP provides convenient support for Value Helps. -[Find a working end-to-end version in **capire/bookstore**.](https://github.com/capire/bookstore/tree/main/app){.learn-more} -[For details about the draft flow in SAP Fiori elements, see **SAP Fiori elements > Draft Handling**](https://ui5.sap.com/#/topic/ed9aa41c563a44b18701529c8327db4d){.learn-more} +### `@cds.odata.valuelist` - -### Enabling Draft with `@odata.draft.enabled` - -To enable draft for an entity exposed by a service, simply annotate it with `@odata.draft.enabled` as in this example: +Simply add the `@cds.odata.valuelist` annotation to an entity, and all managed associations targeting this entity will automatically receive Value Lists in SAP Fiori clients. For example: ```cds -annotate AdminService.Books with @odata.draft.enabled; +@cds.odata.valuelist +entity Currencies { key code ... } ``` - -[See it live in **capire/bookstore**.](https://github.com/capire/bookstore/blob/main/app/admin-books/fiori-service.cds#L79){.learn-more} - -::: warning -You can't project from draft-enabled entities, as annotations are propagated. Either _enable_ the draft for the projection and not the original entity or _disable_ the draft on the projection using `@odata.draft.enabled: null`. -::: - -### Difference between Compositions and Associations - -Be aware that you cannot modify _associated_ entities through drafts. Only _compositions_ will get a "Create" button in SAP Fiori elements UIs because they are stored as part of the same draft entity. - -### Enabling Draft for [Localized Data](./localized-data) {#draft-for-localized-data} - -Annotate the underlying base entity in the base model with `@fiori.draft.enabled` to also support drafts for [localized data](./localized-data): - ```cds -annotate sap.capire.bookshop.Books with @fiori.draft.enabled; +service BookshopService { + entity Books { //... + currency : Association to Currencies; + } +} ``` -:::info Background -SAP Fiori drafts required single keys of type `UUID`, which isn't the case by default for the automatically generated `_texts` entities (→ [see the _Localized Data_ guide for details](./localized-data#behind-the-scenes)). The `@fiori.draft.enabled` annotation tells the compiler to add such a technical primary key element named `ID_texts`. -::: - -::: warning -Adding the annotation `@fiori.draft.enabled` won't work if the corresponding `_texts` entities contain any entries, because existing entries don't have a value for the new key field `ID_texts`. -::: - -![An SAP Fiori UI showing how a book is edited in the bookshop sample and that the translations tab is used for non-standard languages.](draft-for-localized-data.png){style="margin:0"} - -[See it live in **capire/bookstore**.](https://github.com/capire/bookstore/blob/main/app/admin-books/fiori-service.cds#L78){.learn-more} +This would be expanded by the compiler to the following OData annotations, in the EDMX documents generated for Fiori clients: -If you're editing data in multiple languages, the _General_ tab in the example above is reserved for the default language (often "en"). Any change to other languages has to be done in the _Translations_ tab, where a corresponding language can be chosen [from a drop-down menu](https://github.com/capire/bookstore/blob/main/app/admin-books/fiori-service.cds#L104) as illustrated above. This also applies if you use the URL parameter `sap-language` on the draft page. +```xml + + + + + + + + + + + + + + + + + + + +``` -### Draft Choreography: How Draft Editing Works -With draft-enabled entities, changes are made to a draft copy instead of the active entity. The typical flow is: -- Create a draft -- Edit the draft -- Activate the draft +### `@sap/cds/common` -Below are example HTTP requests for each step: +[@sap/cds/common]: ../../cds/common -#### 1. Create a Draft -```http -POST /odata/v4/AdminService/Books -Content-Type: application/json +The reuse types in [@sap/cds/common] already have this added to base types and entities, so all uses automatically benefit from this. This is an effective excerpt of respective definitions in `@sap/cds/common`: -{} +```cds +type Currencies : Association to sap.common.Currencies; ``` - -#### 2. Edit the Draft -```http -PATCH /odata/v4/AdminService/Books(ID=a11fb6f1-36ab-46ec-b00c-d379031e817a,IsActiveEntity=false) -Content-Type: application/json - -{ - "title": "Book Title" +```cds +context sap.common { + entity Currencies : CodeList {...}; + entity CodeList { name : localized String; ... } } ``` - -#### 3. Activate the Draft -```http -POST /odata/v4/AdminService/Books(ID=a11fb6f1-36ab-46ec-b00c-d379031e817a,IsActiveEntity=false)/draftActivate -Content-Type: application/json - -{} +```cds +annotate sap.common.CodeList with @( + UI.Identification: [name], + cds.odata.valuelist, +); ``` -For more details, see the [official UI5 documentation](https://ui5.sap.com/#/topic/ed9aa41c563a44b18701529c8327db4d). - - -### Direct CRUD - -By default, all modifications to draft-enabled entities go through the [draft choreography](#draft-choreography-how-draft-editing-works), which is optimized for human users working with SAP Fiori UIs. -However, technical consumers — such as remote services or AI agents — typically need to create and update data directly, without the overhead of draft management. -Activating Direct CRUD with cds.fiori.direct_crud:true enables the best of both worlds: standard CRUD operations on active entities are restored, while the full draft feature set stays intact for SAP Fiori UIs. - -To achieve this, SAP Fiori Elements' default draft-creation behavior is redirected to a collection-bound action via the `@Common.DraftRoot.NewAction` annotation. -This frees up `POST` requests to create active instances directly — the same behavior as without draft enablement. - -#### Creating Active Instances Directly - -```http -POST /odata/v4/CatalogService/Books -Content-Type: application/json +In effect, usages of [@sap/cds/common] stay clean of any pollution, for example: -{ - "ID": 123, - "title": "How to be more active" +```cds +using { Currency } from '@sap/cds/common'; +entity Books { //... + currency : Currency; } ``` -In such direct requests, the additional key `IsActiveEntity` defaults to `true` in the body, which means you can omit it during a `CREATE`. - -#### Creating Draft Instances via Action +[Find this also in **capire/bookstore**.](https://github.com/capire/bookshop/blob/main/db/schema.cds){.learn-more} -```http -POST /odata/v4/CatalogService/Books/CatalogService.draftNew -Content-Type: application/json +With that, all UIs on all services exposing `Books` will automatically receive Value Help for currencies. You can also benefit from that when [deriving your project-specific code list entities from **sap.common.CodeList**](../../cds/common#adding-own-code-lists). -{} -``` -#### Updating Active Instances Directly -```http -PUT /odata/v4/CatalogService/Books(ID=123) -Content-Type: application/json +## Fiori Draft Support -{ - "title": "Updated title" -} -``` +SAP Fiori uses Drafts to enable users to save their progress while editing data and continue later on without losing changes. Drafts are stored on the server and can be accessed from different devices and locations, providing flexibility and convenience for users. CAP provides out-of-the-box support for drafts, making it easy to implement this functionality in your applications. -In CAP Node.js, the defaulting of `IsActiveEntity` described above extends to the URL as well. -That is, you can omit the key predicate `IsActiveEntity=true` from it. -In CAP Java, however, the additional key predicate `IsActiveEntity=true` must still be provided. -That is, in the example above, the `PUT` request would need to target `/odata/v4/CatalogService/Books(ID=123,IsActiveEntity=true)`. +> [!note] This documentation focuses on CAP only +> For general information on the user experience and the technical details of drafts in SAP Fiori, please consult respective SAP Fiori documentation, such as the [SAP Fiori Design Guidelines](https://experience.sap.com/fiori-design-web/draft-handling/), and the [SAP UI5 documentation](https://ui5.sap.com/#/topic/ed9aa41c563a44b18701529c8327db4d). -:::tip Draft locks still apply -Directly updating an active entity does **not** bypass draft locks. -If an existing draft locks the entity, direct updates are blocked to prevent losing draft changes upon activation. -See draft lock configuration for [Node.js](../../node.js/fiori#draft-locks) or [Java](../../java/fiori-drafts#draft-lock). -::: +### Draft-Enabled Entities -In CAP Node.js, Direct CRUD is a prerequisite for [SAP Fiori Elements Mass Edit](https://sapui5.hana.ondemand.com/sdk/#/topic/965ef5b2895641bc9b6cd44f1bd0eb4d.html), which allows users to change multiple objects with the same editable properties in one step — without creating individual drafts per row. All unlocked rows are updated even if some rows are locked and therefore fail. +All you need to do to serve an entity with draft support enabled is to annotate it with `@odata.draft.enabled`. For example, as we do in the [_capire/xtravels_](https://github.com/capire/xtravels/blob/b147a1daad27d11352e0d39b525b25ed3241c016/app/travels/capabilities.cds#L3) sample: -:::warning Additional entry points -Both Direct CRUD and Mass Edit create additional entry points to your application. -Custom handlers are triggered with delta payloads rather than the complete business object. +::: code-group +```cds [app/travels/capabilities.cds] +annotate TravelService.Travels with @odata.draft.enabled; +``` ::: -[Learn more about Direct CRUD events in **Java**.](../../java/fiori-drafts#bypassing-draft-flow){.learn-more} - -[Learn more about draft-specific events in **Node.js**.](../../node.js/fiori#draft-specific-events){.learn-more} - +Behind the scenes, CAP takes care of all the rest. Most importantly, it adds a new `.drafts` entity, next to the active entity, and with the same elements, used to store draft data. Think of it like a shadow entity, defined like this: -### Validating Drafts +::: code-group +```cds [=> generated automatically:] +entity TravelService.Travels.drafts : TravelService.Travels { ... } +``` +::: -With Fiori draft state messages, you benefit from the following improvements without any change in your application code: -- The UI displays error messages for annotation-based validations (such as `@mandatory` or `@assert...`) while editing drafts. -- You can register [custom validations](#custom-validations) to the `PATCH` event and write (error) messages. The draft choreography ensures the invalid value still persists. -- Messages remain visible in the UI, even after editing other fields. -- The UI automatically loads messages when reopening a previously edited draft. -CAP generates side-effect annotations in the EDMX to instruct UI5 to fetch state messages after every `PATCH` request. To control side-effect annotations more precisely, override or disable them per entity: +We can access the definition of this entity from the model at runtime to, for example, add custom handlers to draft events, or to access draft data in our code. For example, from within a service implementation in CAP Node.js, we can use the [`.drafts`](../../node.js/cds-reflect#drafts) reference as a shortcut to access the draft entity: - ```cds - // Setting `null` disables the side-effect annotation for always fetching messages. - annotate MyService.MyEntity with @Common.SideEffects #alwaysFetchMessages: null; - ``` +```js +const { Travels } = this.entities +SELECT.from (Travels) //> queries active data +SELECT.from (Travels.drafts) //> queries draft data +``` -For this feature to work correctly, CAP adds additional elements to your draft-enabled entities and [`DraftAdministrativeData`](../security/data-privacy#personal-data-stored-by-cap) to store and serve the state messages. CAP runtimes persist (error) messages for draft-enabled entities. +### Draft Choreography -::: warning Requires Schema Update -This feature initiates a database schema update, as it adds an additional element to `DraftAdministrativeData`. -::: -::: warning Requires OData V4 and UI5 version >=1.136.0 -State messages require UI5 to use _document URLs_. CAP sets the `@Common.AddressViaNavigationPath` annotation to enable this. You need OData V4 and UI5 version >= 1.136.0. OData V2 does not support this annotation. -::: -To disable this feature, set cds.fiori.draft_messages:false. +With [`@odata.draft.enabled`](#draft-enabled-entities) entities in place, CAP automatically serves the Fiori draft choreography as illustrated in the following diagram: +![](./fiori-draft.drawio.svg) -#### Custom Validations +In essence, the draft choreography defines the following flows: -You can add [custom handlers](../services/custom-code) to add specific validations, as usual. In addition, for a draft, you can register handlers to the respective `UPDATE` events to validate input per field, during the edit session, as follows. +- creating drafts for **new** active entities, or for **editing** existing ones +- filling in draft data through a series of _PATCH_ events +- **saving** the draft back to the active entity, or **discarding** it +Drafts are isolated from any active data until they are saved/activated, when discarded, they are removed, as if they never existed – with draft locks as the only exception, to prevent conflicting changes. -##### ... in Java -You can add your validation logic before operation event handlers. Specific events for draft operations exist. See [Java > Fiori Drafts > Editing Drafts](../../java/fiori-drafts#draftevents) for more details. +### Draft Locks +Whenever a draft is created to _edit_ an active entity, this active entity is locked for any operation that could result in conflicting changes. In particular: -##### ... in Node.js +- No other draft can be created for the same active instance. +- No direct updates or deletes to the active instance are allowed. -You can add your validation logic before the operation handler for either CRUD or draft-specific events. See [Node.js > Fiori Support > Handlers Registration](../../node.js/fiori#draft-support) for more details about handler registration. +The lock is released automatically when the draft is either saved/activated, or discarded. It can also be manually reclaimed by other users after a certain period of inactivity, which is 15 minutes by default, but can be configured via cds.fiori.draft_lock_timeout: 1h for CAP Node.js and cds.drafts.cancellationTimeout: 1h for CAP Java, respectively. See draft lock configuration for [Node.js](../../node.js/fiori#draft-locks) or [Java](../../java/fiori-drafts#draft-lock). +Draft locks are not applied when creating drafts for new entities, as there is no active entity to be locked in this case. -
+### Requests to Drafts -### Query Drafts Programmatically +The HTTP requests sent from Fiori clients that deal with drafts are as follows: -To access drafts in code, you can use the [`.drafts` reflection](../../node.js/cds-reflect#drafts). -```js -SELECT.from(Books.drafts) //returns all drafts of the Books entity +```php:line-numbers [Requests to draft data] +POST /Foo/draftNew //> NEW +POST /Foo(ID,IsActiveEntity=true)/draftEdit //> EDIT +GET /Foo(ID,IsActiveEntity=false) //> READ +PATCH /Foo(ID,IsActiveEntity=false) {...} //> PATCH +POST /Foo(ID,IsActiveEntity=false)/draftActivate //> SAVE +DELETE /Foo(ID,IsActiveEntity=false) //> DISCARD ``` -[Learn how to query drafts in Java.](../../java/fiori-drafts#draftservices){.learn-more} - + The key parameter `IsActiveEntity=false` is used to address draft data – with the exceptions of `draftNew`, which is an _unbound_ action, and `draftEdit` for semantic reasons. -## Use Roles to Toggle Visibility of UI elements - -In addition to adding [restrictions on services, entities, and actions/functions](../security/authorization#restrictions), there are use cases where you only want to hide certain parts of the UI for specific users. This is possible by using the respective UI annotations like `@UI.Hidden` or `@UI.CreateHidden` in conjunction with `$edmJson` pointing to a singleton. +::: details `draftNew` actions are used and +Before, regular `POST /Foo` requests without an `IsActiveEntity` parameter were used to create new drafts, which always created ambiguities with requests to active data. +Can be disabled with cds.fiori.draft_new_action: false. +::: -First, you define the [singleton](../protocols/odata#singletons) in your service and annotate it with [`@cds.persistence.skip`](../databases/cdl-to-ddl#cds-persistence-skip) so that no database artefact is created: +::: details Full HTTP requests ... +The requests above are shown in an abbreviated form for clarity. The actual HTTP requests include the service path, content-type headers and JSON bodies as shown below. -```cds -@odata.singleton @cds.persistence.skip -entity Configuration { - key ID: String; - isAdmin : Boolean; -} +```http +POST /odata/v4/TravelService/Travels/draftNew +Content-Type: application/json ``` -> A key is technically not required, but without it some consumers might run into problems. - -Then define an `on` handler for serving the request: +```http +POST /odata/v4/TravelService/Travels(ID=a11fb6f1-36ab-46ec-b00c-d379031e817a,IsActiveEntity=true)/draftEdit +Content-Type: application/json +``` +```http +PATCH /odata/v4/TravelService/Travels(ID=a11fb6f1-36ab-46ec-b00c-d379031e817a,IsActiveEntity=false) +Content-Type: application/json -```js -srv.on('READ', 'Configuration', async req => { - req.reply({ - isAdmin: req.user.is('admin') //admin is the role, which for example is also used in @requires annotation - }); -}); +{ ... } ``` +... and so forth. +::: -Finally, refer to the singleton in the annotation by using a [dynamic expression](../protocols/odata#dynamic-expressions): -```cds -annotate service.Books with @( - UI.CreateHidden : { $edmJson: {$Not: { $Path: '/CatalogService.EntityContainer/Configuration/isAdmin'} } }, - UI.UpdateHidden : { $edmJson: {$Not: { $Path: '/CatalogService.EntityContainer/Configuration/isAdmin'} } }, -); -``` +### Requests to Active Data -The Entity Container is OData specific and refers to the `$metadata` of the OData service in which all accessible entities are located within the Entity Container. +Add `IsActiveEntity=true` as a key parameter to your requests to address *active* data directly, bypassing potentially existing drafts, for example: -:::details SAP Fiori elements also allows to not include it in the path -```cds -annotate service.Books with @( - UI.CreateHidden : { $edmJson: {$Not: { $Path: '/Configuration/isAdmin'} } }, - UI.UpdateHidden : { $edmJson: {$Not: { $Path: '/Configuration/isAdmin'} } }, -); +```php:line-numbers [Requests to active data] +POST /Books { IsActiveEntity:true, ... } //> CREATE +PATCH /Books(ID=201,IsActiveEntity=true) {...} //> UPDATE +DELETE /Books(ID=201,IsActiveEntity=true) //> DELETE +GET /Books(ID=201,IsActiveEntity=true) //> READ ``` + +::: details Available for CAP Node.js +While this was always possible in CAP Java before, it's available for CAP Node.js in the same way by default since v10. Can be disabled with cds.fiori.bypass_draft: false, which prevents bypassing the draft flow for _CREATE_ and _UPDATE_ operations entirely. ::: -## Value Helps +#### Draft-agnostic Requests -In addition to supporting the standard `@Common.ValueList` annotations as defined in the [OData Vocabularies](../protocols/odata#annotations), CAP provides advanced, convenient support for Value Help as understood and supported by SAP Fiori. +Going one step further, we assume `IsActiveEntity=true` by default, so that clients which don't know anything about drafts, or don't want to deal with them, can simply ignore any draft-specific requests and parameters: +```php:line-numbers [Draft-agnostic requests to active data] +POST /Foo //> CREATE +GET /Foo(ID) //> READ +PATCH /Foo(ID) {...} //> UPDATE +DELETE /Foo(ID) //> DELETE +``` -### Convenience Option `@cds.odata.valuelist` +::: details Available for CAP Node.js – not yet for CAP Java +Draft-agnostic requests as above assume `IsActiveEntity=true` by default for all requests that don't explicitly specify it. +Doing so was possible in CAP Node.js, but not in CAP Java, as we are (still) bound by the [*Olingo*](https://olingo.apache.org) library there. Thus, for CAP Java, you need to explicitly add `IsActiveEntity=true` as key parameters to address active data -Simply add the `@cds.odata.valuelist` annotation to an entity, and all managed associations targeting this entity will automatically receive Value Lists in SAP Fiori clients. For example: +[Learn more about Direct CRUD events in **Java**.](../../java/fiori-drafts#bypassing-draft-flow){.learn-more} +::: -```cds -@cds.odata.valuelist -entity Currencies {} -``` -```cds -service BookshopService { - entity Books { //... - currency : Association to Currencies; - } -} -``` +> [!tip] Draft locks still apply +> Directly updating an active entity does **not** bypass [draft locks](#draft-locks). +> If an existing draft locks the entity, direct updates are blocked to prevent lost update situations. -### Pre-Defined Types in `@sap/cds/common` +### Programmatic Access -[@sap/cds/common]: ../../cds/common +You can also access draft data programmatically from custom code in JavaScript or Java. -The reuse types in [@sap/cds/common] already have this added to base types and entities, so all uses automatically benefit from this. This is an effective excerpt of respective definitions in `@sap/cds/common`: +In CAP Java, add `IsActiveEntity` as a key parameter to your queries ([learn more](../../java/fiori-drafts#draftservices)): -```cds -type Currencies : Association to sap.common.Currencies; -``` -```cds -context sap.common { - entity Currencies : CodeList {...}; - entity CodeList { name : localized String; ... } -} -``` -```cds -annotate sap.common.CodeList with @( - UI.Identification: [name], - cds.odata.valuelist, +```java {3} +Select.from(FOO).where(o -> o.ID().eq(201); //> reads active data +Select.from(FOO).where(o -> o.ID().eq(201) .and( //> reads draft data + o.IsActiveEntity().eq(false)) ); ``` -### Usages of `@sap/cds/common` - -In effect, usages of [@sap/cds/common] stay clean of any pollution, for example: +In CAP Node.js, use the [`Foo.drafts`](../../node.js/cds-reflect#drafts) references to access draft data: -```cds -using { Currency } from '@sap/cds/common'; -entity Books { //... - currency : Currency; -} +```js {3} +const { Foo } = this.entities +SELECT.from (Foo, 201) // reads active data only +SELECT.from (Foo.drafts, 201) // reads draft data, if exists ``` -[Find this also in our **capire/bookstore**.](https://github.com/capire/bookshop/blob/main/db/schema.cds){.learn-more} - -Still, all SAP Fiori UIs, on all services exposing `Books`, will automatically receive Value Help for currencies. You can also benefit from that when [deriving your project-specific code list entities from **sap.common.CodeList**](../../cds/common#adding-own-code-lists). - - -### Resulting Annotations in EDMX +Or even better, prefer using [`req.subject`](../../node.js/events#subject) which automatically resolves to the correct entity instance, active or draft, based on the current request context. For example, in a custom action handlers, that should be triggered for both active and draft data: -Here is an example showing how this ends up as OData `Common.ValueList` annotations: - -```xml - - - - - - - - - - - - - - - - - - - +```js +this.on ('approveTravel', req => UPDATE (req.subject) .with ({ status: 'A' })) +this.on ('rejectTravel', req => UPDATE (req.subject) .with ({ status: 'X' })) ``` -## Actions -In our SFLIGHT sample application, we showcase how to use actions covering the definition in your CDS model, the needed custom code and the UI implementation. +### Draft Input Validation -[Learn more about Custom Actions & Functions.](../services/custom-actions){.learn-more} +During draft phase, i.e., on `PATCH` requests to draft data, all [`@assert`s](../services/constraints) are validated, and respective error messages are returned to the client. Yet, in contrast to active entities, the draft is still created/updated, even with invalid data, so that users can correct it later on without losing their progress. +#### Custom Handlers for Draft Events -We're going to look at three things. -1. Define the action in CDS and custom code. -1. Create buttons to bring the action to the UI -1. Dynamically define the buttons status on the UI +You can add custom handlers to draft events by referring to the draft-specific events and/or `.drafts` entities, for example like that in CAP Node.js ([learn more](../../node.js/fiori#draft-specific-events)): +```js:line-numbers +const { Foo } = this.entities +this.before ('NEW', Foo.drafts, ...) +this.before ('EDIT', Foo, ...) //> note: refers to active entity +this.before ('PATCH', Foo.drafts, ...) +this.before ('SAVE', Foo.drafts, ...) +this.before ('DISCARD', Foo.drafts, ...) +``` -First you need to define an action, like in the [_travel-service.cds_ file](https://github.com/SAP-samples/cap-sflight/blob/42ee666e40f9dba1176f8263b512c10d23f07907/srv/travel-service.cds#L11). +Similar in CAP Java ([learn more](../../java/fiori-drafts#editing-drafts)): -```cds -entity Travel as projection on my.Travel actions { - action createTravelByTemplate() returns Travel; - action rejectTravel(); - action acceptTravel(); - action deductDiscount( percent: Percentage not null ) returns Travel; - }; +```java:line-numbers +@Before (event = DraftService.EVENT_DRAFT_CREATE) +@Before (event = DraftService.EVENT_DRAFT_EDIT) +@Before (event = DraftService.EVENT_DRAFT_PATCH) +@Before (event = DraftService.EVENT_DRAFT_SAVE) +@Before (event = DraftService.EVENT_DRAFT_CANCEL) ``` -To define what the action actually is doing, you need to write some custom code. See the [_travel-service.ts_](https://github.com/SAP-samples/cap-sflight/blob/42ee666e40f9dba1176f8263b512c10d23f07907/srv/travel-service.ts#L86) file for example: +#### Validation on Active Entities + +Finally upon saving a draft, all validations for active entities are executed as usual, with invalid data being rejected, so that only valid data gets activated. This includes all constraints like `@assert` and `@readonly`, as well as all custom handlers registered to active entity events, for example: ```js -this.on('acceptTravel', req => UPDATE(req.subject).with({TravelStatus_code:'A'})) +const { Foo } = this.entities +this.before ([ 'CREATE', 'UPDATE' ], Foo, req => {/* validate all */}) ``` -Create the buttons, to bring this action onto the UI and make it actionable for the user. There are two buttons: On the overview and in the detail screen. Both are defined in the [_layouts.cds_](https://github.com/SAP-samples/cap-sflight/blob/42ee666e40f9dba1176f8263b512c10d23f07907/app/travel_processor/layouts.cds) file. +> [!caution] Validate on active entities, not only on drafts +> Validations on draft entities are not sufficient, as active entities can be updated directly, bypassing drafts. Thus, make sure to always perform all necessary validations on active entities, not only on drafts. +> Note also, that updates to active entities could be partial, for example only updating an individual `OrderItem` within an `Order` through navigation like `PATCH /Orders(1)/Items(3)`, so make sure to cover such cases as well in your validation logic. -For the overview of all travels, use the [`@UI.LineItem` annotation](https://github.com/SAP-samples/cap-sflight/blob/42ee666e40f9dba1176f8263b512c10d23f07907/app/travel_processor/layouts.cds#L40-L41). -```cds -annotate TravelService.Travel with @UI : { -LineItem : [ - { $Type : 'UI.DataFieldForAction', - Action : 'TravelService.acceptTravel', - Label : '{i18n>AcceptTravel}' } - ] -}; -``` +### Persistent Messages -For the detail screen of a travel, use the [`@UI.Identification` annotation](https://github.com/SAP-samples/cap-sflight/blob/42ee666e40f9dba1176f8263b512c10d23f07907/app/travel_processor/layouts.cds#L9-L10). +While in draft state, error messages are automatically persisted, so that they remain visible, even after editing other fields, or navigating away from the page and returning later on. -```cds -annotate TravelService.Travel with @UI : { - Identification : [ - { $Type : 'UI.DataFieldForAction', - Action : 'TravelService.acceptTravel', - Label : '{i18n>AcceptTravel}' } - ] -}; -``` +CAP automatically generates corresponding side-effect annotations in the EDMX to instruct Fiori clients to fetch state messages after every `PATCH` request. -Now, the buttons are there and connected to the action. The missing piece is to define the availability of the buttons dynamically. Annotate the `Travel` entity in the `TravelService` service accordingly in the [_field-control.cds_](https://github.com/SAP-samples/cap-sflight/blob/42ee666e40f9dba1176f8263b512c10d23f07907/app/travel_processor/field-control.cds#L23-L36) file. +You can override generated side-effect annotations per entity, for example: -```cds -annotate TravelService.Travel with actions { - acceptTravel @( - Core.OperationAvailable : { - $edmJson: { $Ne: [{ $Path: 'in/TravelStatus_code'}, 'A']} - }, - Common.SideEffects.TargetProperties : ['in/TravelStatus_code'], ) }; -``` -This annotation uses [dynamic expressions](../protocols/odata#dynamic-expressions) to control the buttons for each action. And the status of a travel on the UI is updated, triggered by the `@Common.SideEffects.TargetProperties` annotation. + ```cds + annotate MyService.Foo with @( + Common.SideEffects #alwaysFetchMessages: false + ); + ``` -:::info More complex calculation -If you have the need for a more complex calculation, then the interesting parts in (an older version of) SFLIGHT are [virtual fields in _field-control.cds_](https://github.com/SAP-samples/cap-sflight/blob/dfc7827da843ace0ea126f76fc78a6591b325c67/app/travel_processor/field-control.cds#L10-L16) (also lines 37-44) and [custom code in _travel-service.js_](https://github.com/SAP-samples/cap-sflight/blob/dfc7827da843ace0ea126f76fc78a6591b325c67/srv/travel-service.js#L13-L22). +::: details Available and +Can be disabled with cds.fiori.draft_messages: false. ::: +### Draft for Localized Data -## Cache Control +Annotate the underlying base entity in the base model with `@fiori.draft.enabled` to also support drafts for [localized data](./localized-data): -CAP provides the option to set a [Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) header with a [max-age](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#max-age) directive to indicate that a response remains fresh until _n_ seconds after it was generated . -In the CDS model, this can be done using the `@http.CacheControl: {maxAge: }` annotation on stream properties. The header indicates that caches can store the response and reuse it for subsequent requests while it's fresh. -The `max-age` (in seconds) specifies the maximum age of the content before it becomes stale. +```cds +annotate sap.capire.bookshop.Books with @fiori.draft.enabled; +``` -:::info Elapsed time since the response was generated -The `max-age` is the elapsed time since the response was generated on the origin server. It's not related to when the response was received. +:::info Background +SAP Fiori drafts required single keys of type `UUID`, which isn't the case case for [`.texts`](./localized-data#behind-the-scenes) entities, generated for localized data. The `@fiori.draft.enabled` annotation tells the compiler to add an additional technical primary key element named `ID_texts`. ::: -::: warning Only Java -Cache Control feature is currently supported on the Java runtime only. -::: +![An SAP Fiori UI showing how a book is edited in the bookshop sample and that the translations tab is used for non-standard languages.](draft-for-localized-data.png){style="margin:0"} -
+[See it live in **capire/bookstore**.](https://github.com/capire/bookstore/blob/main/app/admin-books/fiori-service.cds#L78){.learn-more} -
-## Hierarchical Tree Views -Recursive hierarchies are parent-child related structures: each entity references its parent and through that defines the hierarchical structure. A common example is a company organization structure or HR reporting, where each employee entity references another employee as a direct report or manager. +## Fiori Tree Views -A generic hierarchy implementation for hierarchies is available on all relational databases supported by the CAP runtimes. +Following the same principle of convenience as for Value Helps, CAP provides a shortcut annotation to define hierarchies on entities with recursive associations, which are then rendered as Tree Views in SAP Fiori clients. -::: warning -On H2, only small hierarchies should be used for performance reasons. -::: -### Example -Let's assume we have the following domain model and its projection in a service: +### Recursive Associations -::: code-group -```cds [schema.cds] -namespace my.bookshop; +Hierarchies are most commonly parent-child structures created via recursive associations. For example, in a the [capire/bookshop](https://github.com/capire/bookshop) sample, we have the `Genres` entity with a recursive association `parent` to itself: -entity Genres { //... - ID : UUID; +::: code-group +```cds [db/schema.cds] +entity Genres : cuid { //... parent : Association to Genres; } ``` ::: + +### The `@hierarchy` Annotation + +All we have to do to get a Tree View in SAP Fiori clients is to annotate the entity with `@hierarchy`, for example as we did in the Fiori Annotations of the [capire/bookstore](https://github.com/capire/bookstore) sample: + ::: code-group -```cds [AdminService.cds] -service AdminService { - entity Genres as projection on my.bookshop.Genres; -} +```cds [app/genres/fiori-service.cds] +annotate AdminService.Genres with @hierarchy; ``` ::: -In this example, there is a managed to-one association `parent` that defines the parent-child hierarchy -based on a single key element. In such a situation you can define the Tree View via the annotation `@hierarchy`: +If there are multiple associations that could be used as parent association, you can specify the one to be used with the value of the `@hierarchy` annotation, for example: ```cds -annotate AdminService.Genres with @hierarchy : parent; +annotate AdminService.Genres with @hierarchy: parent; ``` -If the entity contains only one such association, you can even omit the value: +::: details Under the hood... + +The `@hierarchy` annotation is a convenient shortcut for the following Fiori-level `annotate` and `extend` statements that you would have to write manually otherwise. ```cds -annotate AdminService.Genres with @hierarchy; +// declare a hierarchy with the qualifier "GenresHierarchy" +annotate AdminService.Genres with @Aggregation.RecursiveHierarchy #GenresHierarchy: { + NodeProperty : ID, // identifies a node, usually the key + ParentNavigationProperty : parent // navigates to a node's parent +}; + +extend AdminService.Genres with @( + // The computed properties expected by Fiori to be present in hierarchy entities + Hierarchy.RecursiveHierarchy #GenresHierarchy: { + LimitedDescendantCount : LimitedDescendantCount, + DistanceFromRoot : DistanceFromRoot, + DrillState : DrillState, + LimitedRank : LimitedRank + }, + // Disallow filtering on these properties from Fiori UIs + Capabilities.FilterRestrictions.NonFilterableProperties: [ + 'LimitedDescendantCount', 'DistanceFromRoot', 'DrillState', 'LimitedRank' + ], + // Disallow sorting on these properties from Fiori UIs + Capabilities.SortRestrictions.NonSortableProperties: [ + 'LimitedDescendantCount', 'DistanceFromRoot', 'DrillState', 'LimitedRank' + ], +) columns { // Ensure we can query these columns from the database + null as LimitedDescendantCount : Int16, + null as DistanceFromRoot : Int16, + null as DrillState : String, + null as LimitedRank : Int16 +}; ``` -Configure the TreeTable in UI5's _manifest.json_ file: +> Note: When naming the hierarchy qualifier, use the following pattern:
+> `Hierarchy` + +::: + + +### UI5 manifest Configuration + +In addition, you need to configure the TreeTable in UI5's _manifest.json_ file: ```jsonc "sap.ui5": { ... @@ -848,8 +574,8 @@ Configure the TreeTable in UI5's _manifest.json_ file: "controlConfiguration": { "@com.sap.vocabularies.UI.v1.LineItem": { "tableSettings": { - "hierarchyQualifier": "GenresHierarchy", // [!code focus] - "type": "TreeTable" // [!code focus] + "hierarchyQualifier": "GenresHierarchy", + "type": "TreeTable" } } } @@ -870,42 +596,66 @@ You can now start the server with `cds watch` and see the hierarchical tree view The compiler automatically expands the shortcut annotation `@hierarchy` to the following `annotate` and `extend` statements. -### Manual Approach -The following documents what happens behind the scenes, done by the compiler as described before. You can also use it, if you cannot use the `@hierarchy` annotation, for example, because you only have an unmanaged parent association. + + +## Cache Control in Java + +CAP provides the option to set a [Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) header with a [max-age](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control#max-age) directive to indicate that a response remains fresh until _n_ seconds after it was generated . +In the CDS model, this can be done using the `@http.CacheControl: {maxAge: }` annotation on stream properties. The header indicates that caches can store the response and reuse it for subsequent requests while it's fresh. +The `max-age` (in seconds) specifies the maximum age of the content before it becomes stale. + +:::info Elapsed time since the response was generated +The `max-age` is the elapsed time since the response was generated on the origin server. It's not related to when the response was received. +::: + +::: warning Only Java +Cache Control feature is currently supported on the Java runtime only. +::: + + + +## Role-based Visibility + +In addition to adding [restrictions on services, entities, and actions/functions](../security/authorization#restrictions), there are use cases where you only want to hide certain parts of the UI for specific users. This is possible by using the respective UI annotations like `@UI.Hidden` or `@UI.CreateHidden` in conjunction with `$edmJson` pointing to a singleton. + +First, you define the [singleton](../protocols/odata#singletons) in your service and annotate it with [`@cds.persistence.skip`](../databases/cdl-to-ddl#cds-persistence-skip) so that no database artefact is created: ```cds -// declare a hierarchy with the qualifier "GenresHierarchy" -annotate AdminService.Genres with @Aggregation.RecursiveHierarchy #GenresHierarchy: { - NodeProperty : ID, // identifies a node, usually the key - ParentNavigationProperty : parent // navigates to a node's parent -}; +@odata.singleton @cds.persistence.skip +entity Configuration { + key ID: String; + isAdmin : Boolean; +} +``` +> A key is technically not required, but without it some consumers might run into problems. -extend AdminService.Genres with @( - // The computed properties expected by Fiori to be present in hierarchy entities - Hierarchy.RecursiveHierarchy #GenresHierarchy: { - LimitedDescendantCount : LimitedDescendantCount, - DistanceFromRoot : DistanceFromRoot, - DrillState : DrillState, - LimitedRank : LimitedRank - }, - // Disallow filtering on these properties from Fiori UIs - Capabilities.FilterRestrictions.NonFilterableProperties: [ - 'LimitedDescendantCount', 'DistanceFromRoot', 'DrillState', 'LimitedRank' - ], - // Disallow sorting on these properties from Fiori UIs - Capabilities.SortRestrictions.NonSortableProperties: [ - 'LimitedDescendantCount', 'DistanceFromRoot', 'DrillState', 'LimitedRank' - ], -) columns { // Ensure we can query these columns from the database - null as LimitedDescendantCount : Int16, - null as DistanceFromRoot : Int16, - null as DrillState : String, - null as LimitedRank : Int16 -}; +Then define an `on` handler for serving the request: + +```js +srv.on('READ', 'Configuration', async req => { + req.reply({ + isAdmin: req.user.is('admin') //admin is the role, which for example is also used in @requires annotation + }); +}); ``` -> Note: When naming the hierarchy qualifier, use the following pattern:
-> `Hierarchy` +Finally, refer to the singleton in the annotation by using a [dynamic expression](../protocols/odata#dynamic-expressions): -
+```cds +annotate service.Books with @( + UI.CreateHidden : { $edmJson: {$Not: { $Path: '/CatalogService.EntityContainer/Configuration/isAdmin'} } }, + UI.UpdateHidden : { $edmJson: {$Not: { $Path: '/CatalogService.EntityContainer/Configuration/isAdmin'} } }, +); +``` + +The Entity Container is OData specific and refers to the `$metadata` of the OData service in which all accessible entities are located within the Entity Container. + +:::details SAP Fiori elements also allows to not include it in the path +```cds +annotate service.Books with @( + UI.CreateHidden : { $edmJson: {$Not: { $Path: '/Configuration/isAdmin'} } }, + UI.UpdateHidden : { $edmJson: {$Not: { $Path: '/Configuration/isAdmin'} } }, +); +``` +::: diff --git a/node.js/fiori.md b/node.js/fiori.md index 2d5339d8fc..fd09ec3efd 100644 --- a/node.js/fiori.md +++ b/node.js/fiori.md @@ -67,10 +67,6 @@ 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. -:::warning Known Limitation -With the [`hdb` SAP HANA driver](https://www.npmjs.com/package/hdb), trying to `INSERT` draft entities with fields that use the [`LargeBinary` type](../cds/types#core-built-in-types) will cause a deadlock. -The known workaround is to [configure your CAP app](../guides/databases/hana#setup-configuration) to use the [`hana-client` SAP HANA driver](https://www.npmjs.com/package/@sap/hana-client) instead. -::: ### `EDIT` @@ -86,20 +82,6 @@ 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. -### `DISCARD` - -```js -srv.before('DISCARD', MyEntity.drafts, /*...*/) -srv.after('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. - -`CANCEL`, as a synonym for `DISCARD`, works as well. - - ### `PATCH` ```js @@ -126,6 +108,21 @@ The `SAVE` event is triggered when the user saves / activates a draft. This resu > 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. + +### `DISCARD` + +```js +srv.before('DISCARD', MyEntity.drafts, /*...*/) +srv.after('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. + +`CANCEL`, as a synonym for `DISCARD`, works as well. + + ### Custom Actions Custom bound actions and functions defined for draft-enabled entities are also inherited by the draft entities. @@ -188,23 +185,13 @@ It can occur that inactive drafts are still in the database after the configured ::: - -## Bypassing Drafts {.deprecated} - -Use [Direct CRUD](../guides/uis/fiori#direct-crud) instead. - -Until the next major release (`cds10`), you can still activate the draft bypass without also allowing direct CRUD via cds.fiori.bypass_draft:true. - - - ## Programmatic APIs You can programmatically invoke draft actions with the following APIs: ```js -await srv.new(MyEntity.drafts, data) // create new draft -await srv.discard(MyEntity.drafts, keys) // discard draft -await srv.edit(MyEntity, keys) // create draft from active instance -await srv.new(MyEntity.drafts).for(keys) // same as above -await srv.save(MyEntity.drafts, keys) // activate draft +await srv.new (MyEntity.drafts, data) // create new draft +await srv.edit (MyEntity, keys) // create draft from active instance +await srv.save (MyEntity.drafts, keys) // activate draft +await srv.discard (MyEntity.drafts, keys) // discard draft ``` From 2cc5cf3e3e0987da8137164eb71bb8841e7a4856 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Mon, 18 May 2026 09:50:24 +0200 Subject: [PATCH 028/156] Adjust links to changed Fiori docs --- cds/common.md | 2 +- get-started/feature-matrix.md | 2 +- guides/deploy/to-cf.md | 2 +- guides/uis/fiori.md | 3 +++ java/reflection-api.md | 2 +- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/cds/common.md b/cds/common.md index 3a964cae15..ffba589a54 100644 --- a/cds/common.md +++ b/cds/common.md @@ -34,7 +34,7 @@ It's recommended that all applications use the common types and aspects provided * **Proven best practices** captured from real applications * **Streamlined** data models with **minimal entry barriers** * **Optimized** implementations and runtime performance -* **Automatic** support for [localized](../guides/uis/localized-data) code lists and [value helps](../guides/uis/fiori#pre-defined-types-in-sap-cds-common) +* **Automatic** support for [localized](../guides/uis/localized-data) code lists and [value helps](../guides/uis/fiori#simple-value-helps) * **Extensibility** using [Aspects](../guides/domain/index#aspect-oriented-modeling) * **Verticalization** through third-party extension packages diff --git a/get-started/feature-matrix.md b/get-started/feature-matrix.md index d545e768ab..bbdc1e2161 100644 --- a/get-started/feature-matrix.md +++ b/get-started/feature-matrix.md @@ -224,7 +224,7 @@ Following is an index of the features currently covered by CAP, with status and |--------------------------------------------------------------------------------------------|:----:|:-------:|:----:| | [Serving Fiori UIs](../guides/uis/fiori) | | | | | [Fiori Annotations in CDS](../guides/uis/fiori#fiori-annotations) | | | | -| [Advanced Value Help](../guides/uis/fiori#value-helps) | | | | +| [Advanced Value Help](../guides/uis/fiori#simple-value-helps) | | | | | [Draft Support](../guides/uis/fiori#draft-support) | | | | | [Draft for Localized Data](../guides/uis/fiori#draft-for-localized-data) | | | | | [Support for Fiori Analytics](../guides/uis/analytics) | | | | diff --git a/guides/deploy/to-cf.md b/guides/deploy/to-cf.md index 73aff0bfd4..1a26a09b26 100644 --- a/guides/deploy/to-cf.md +++ b/guides/deploy/to-cf.md @@ -321,7 +321,7 @@ Share the generic App-Router URL with SaaS consumers for logging in as extension ::: ::: tip No index page and SAP Fiori preview in the cloud -The default index page and [SAP Fiori preview](../uis/fiori#sap-fiori-preview), that you're used to seeing during local development, are meant only for the development profile and aren't available in the cloud. For productive applications, you should add a proper SAP Fiori elements application through one of the [user interface options](#add-ui) outlined before. +The default index page and [SAP Fiori preview](../uis/fiori#fiori-preview), that you're used to seeing during local development, are meant only for the development profile and aren't available in the cloud. For productive applications, you should add a proper SAP Fiori elements application through one of the [user interface options](#add-ui) outlined before. ::: ### Inspect Apps in BTP Cockpit diff --git a/guides/uis/fiori.md b/guides/uis/fiori.md index dab1241ec9..bfaa2224f7 100644 --- a/guides/uis/fiori.md +++ b/guides/uis/fiori.md @@ -13,6 +13,7 @@ CAP provides out-of-the-box support for SAP Fiori elements. This guide explains ## Getting Started ### Using Fiori Previews +###### Fiori Preview For entities exposed via OData V4 there is a _Fiori preview_ link on the index page. It dynamically serves an SAP Fiori elements list page that allows you to quickly see the effect of annotation changes without having to create a UI application first. @@ -240,6 +241,7 @@ With that, all UIs on all services exposing `Books` will automatically receive V ## Fiori Draft Support +###### Draft Support SAP Fiori uses Drafts to enable users to save their progress while editing data and continue later on without losing changes. Drafts are stored on the server and can be accessed from different devices and locations, providing flexibility and convenience for users. CAP provides out-of-the-box support for drafts, making it easy to implement this functionality in your applications. @@ -409,6 +411,7 @@ this.on ('rejectTravel', req => UPDATE (req.subject) .with ({ status: 'X' })) ### Draft Input Validation +###### Validating Drafts During draft phase, i.e., on `PATCH` requests to draft data, all [`@assert`s](../services/constraints) are validated, and respective error messages are returned to the client. Yet, in contrast to active entities, the draft is still created/updated, even with invalid data, so that users can correct it later on without losing their progress. diff --git a/java/reflection-api.md b/java/reflection-api.md index e23962609f..9b3e73c782 100644 --- a/java/reflection-api.md +++ b/java/reflection-api.md @@ -222,7 +222,7 @@ The active feature set can't be changed within an active transaction. ### Toggling SAP Fiori UI Elements -In an [SAP Fiori elements](https://experience.sap.com/fiori-design-web/smart-templates/) application, the UI is captured with annotations in the CDS model. Hence, toggling of [SAP Fiori elements annotations](../guides/uis/fiori#what-are-sap-fiori-annotations) is already leveraged by the above concept: To enable toggling of such annotations (and thus UI elements), it's required that the EDMX returned by the `$metadata` respects the feature vector. This is automatically achieved by maintaining different model variants according to activated features as described in the previous section. +In an [SAP Fiori elements](https://experience.sap.com/fiori-design-web/smart-templates/) application, the UI is captured with annotations in the CDS model. Hence, toggling of [SAP Fiori elements annotations](../guides/uis/fiori#fiori-annotations) is already leveraged by the above concept: To enable toggling of such annotations (and thus UI elements), it's required that the EDMX returned by the `$metadata` respects the feature vector. This is automatically achieved by maintaining different model variants according to activated features as described in the previous section. ### Features on the Database From eddd1c3b60bacc4b3ef498a96b6f0b6e22701244 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 10:58:51 +0200 Subject: [PATCH 029/156] chore: Update CLI texts (#2576) 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 | 7 +++++++ tools/assets/help/cds-version-md.out.md | 4 ++-- tools/assets/help/cds-version.out.md | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/tools/assets/help/cds-typer.out.md b/tools/assets/help/cds-typer.out.md index 319d059c51..99a26eb099 100644 --- a/tools/assets/help/cds-typer.out.md +++ b/tools/assets/help/cds-typer.out.md @@ -20,6 +20,13 @@ OPTIONS This value must be set in your project configuration. Passing it as parameter to the cds-typer CLI has no effect. + --brandedPrimitiveTypes + --branded_primitive_types: <true | false> + (default: false) + + If set to true, generated primitive types will be branded to prevent accidental mixing of types with the same underlying primitive. + E.g., type CustomerID = string & { __brand: 'CustomerID' } + --cache: <none | blake2s256> (default: none) diff --git a/tools/assets/help/cds-version-md.out.md b/tools/assets/help/cds-version-md.out.md index e3c5730793..ef548c49f8 100644 --- a/tools/assets/help/cds-version-md.out.md +++ b/tools/assets/help/cds-version-md.out.md @@ -4,9 +4,9 @@ | Package | Version | Location | | -------------------- | ------- | ------------------------------------------------------------------ | - | @sap/cds-dk (global) | 9.9.0 | .../node_modules/@sap/cds-dk | + | @sap/cds-dk (global) | 9.9.1 | .../node_modules/@sap/cds-dk | | @sap/cds | 9.9.1 | .../node_modules/@sap/cds | - | @sap/cds-compiler | 6.9.0 | .../node_modules/@sap/cds-compiler | + | @sap/cds-compiler | 6.9.2 | .../node_modules/@sap/cds-compiler | | @sap/cds-fiori | 2.3.0 | .../node_modules/@sap/cds-fiori | | @cap-js/db-service | 2.11.0 | .../node_modules/@cap-js/db-service | | @cap-js/sqlite | 2.4.0 | .../node_modules/@cap-js/sqlite | diff --git a/tools/assets/help/cds-version.out.md b/tools/assets/help/cds-version.out.md index 8ace43a52d..4ab240193b 100644 --- a/tools/assets/help/cds-version.out.md +++ b/tools/assets/help/cds-version.out.md @@ -2,9 +2,9 @@
 > cds version
 
-  @sap/cds-dk (global)  9.9.0    .../node_modules/@sap/cds-dk 
+  @sap/cds-dk (global)  9.9.1    .../node_modules/@sap/cds-dk 
   @sap/cds              9.9.1    .../node_modules/@sap/cds                                            
-  @sap/cds-compiler     6.9.0    .../node_modules/@sap/cds-compiler                                   
+  @sap/cds-compiler     6.9.2    .../node_modules/@sap/cds-compiler                                   
   @sap/cds-fiori        2.3.0    .../node_modules/@sap/cds-fiori                                      
   @cap-js/db-service    2.11.0   .../node_modules/@cap-js/db-service                                  
   @cap-js/sqlite        2.4.0    .../node_modules/@cap-js/sqlite                                      

From 78b46887bbf3fbf38118f24cac4cda230aec73ec Mon Sep 17 00:00:00 2001
From: Steffen Waldmann 
Date: Mon, 18 May 2026 13:42:02 +0200
Subject: [PATCH 030/156] fix: broken links detected with new blc (#2572)

Fixing some broken links that were detected with the new broken link
checker.
---
 .github/workflows/PR-SAP.yml | 8 +-------
 .github/workflows/PR.yml     | 2 +-
 .github/workflows/main.yml   | 2 +-
 guides/deploy/to-kyma.md     | 2 +-
 guides/integration/calesi.md | 2 +-
 java/reflection-api.md       | 2 +-
 node.js/cds-i18n.md          | 4 ++--
 node.js/cds-test.md          | 2 +-
 8 files changed, 9 insertions(+), 15 deletions(-)

diff --git a/.github/workflows/PR-SAP.yml b/.github/workflows/PR-SAP.yml
index cbec6b6f51..51013196ed 100644
--- a/.github/workflows/PR-SAP.yml
+++ b/.github/workflows/PR-SAP.yml
@@ -38,8 +38,6 @@ jobs:
           cache-dependency-path: docs/package-lock.json
       - run: npm ci
         working-directory: docs
-      - run: npm test
-        working-directory: docs
       - run: npm run lint
         working-directory: docs
       - run: npm run docs:build
@@ -50,9 +48,5 @@ jobs:
           VITE_CAPIRE_EXTRA_ASSETS: true
           MAVEN_HOST: https://common.repositories.cloud.sap/artifactory/build.releases
           MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }}
-      - name: Find broken anchor links
+      - run: npm test
         working-directory: docs
-        run: |
-          npm run docs:preview -- --port 5555 &
-          sleep 2
-          .github/etc/blc.js http://localhost:5555/docs/
diff --git a/.github/workflows/PR.yml b/.github/workflows/PR.yml
index 2fc4968810..9cffe251e2 100644
--- a/.github/workflows/PR.yml
+++ b/.github/workflows/PR.yml
@@ -33,6 +33,6 @@ jobs:
           npm install
           npm run check
       - run: npm ci
-      - run: npm test
       - run: npm run docs:build
+      - run: npm test
       - run: npm run lint
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 12915d399e..baf6679062 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -34,7 +34,6 @@ jobs:
           node-version: 22
           cache: 'npm'
       - run: npm ci
-      - run: npm test
       - run: npm run lint
       - run: npm run docs:build
         env:
@@ -44,6 +43,7 @@ jobs:
           VITE_CAPIRE_EXTRA_ASSETS: true
           MAVEN_HOST: https://common.repositories.cloud.sap/artifactory/build.releases
           MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }}
+      - run: npm test
       - name: Upload artifact
         uses: actions/upload-pages-artifact@v3
         with:
diff --git a/guides/deploy/to-kyma.md b/guides/deploy/to-kyma.md
index f083c470d8..b36796a979 100644
--- a/guides/deploy/to-kyma.md
+++ b/guides/deploy/to-kyma.md
@@ -671,6 +671,6 @@ Cloud Native Buildpacks provide advantages like embracing [best practices](https
 
 Additionally Cloud Native Buildpacks can be easily plugged together to fulfill more complex requirements. For example the [ca-certificates](https://github.com/paketo-buildpacks/ca-certificates) enables adding additional certificates to the system trust-store at build and runtime. When using Cloud Native Buildpacks you can continuously benefit from best practices coming from the community without any changes required.
 
-[Learn more about Cloud Native Buildpacks Concepts.](https://buildpacks.io/docs/concepts/){ .learn-more}
+[Learn more about Cloud Native Buildpacks Concepts.](https://buildpacks.io/docs/for-platform-operators/concepts/){ .learn-more}
 
 
diff --git a/guides/integration/calesi.md b/guides/integration/calesi.md index 7c26d0575f..1a6669341f 100644 --- a/guides/integration/calesi.md +++ b/guides/integration/calesi.md @@ -376,7 +376,7 @@ This would add this to the generated output: ### Publishing APIs -The output of `cds export` is a valid _npm_ or _Maven_ package, which can be published to any npm-compatible registry, such as the public [*npmjs.com*](https://www.npmjs.com/) registry, or private registries like [*GitHub Packages*](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry), [*Azure Artifacts*](https://learn.microsoft.com/en-us/azure/devops/artifacts/npm/npm-overview?view=azure-devops), or [*JFrog Artifactory*](https://jfrog.com/confluence/display/JFROG/NPM+Registry). For example: +The output of `cds export` is a valid _npm_ or _Maven_ package, which can be published to any npm-compatible registry, such as the public [*npmjs.com*](https://www.npmjs.com/) registry, or private registries like [*GitHub Packages*](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry), [*Azure Artifacts*](https://learn.microsoft.com/en-us/azure/devops/artifacts/npm/npmrc), or [*JFrog Artifactory*](https://jfrog.com/confluence/display/JFROG/NPM+Registry). For example: ```shell npm publish ./apis/data-service diff --git a/java/reflection-api.md b/java/reflection-api.md index 9b3e73c782..0d5a705b53 100644 --- a/java/reflection-api.md +++ b/java/reflection-api.md @@ -222,7 +222,7 @@ The active feature set can't be changed within an active transaction. ### Toggling SAP Fiori UI Elements -In an [SAP Fiori elements](https://experience.sap.com/fiori-design-web/smart-templates/) application, the UI is captured with annotations in the CDS model. Hence, toggling of [SAP Fiori elements annotations](../guides/uis/fiori#fiori-annotations) is already leveraged by the above concept: To enable toggling of such annotations (and thus UI elements), it's required that the EDMX returned by the `$metadata` respects the feature vector. This is automatically achieved by maintaining different model variants according to activated features as described in the previous section. +In an [SAP Fiori elements](https://www.sap.com/design-system/fiori-design-web/v1-145/discover/frameworks/sap-fiori-elements/smart-templates) application, the UI is captured with annotations in the CDS model. Hence, toggling of [SAP Fiori elements annotations](../guides/uis/fiori#fiori-annotations) is already leveraged by the above concept: To enable toggling of such annotations (and thus UI elements), it's required that the EDMX returned by the `$metadata` respects the feature vector. This is automatically achieved by maintaining different model variants according to activated features as described in the previous section. ### Features on the Database diff --git a/node.js/cds-i18n.md b/node.js/cds-i18n.md index 3d1f8e0845..619e3f1cce 100644 --- a/node.js/cds-i18n.md +++ b/node.js/cds-i18n.md @@ -97,7 +97,7 @@ Shortcuts to corresponding i18n [config options](#config). {.indent} ### `.messages` {.property} -The I18n bundle used for runtime messages, for example, for translated validation errors, such as `ASSERT_RANGE` or `ASSERT_FORMAT`. Translations are loaded from properties with base name `messages`, like that in the [*bookstore* sample](https://github.com/capire/bookstore/tree/main/_i18n): {.indent} +The I18n bundle used for runtime messages, for example, for translated validation errors, such as `ASSERT_RANGE` or `ASSERT_FORMAT`. Translations are loaded from properties with base name `messages`, like that in the [*bookstore* sample](https://github.com/capire/bookstore/tree/main/app/_i18n): {.indent} ```zsh cap/samples/bookshop/ @@ -114,7 +114,7 @@ cap/samples/bookshop/ ### `.labels` {.property} -The I18n bundle used for UI labels, such as `CreatedAt` or `CreatedBy`, referenced from respective [Fiori annotations](../guides/uis/i18n#externalizing-texts-bundles). Translations are loaded from properties with base name `i18n`, like that in the [*bookstore* sample](https://github.com/capire/bookstore/tree/main/_i18n): {.indent} +The I18n bundle used for UI labels, such as `CreatedAt` or `CreatedBy`, referenced from respective [Fiori annotations](../guides/uis/i18n#externalizing-texts-bundles). Translations are loaded from properties with base name `i18n`, like that in the [*bookstore* sample](https://github.com/capire/bookstore/tree/main/app/_i18n): {.indent} ```zsh cap/samples/bookshop/ diff --git a/node.js/cds-test.md b/node.js/cds-test.md index eadf66cd2f..e01f222cdb 100644 --- a/node.js/cds-test.md +++ b/node.js/cds-test.md @@ -320,7 +320,7 @@ await test.post('/browse/submitOrder', ``` > [!tip] Using Fetch API under the hood -> Under the hood, these methods use [Fetch API](https://developer.mozilla.org/docs/Web/API/FetchAPI), natively supported through the global [`fetch()`](https://nodejs.org/api/globals.html#fetch) function in Node.js since version 18. +> Under the hood, these methods use [Fetch API](https://developer.mozilla.org/docs/Web/API/Fetch_API), natively supported through the global [`fetch()`](https://nodejs.org/api/globals.html#fetch) function in Node.js since version 18. > [!info] Using Axios instead of Fetch API > Former versions of `cds.test` used [Axios](https://axios-http.com/) as the HTTP client. With the move to Fetch API, Axios is no longer included as a dependency in `@cap-js/cds-test`. However, you can still use Axios in your tests if you prefer it over Fetch API. Simply add Axios as a dependency to your project, and it will be used automatically by `cds.test` instead of Fetch API. From 97d2162f1ab9b23982c71e911844e45833b91859 Mon Sep 17 00:00:00 2001 From: Steffen Waldmann Date: Mon, 18 May 2026 14:11:18 +0200 Subject: [PATCH 031/156] chore: remove cspell + mdlint (#2579) --- .github/etc/create-review.cjs | 301 ---------------------------------- .github/workflows/lint.yml | 76 --------- .markdownlint.yaml | 20 --- cspell.config.yaml | 89 ---------- package.json | 3 - project-words.txt | 23 --- 6 files changed, 512 deletions(-) delete mode 100644 .github/etc/create-review.cjs delete mode 100644 .github/workflows/lint.yml delete mode 100644 .markdownlint.yaml delete mode 100644 cspell.config.yaml delete mode 100644 project-words.txt diff --git a/.github/etc/create-review.cjs b/.github/etc/create-review.cjs deleted file mode 100644 index 8b0ec1ecd6..0000000000 --- a/.github/etc/create-review.cjs +++ /dev/null @@ -1,301 +0,0 @@ -const cspellRegExp = /^(.*\.md)(:\d+:?\d*)\s*- Unknown word \((.*?)\)\s+-- (.*?) Suggestions: (\[.*\])$/ -const markdownlintRegExp = /^(.*\.md)(:\d+:?\d*) ([^\s]+) (.*?)(\[.*?\])?( \[Context: .*\])?$/ - -const createSuggestionText = (suggestion) => '```suggestion\n' + suggestion + '\n```\n' -const createCspellSuggestionText = (suggestion, other) => createSuggestionText(suggestion) + `Or maybe one of these: ${other.map(el => `**${el}**`).join(', ')}?` -const createWordsWithoutSuggestionsText = (words) => `For the following words no suggestions could be found, consider adding them to the word list:\n${words.map(word => `* ${word}\n`).join('')}` -const createUnknownWordComment = (word) => `Fix the spelling mistake in "**${word}**" or add it to the **project-words.txt** list.` -const createMissingCodeFencesText = (lines) => -` -\`\`\`\`suggestion -${lines.join('\n')} -\`\`\`\` - -Please add a language tag. For plain text add \`txt\` as language tag. -` - -const getNoEmptyLinkText = () => 'No empty links. Please provide a link value.' -const getSpellingCorrectionTip = () => -` -Generally, for each spelling mistake there are 2 ways to fix it: -1. Fix the spelling mistake and commit it. -2. The word is incorrectly reported as misspelled → put the word on the **project-words.txt** list, located in the root project directory. -` - -const getInvalidUrlText = (text, link) => { - const updatedLink = link.replace('http', 'https') - return createSuggestionText(`${text}(${updatedLink})`) -} - -const escapeMarkdownlink = (link) => link.replace(/(\[|\(|\]|\))/g, "\\$1") -const createSuggestContainerTypeText = (suggestion) => createSuggestionText(suggestion) + 'You have to specify a container type. Possible values: **info**, **tip**, **warning**, **danger**, **details**, **code-group**, **raw**.' - -module.exports = async ({ github, require, exec, core }) => { - const { readFileSync, existsSync } = require('fs') - const { join, extname } = require('path') - const { BASE_DIR, PULL_NUMBER, HEAD_SHA, REPO, REPO_OWNER } = process.env - - const cspellLogFile = join(BASE_DIR, 'CSPELL.log') - const markdownlintLogFile = join(BASE_DIR, 'MARKDOWNLINT.log') - - const comments = [] - let body = '' - let lintErrorsText = '' - let spellingMistakesText = '' - - const result = await github.request('GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews', { - owner: REPO_OWNER, - repo: REPO, - pull_number: PULL_NUMBER - }) - - const linterErrors = [] - const spellingMistakes = [] - - result.data - .filter(review => review.body.includes('')) - .forEach(review => { - spellingMistakes.push(...(review.body.match(/\*(.*) /g) || [])) - linterErrors.push(...(review.body.match(/\*(.*) /g) || [])) - }) - - const { data } = await github.request('GET /repos/{owner}/{repo}/pulls/{pull_number}/files', { - owner: REPO_OWNER, - repo: REPO, - pull_number: PULL_NUMBER, - headers: { - accept: 'application/vnd.github.diff' - } - }) - - const diffs = {} - data.filter(obj => extname(obj.filename) === '.md') - .forEach(obj => { - diffs[obj.filename.replace('./', '')] = obj.patch?.split('\n') ?? [] - }) - - if (existsSync(markdownlintLogFile)) { - const matches = readFileSync(markdownlintLogFile, 'utf-8') - .split('\n') - .filter(Boolean) - .map(line => line.replace(`${BASE_DIR}/`, '').match(markdownlintRegExp)) - - /* - test.md:15:1 MD011/no-reversed-links Reversed link syntax [(test)[link.de]] -> - - test.md:15:1 MD011/no-reversed-links Reversed link syntax [(test)[link.de]] - test.md - :15:1 - MD011/no-reversed-links - Reversed link syntax - [(test)[link.de]] - - */ - for (let [, path, pointer, rule, description, details, context] of matches) { - let contextText = '' - let comment - - if (!fileIsInDiff(path)) continue - - if (rule === 'MD011/no-reversed-links') { - const detailValue = details.slice(1, -1) - contextText = `[Context: "${detailValue}"]` - - const { line, position } = await findPositionInDiff(detailValue, path) - if (!line || position < 0) continue - - const [, link, text] = detailValue.match(/\((.*?)\)\[(.*?)\]/) - const suggestion = line.replace(detailValue, `[${text}](${link})`).replace('+', '') - const commentBody = createSuggestionText(suggestion) - comment = { path, position, body: commentBody } - } - - if (rule === 'MD042/no-empty-links') { - let link = context.match(/\[Context: "(\[.*?)"\]/)[1] - // if the context is too long, markdownlint-cli will truncate the string and append "..." at the end - if (link.endsWith('...')) { - link = link.substring(0, link.length - 3) - } - contextText = `[Context: "${escapeMarkdownlink(link)}"]` - const { position } = await findPositionInDiff(link, path) - if (position < 0) continue - comment = { path, position, body: getNoEmptyLinkText() } - } - - if (rule === 'MD040/fenced-code-language') { - contextText = '' - const codeBlockLines = findCodeBlock(path, +pointer.slice(1)) - const { start, end } = await findCodeBlockInDiff(codeBlockLines, path) - if (start < 0 || end < 0) continue - codeBlockLines[0] = codeBlockLines[0] + 'txt' - comment = { path, body: createMissingCodeFencesText(codeBlockLines), position: start } - } - - if (rule === 'search-replace') { - // [prefer-https-links: https links should be prefered] -> prefer-https-links - const ruleName = details.split(':')[0].slice(1) - if (ruleName === 'prefer-https-links') { - const [, text, link] = context.match(/\[Context:.*(\[.*\])(\(.*\)).*\]/) - description = 'https links should be preferred' - contextText = `[Context: "${escapeMarkdownlink(text + link)}"]` - const { line, position } = await findPositionInDiff(text + link, path) - if (!line || position < 0) continue - comment = { path, position, body: getInvalidUrlText(text, link.slice(1, -1)) } - } - - if (ruleName === 'custom-containers-requires-type') { - const [, row] = pointer.split(':') - const affectedLine = getLineFromFile(path, +row) - const containerType = suggestContainerType(affectedLine) || 'info' - const { line, position } = await findPositionInDiff(affectedLine, path) - - if (!line || position < 0) continue - const correctedLine = `::: ${containerType} ${affectedLine.split(':::').slice(1).join('').trim()}` - - description = 'container type should be specified' - contextText = `[Context: "${affectedLine}"]` - comment = { path, position, body: createSuggestContainerTypeText(correctedLine) } - } - } - - const text = `* **${path}**${pointer} ${description} ${contextText} ` - if (!linterErrors.find(el => el === text)) { - lintErrorsText += text + '\n' - comments.push(comment) - } - } - } - - if (existsSync(cspellLogFile)) { - let lines = readFileSync(cspellLogFile, 'utf-8').split('\n') - lines = Array.from({ length: lines.length / 2 }, (_el, idx) => lines[idx * 2] + lines[idx * 2 + 1].replace(/\t/g, '')) - - // we will create a review comment for each match - const matches = lines.map(line => line.replace(`${BASE_DIR}/`, '').match(cspellRegExp)) - const wordsWithoutSuggestions = [] - for (const [, path, pointer, word, context, suggestionString] of matches) { - if (!fileIsInDiff(path)) continue - const text = `* **${path}**${pointer} Unknown word "**${word}**" ` - if (spellingMistakes.find(el => el === text)) continue - // from "[s1, s2, s3]" to [ "s1", "s2", "s3" ] - const suggestions = suggestionString - .slice(1, -1) // remove brackets - .replace(/ /g, '') - .split(',') - .filter(Boolean) // remove empty strings - - const { line, position } = await findPositionInDiff(context, path) - if (!line || position < 0) continue - - // Github requires that no path starts with './', but cspell provides the paths exactly in this format - const properlyStructuredPath = path.replace(/^\.\//, '') - if (suggestions.length > 0) { - // replace word with first suggestions and remove first "+" sign - const suggestion = line.replace(word, suggestions[0]).replace('+', '') - const commentBody = createCspellSuggestionText(suggestion, suggestions.slice(1)) - comments.push({ path: properlyStructuredPath, position, body: commentBody }) - } else { - comments.push({ path: properlyStructuredPath, position, body: createUnknownWordComment(word) }) - wordsWithoutSuggestions.push(word) - } - spellingMistakesText += text + '\n' - } - - if (wordsWithoutSuggestions.length > 0 && comments.length > 0) { - spellingMistakesText += `\n${createWordsWithoutSuggestionsText(wordsWithoutSuggestions)}\n` - } - - if (matches.length > 0 && comments.length > 0) { - spellingMistakesText += `${getSpellingCorrectionTip()}\n` - } - } - - if (lintErrorsText) { - body += `Linting Errors\n---\n${lintErrorsText}` - } - - if (spellingMistakesText) { - body += `\nSpelling Mistakes\n---\n${spellingMistakesText}` - } - - if (body) { - body = '\n' + body - - await github.rest.pulls.createReview({ - owner: REPO_OWNER, - repo: REPO, - pull_number: PULL_NUMBER, - commit_id: HEAD_SHA, - body, - event: 'COMMENT', - comments - }) - } - - function fileIsInDiff(file) { - return typeof getDiff(file) !== 'undefined' - } - - function getDiff(file) { - const k = file.replace('./', '') - if (!(k in diffs)) throw new Error(`There is no diff for file ${file}. Diffs found for ${Object.keys(diffs).join('\n')}`) - return diffs[k] - } - - async function findPositionInDiff(context, file) { - const diff = getDiff(file) - - if (!diff) return { position: -1 } - - const idxToStartingCountingFrom = diff.findIndex(line => line.startsWith('@@') && !line.includes(' errors is in file with diff, but errors was not introduced with current PR - if (idxToStartingCountingFrom === -1 || idxOfLineToSearch === -1) { - return { position: -1 } - } - const position = idxOfLineToSearch - idxToStartingCountingFrom - return { line: diff[idxOfLineToSearch], position } - } - - async function findCodeBlockInDiff(lines, file) { - const diff = getDiff(file) - - if (!diff) return { position: -1 } - - let start = -1 - let end = -1 - for (let i = 0; i < diff.length; i++) { - for (let j = 0; j < lines.length; j++) { - if (diff[i + j].replace(/[-+]/, '') !== lines[j]) { - break - } - if (j === lines.length - 1) { - start = i - end = i + j - } - } - } - - if (start === -1 || end === -1) { - return { start: -1, end: -1 } - } - - const idxToStartingCoutingFrom = diff.findIndex(line => line.startsWith('@@')) - return { start: start - idxToStartingCoutingFrom, end: end - idxToStartingCoutingFrom } - } - - // startIdx starts at 1 - function findCodeBlock(file, startIdx) { - const lines = readFileSync(join(BASE_DIR, file), 'utf-8').split(/\n\r?/) - const endIdx = lines.findIndex((el, idx) => idx >= startIdx && /`{3,}/.test(el.trim())) - return lines.slice(startIdx - 1, endIdx + 1) - } - - function suggestContainerType(line) { - return (line.toLowerCase().match(/(info|tip|warning|danger|details|code-group|raw)/) || [])[0] - } - - function getLineFromFile(file, lineNumber) { - return readFileSync(join(BASE_DIR, file), 'utf-8').split(/\n\r?/)[lineNumber - 1] - } -} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 1770a1baa9..0000000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: Lint - -on: - pull_request: - branches: [main] - paths: - - '**.md' - merge_group: - workflow_dispatch: - -jobs: - suggestions: - runs-on: ubuntu-latest - if: '! github.event.pull_request.head.repo.fork' - permissions: - pull-requests: write - steps: - - name: Checkout SAP repo - run: | - git config --global credential.helper "cache --timeout=3600" - echo -e "url=https://user:${GH_TOKEN}@github.com\n" | git credential approve - echo -e "url=https://user:${GH_TOKEN_TOOLS_DOCS}@github.tools.sap\n" | git credential approve - git clone --depth 1 --no-single-branch https://github.tools.sap/cap/docs docs - cd docs - git checkout $GITHUB_HEAD_REF || git checkout main - git submodule update --init --recursive - cd @external - git checkout $GITHUB_HEAD_REF - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_TOKEN_TOOLS_DOCS: ${{ secrets.GH_TOKEN_TOOLS_DOCS }} - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: 'npm' - cache-dependency-path: docs/package-lock.json - - run: npm ci - working-directory: docs - - run: git checkout ${{ github.head_ref }} - working-directory: docs/@external - - name: Get changes - id: changes - working-directory: docs/@external - run: | - echo "DIFF_FILES=$(git diff --name-only --diff-filter=ACMRT ${{ github.event.pull_request.base.sha }} ${{ github.event.pull_request.head.sha }} -- '*.md' | xargs)" >> "$GITHUB_OUTPUT" - - name: Run cspell - if: steps.changes.outputs.DIFF_FILES != '' - id: cspell - continue-on-error: true - working-directory: docs/@external - run: | - npx cspell --no-progress --show-suggestions --show-context ${{ steps.changes.outputs.DIFF_FILES }} >> ${{ github.workspace }}/docs/@external/CSPELL.log - - name: Run markdownlint - if: steps.changes.outputs.DIFF_FILES != '' - id: markdownlint - continue-on-error: true - working-directory: docs/@external - run: | - npx markdownlint-cli --output ${{ github.workspace }}/docs/@external/MARKDOWNLINT.log -r markdownlint-rule-search-replace ${{ steps.changes.outputs.DIFF_FILES }} - - name: Create review - id: create_review - if: steps.cspell.outcome == 'failure' || steps.markdownlint.outcome == 'failure' - uses: actions/github-script@v6 - env: - SHA: ${{ github.event.pull_request.head.sha }} - BASE_DIR: ${{ github.workspace }}/docs/@external - BASE_SHA: ${{ github.event.pull_request.base.sha }} - PULL_NUMBER: ${{ github.event.number }} - HEAD_SHA: ${{ github.event.pull_request.head.sha }} - REPO: 'docs' - REPO_OWNER: 'cap-js' - with: - script: | - const script = require('${{ github.workspace }}/docs/@external/.github/etc/create-review.cjs') - await script({github, context, core, require, exec}) diff --git a/.markdownlint.yaml b/.markdownlint.yaml deleted file mode 100644 index 48d690ad45..0000000000 --- a/.markdownlint.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# For all rules see https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md -default: false -fenced-code-language: true -no-reversed-links: true -code-fence-style: - style: backtick -# proper-names: -# names: -# - SQLite -# - VS Code -#no-bare-urls: true -no-empty-links: true -search-replace: - rules: - - name: prefer-https-links - message: https links should be prefered - searchPattern: /\[.*?\]\(http:\/\/(?!localhost).*?\)/g - - name: custom-containers-requires-type - searchPattern: "/(?/gm - - - name: markdown_link - pattern: /-?\s*([*#]|\[.*?\])\(.*?\)/gm - - - name: heading_ids - pattern: /\{\s*#+.+\}/ - - - name: code-group - pattern: /:{3}\scode-group[\s\S]*?:{3}/gm - - - name: href_link - pattern: /href="[\s\S]*"/gm - - - name: fragments - pattern: /<(Fragment|span|div)\s+(id|target)="#?.*"[\s.]*/?>/g - - - name: heading - pattern: /^(#{1,6}.*)/ - - - name: bold_text - pattern: /\*{2}.*\*{2}|__.*__/gm - - - name: italic_text - pattern: /\*.*\*|_.*_/gm - - - name: i_tags - pattern: /.*<\/i>/g - - - name: cli_option - pattern: /(-[^\s]+)/g - - - name: property - pattern: /`?`\.[a-zA-Z]*?/g - - - name: property_in_code_block - pattern: /`(\..*)+?`/gm diff --git a/package.json b/package.json index 2839c9d5fe..f797be2837 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,9 @@ "@types/express": "latest", "@typescript-eslint/parser": "^8.0.0", "adm-zip": "^0.5.10", - "cspell": "^10", "express": "^5", "fflate": "^0.8.2", "globals": "^17.4.0", - "markdownlint-cli": ">=0.35.0", - "markdownlint-rule-search-replace": "^1.1.1", "monaco-editor": "^0.55.1", "sass": "^1.62.1", "vite": "^7", diff --git a/project-words.txt b/project-words.txt deleted file mode 100644 index 7ad8dd4989..0000000000 --- a/project-words.txt +++ /dev/null @@ -1,23 +0,0 @@ -aggregatable -Appl -Catweazle -CMIS -creat -CRUDQ -HCQL -IDONTEXIST -isdir -modulith -moduliths -nolink -overlayed -Reenskaug -Schlachter -SusaaS -SWAPI -Trygve -Undeploying -undiscloses -unlocalized -Woltmann -asprof From 3809880948aefadc87ed8f15d4ee7ba8b86fca43 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 12:14:50 +0000 Subject: [PATCH 032/156] Update dependency com.sap.cloud.security.ams.client:cap-ams-support to v3.8.1 (#2571) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [com.sap.cloud.security.ams.client:cap-ams-support](https://sap.github.io/cloud-identity-developer-guide) ([source](https://redirect.github.com/SAP/cloud-identity-developer-guide)) | `3.8.0` → `3.8.1` | ![age](https://developer.mend.io/api/mc/badges/age/maven/com.sap.cloud.security.ams.client:cap-ams-support/3.8.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.sap.cloud.security.ams.client:cap-ams-support/3.8.0/3.8.1?slim=true) | --- ### Configuration 📅 **Schedule**: (UTC) - 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. --- - [x] 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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vitepress/config.js b/.vitepress/config.js index 4266e5873c..f972802f2b 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -134,7 +134,7 @@ config.themeConfig.capire = { versions: { java_services: '4.9.0', java_cds4j: '4.9.0', - cloud_sec_ams: '3.8.0' + cloud_sec_ams: '3.8.1' }, gotoLinks: [], siteURL From 2600851fad2457e0b9a517d450b9d72bfef6070a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 12:15:06 +0000 Subject: [PATCH 033/156] Update dependency fflate to v0.8.3 (#2578) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [fflate](https://101arrowz.github.io/fflate) ([source](https://redirect.github.com/101arrowz/fflate)) | [`0.8.2` → `0.8.3`](https://renovatebot.com/diffs/npm/fflate/0.8.2/0.8.3) | ![age](https://developer.mend.io/api/mc/badges/age/npm/fflate/0.8.3?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/fflate/0.8.2/0.8.3?slim=true) | --- ### Release Notes
101arrowz/fflate (fflate) ### [`v0.8.3`](https://redirect.github.com/101arrowz/fflate/blob/HEAD/CHANGELOG.md#083) [Compare Source](https://redirect.github.com/101arrowz/fflate/compare/v0.8.2...v0.8.3) - Fix buffer over-read for Zip64 extra fields - Support sync flushes (`Z_SYNC_FLUSH` in zlib) - Allows for immediate decompression of all pushed bytes - Enables DEFLATE stream concatenation - Fix `zip`/`zipSync` when using cross-realm `Uint8Array` - Improve Zip64 support for streamed or undersized archives - Update performance estimates in README - Fix typings for TypeScript v5.7+ - Reduce memory consumption after compression stream completion
--- ### Configuration 📅 **Schedule**: (UTC) - 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. --- - [x] 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 b41c0e9af4..0f28570d0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4821,9 +4821,9 @@ } }, "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", + "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", "dev": true, "license": "MIT" }, From 53080b796b51698c526ee971fb5c9b04d7f653f2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 12:19:15 +0000 Subject: [PATCH 034/156] Update dependency @typescript-eslint/parser to v8.59.3 (#2570) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.59.2` → `8.59.3`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.59.2/8.59.3) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/8.59.3?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/8.59.2/8.59.3?slim=true) | --- ### Release Notes
typescript-eslint/typescript-eslint (@​typescript-eslint/parser) ### [`v8.59.3`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8593-2026-05-11) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.2...v8.59.3) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.3) for more information. 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**: (UTC) - 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. --- - [x] 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 0f28570d0c..afbf285f6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3055,16 +3055,16 @@ "license": "MIT" }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.2.tgz", - "integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", + "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.2", - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/typescript-estree": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2", + "@typescript-eslint/scope-manager": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/typescript-estree": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3" }, "engines": { @@ -3080,14 +3080,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.2.tgz", - "integrity": "sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", + "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.2", - "@typescript-eslint/types": "^8.59.2", + "@typescript-eslint/tsconfig-utils": "^8.59.3", + "@typescript-eslint/types": "^8.59.3", "debug": "^4.4.3" }, "engines": { @@ -3102,14 +3102,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.2.tgz", - "integrity": "sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", + "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2" + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3120,9 +3120,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.2.tgz", - "integrity": "sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", + "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", "dev": true, "license": "MIT", "engines": { @@ -3137,9 +3137,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.2.tgz", - "integrity": "sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", + "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", "dev": true, "license": "MIT", "engines": { @@ -3151,16 +3151,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.2.tgz", - "integrity": "sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", + "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.2", - "@typescript-eslint/tsconfig-utils": "8.59.2", - "@typescript-eslint/types": "8.59.2", - "@typescript-eslint/visitor-keys": "8.59.2", + "@typescript-eslint/project-service": "8.59.3", + "@typescript-eslint/tsconfig-utils": "8.59.3", + "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/visitor-keys": "8.59.3", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -3179,13 +3179,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.2.tgz", - "integrity": "sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==", + "version": "8.59.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", + "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.2", + "@typescript-eslint/types": "8.59.3", "eslint-visitor-keys": "^5.0.0" }, "engines": { From 1567b8dff9fea9add936b72db2f8bbbb69efd270 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 14:19:48 +0200 Subject: [PATCH 035/156] Update dependency @cap-js/cds-types to v0.17.0 (#2567) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@cap-js/cds-types](https://cap.cloud.sap/) ([source](https://redirect.github.com/cap-js/cds-types)) | [`0.16.0` → `0.17.0`](https://renovatebot.com/diffs/npm/@cap-js%2fcds-types/0.16.0/0.17.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@cap-js%2fcds-types/0.17.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@cap-js%2fcds-types/0.16.0/0.17.0?slim=true) | --- ### Release Notes
cap-js/cds-types (@​cap-js/cds-types) ### [`v0.17.0`](https://redirect.github.com/cap-js/cds-types/blob/HEAD/CHANGELOG.md#0170---2026-05-11) [Compare Source](https://redirect.github.com/cap-js/cds-types/compare/v0.16.0...v0.17.0) ##### Added - Types for nested `.where` and `.having` predicates - Passing events generated by cds-typer into `service.on` now offers code completion for the event's properties in the handler - Allow all events that can be used in `service.on` to be used in `service.once` as well ##### Changed - `ResultHandler` now returns `unknown` instead of `void`, to accommodate asynchronous functions when having `@typescript-eslint/strict-void-return` activated - Documentation for `cds.test.axios` mentioning that `@cap-js/cds-test@1` now returns an `axios` facade in absence of `axios`. - made `cds.context.locale` optional - `cds.tx(ƒ)` now returns the return type of `ƒ` ##### Deprecated - `cds.test.chai`, `cds.test.assert` pointing to either `cds.test.expect` or a custom import of `chai`. - `cds.test.axios` in favor of `cds.test.defaults` ##### Removed ##### Fixed ##### Security
--- ### Configuration 📅 **Schedule**: (UTC) - 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 afbf285f6e..b9559530cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -358,9 +358,9 @@ } }, "node_modules/@cap-js/cds-types": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@cap-js/cds-types/-/cds-types-0.16.0.tgz", - "integrity": "sha512-xirqV7rVIAK8fNDZDjB4aFkHcKWTu0y9gs0WdS65fez9m3Zh+L+i3TndlhIJLT7XmlEYMeM6IEl8KyNIoIRBhw==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@cap-js/cds-types/-/cds-types-0.17.0.tgz", + "integrity": "sha512-PmCEcIaKXbN5o9PsmuWPNja0t2q33/Em4Vj3eH7aPHzUfmoLCJuhKn7/0I3TFZcoSe4akOO0AEmZ4Och6dIZzw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", From 827c6d134772dc216ddf5dd7c51bcc1136aaeab8 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Tue, 19 May 2026 06:32:28 +0100 Subject: [PATCH 036/156] Learn More: Add new blog post series on local-first dev with CAP Node.js (#2577) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I've just finished the fourth and final blog post in this new short series on mocking data, auth, remote services and messaging. Co-authored-by: René Jeglinsky --- get-started/learn-more.md | 1 + 1 file changed, 1 insertion(+) diff --git a/get-started/learn-more.md b/get-started/learn-more.md index f747f2f9c8..c9a6b4b25b 100644 --- a/get-started/learn-more.md +++ b/get-started/learn-more.md @@ -154,6 +154,7 @@ SAP Developer Advocate [DJ Adams](https://qmacro.org) has compiled a vast number ### Blog post series - [The Art and Science of CAP](https://qmacro.org/blog/posts/2024/12/06/the-art-and-science-of-cap/) +- [Local-first dev with CAP Node.js](https://qmacro.org/blog/posts/2026/05/11/local-first-dev-with-cap-node-js/) - [Under the hood: CDS Expressions in CAP](https://qmacro.org/blog/posts/2025/12/09/a-new-hands-on-sap-dev-mini-series-on-the-core-expression-language-in-cds/) - [Modules, modularity & reuse in CDS models](https://qmacro.org/blog/posts/2026/01/01/modules-modularity-and-reuse-in-cds-models/) - [CAP Node.js Plugins](https://qmacro.org/blog/posts/2024/12/30/cap-node-js-plugins/) From 4974c4e745316fcce99c435b2115c70a6d8ed7ba Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 15:44:24 +0000 Subject: [PATCH 037/156] Update dependency @cap-js/cds-typer to v0.39.0 (#2566) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@cap-js/cds-typer](https://cap.cloud.sap/) ([source](https://redirect.github.com/cap-js/cds-typer)) | [`0.38.0` → `0.39.0`](https://renovatebot.com/diffs/npm/@cap-js%2fcds-typer/0.38.0/0.39.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@cap-js%2fcds-typer/0.39.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@cap-js%2fcds-typer/0.38.0/0.39.0?slim=true) | --- ### Release Notes
cap-js/cds-typer (@​cap-js/cds-typer) ### [`v0.39.0`](https://redirect.github.com/cap-js/cds-typer/blob/HEAD/CHANGELOG.md#0390---2026-05-11) [Compare Source](https://redirect.github.com/cap-js/cds-typer/compare/v0.38.0...v0.39.0) ##### Added - Added flag `cds.env.typer.branded_primitive_types` for branding CDS `type` definitions aliasing primitive TS types - Added support for non-ASCII identifiers in .cds files. Non-ASCII characters in identifiers are sanitised to valid TypeScript names. Identifiers consisting entirely of non-ASCII characters (e.g., Kanji) are replaced with random hashes. All affected identifiers are exported under their sanitised/hashed name and also as an alias preserving the original name. To use the original name, import it with `import ... as '...'` syntax. ##### Changed ##### Deprecated ##### Removed ##### Fixed - Association keys pointing to entities with inline enum types are now correctly typed in service projections across namespace boundaries ##### Security
--- ### Configuration 📅 **Schedule**: (UTC) - 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. --- - [x] 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 | 1510 +-------------------------------------------- 1 file changed, 16 insertions(+), 1494 deletions(-) diff --git a/package-lock.json b/package-lock.json index b9559530cc..d32a2da940 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,12 +22,9 @@ "@types/express": "latest", "@typescript-eslint/parser": "^8.0.0", "adm-zip": "^0.5.10", - "cspell": "^10", "express": "^5", "fflate": "^0.8.2", "globals": "^17.4.0", - "markdownlint-cli": ">=0.35.0", - "markdownlint-rule-search-replace": "^1.1.1", "monaco-editor": "^0.55.1", "sass": "^1.62.1", "vite": "^7", @@ -344,9 +341,9 @@ } }, "node_modules/@cap-js/cds-typer": { - "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==", + "version": "0.39.1", + "resolved": "https://registry.npmjs.org/@cap-js/cds-typer/-/cds-typer-0.39.1.tgz", + "integrity": "sha512-efMnQDA4NRu2xwX9Yncvcd92GtgIEVZOgemORxaLCbhigTqwFVpHG6i7FOxL+hqk21AEItMrdiWXVs3+kQxS9g==", "dev": true, "license": "Apache-2.0", "bin": { @@ -408,635 +405,6 @@ } } }, - "node_modules/@cspell/cspell-bundled-dicts": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-bundled-dicts/-/cspell-bundled-dicts-10.0.0.tgz", - "integrity": "sha512-ci410HEkng2582oOjlRHQtlGXwh+rUC/mVcN9dObLHpKhvPgzn2S6vT56pARstxxZpcCUG/oLhn3dCqdJlVzmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/dict-ada": "^4.1.1", - "@cspell/dict-al": "^1.1.1", - "@cspell/dict-aws": "^4.0.17", - "@cspell/dict-bash": "^4.2.2", - "@cspell/dict-companies": "^3.2.11", - "@cspell/dict-cpp": "^7.0.2", - "@cspell/dict-cryptocurrencies": "^5.0.5", - "@cspell/dict-csharp": "^4.0.8", - "@cspell/dict-css": "^4.1.1", - "@cspell/dict-dart": "^2.3.2", - "@cspell/dict-data-science": "^2.0.13", - "@cspell/dict-django": "^4.1.6", - "@cspell/dict-docker": "^1.1.17", - "@cspell/dict-dotnet": "^5.0.13", - "@cspell/dict-elixir": "^4.0.8", - "@cspell/dict-en_us": "^4.4.33", - "@cspell/dict-en-common-misspellings": "^2.1.12", - "@cspell/dict-en-gb-mit": "^3.1.22", - "@cspell/dict-filetypes": "^3.0.18", - "@cspell/dict-flutter": "^1.1.1", - "@cspell/dict-fonts": "^4.0.6", - "@cspell/dict-fsharp": "^1.1.1", - "@cspell/dict-fullstack": "^3.2.9", - "@cspell/dict-gaming-terms": "^1.1.2", - "@cspell/dict-git": "^3.1.0", - "@cspell/dict-golang": "^6.0.26", - "@cspell/dict-google": "^1.0.9", - "@cspell/dict-haskell": "^4.0.6", - "@cspell/dict-html": "^4.0.15", - "@cspell/dict-html-symbol-entities": "^4.0.5", - "@cspell/dict-java": "^5.0.12", - "@cspell/dict-julia": "^1.1.1", - "@cspell/dict-k8s": "^1.0.12", - "@cspell/dict-kotlin": "^1.1.1", - "@cspell/dict-latex": "^5.1.0", - "@cspell/dict-lorem-ipsum": "^4.0.5", - "@cspell/dict-lua": "^4.0.8", - "@cspell/dict-makefile": "^1.0.5", - "@cspell/dict-markdown": "^2.0.16", - "@cspell/dict-monkeyc": "^1.0.12", - "@cspell/dict-node": "^5.0.9", - "@cspell/dict-npm": "^5.2.38", - "@cspell/dict-php": "^4.1.1", - "@cspell/dict-powershell": "^5.0.15", - "@cspell/dict-public-licenses": "^2.0.16", - "@cspell/dict-python": "^4.2.26", - "@cspell/dict-r": "^2.1.1", - "@cspell/dict-ruby": "^5.1.1", - "@cspell/dict-rust": "^4.1.2", - "@cspell/dict-scala": "^5.0.9", - "@cspell/dict-shell": "^1.1.2", - "@cspell/dict-software-terms": "^5.2.2", - "@cspell/dict-sql": "^2.2.1", - "@cspell/dict-svelte": "^1.0.7", - "@cspell/dict-swift": "^2.0.6", - "@cspell/dict-terraform": "^1.1.3", - "@cspell/dict-typescript": "^3.2.3", - "@cspell/dict-vue": "^3.0.5", - "@cspell/dict-zig": "^1.0.0" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/cspell-json-reporter": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-json-reporter/-/cspell-json-reporter-10.0.0.tgz", - "integrity": "sha512-hq5dui2ngYMZKbBauX7K1tkqlu81sX/uaCO49ZJLPjeZsE1auZLtHehDLfAr/ZXoj/dLYeQMSKiaJyE+qLVPHA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-types": "10.0.0" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/cspell-performance-monitor": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-performance-monitor/-/cspell-performance-monitor-10.0.0.tgz", - "integrity": "sha512-2vMh2pLt2dg/ArYvWjMP4v9HCm0pRhONsEJyc8oHdZyOYvX7trixX894I0M39+VBf3yWtPCEgYRh1UDXNIZRig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/cspell-pipe": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-pipe/-/cspell-pipe-10.0.0.tgz", - "integrity": "sha512-qcgHhQvtEX8LSwIVsWrdUgiGim52lN3jT+ghlkdp72v+nBcGKsS2frEKTmbGLug+xcqppkzs6Q6VmsFp1MGtfA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/cspell-resolver": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-resolver/-/cspell-resolver-10.0.0.tgz", - "integrity": "sha512-8H+IUDB7SmrpcRugQ5f55qG81ZShk6nQRk+natLz41TEY98D8/LCmjHEkh/vhDPph9pVJmNUp7JcM2E1UHEa2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-directory": "^5.0.0" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/cspell-service-bus": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-service-bus/-/cspell-service-bus-10.0.0.tgz", - "integrity": "sha512-V7eigqg/TOoKwNK4Q18wr9KGxA8U5SFcoWVS8RyAxv4mQ+yNKHhvHEbRBifjPbQDer66afOrclb2UbqkIy2SOw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/cspell-types": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-types/-/cspell-types-10.0.0.tgz", - "integrity": "sha512-IQA++Idqb8fZzkCbHq3+T+9yG9WpeaBxomOrG2KcR/Pj0CgnovzuApYKL2cc35UWLePboKinMeqEPiweFpHVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/cspell-worker": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/cspell-worker/-/cspell-worker-10.0.0.tgz", - "integrity": "sha512-V5bjMldNksilnja3fu8muQmkW5/guyua1yNVOhoE2r7othSvjuDlGMl8g2bQSrWjp+UXu0dP/BEZ6JC/IfNwTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cspell-lib": "10.0.0" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/dict-ada": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-ada/-/dict-ada-4.1.1.tgz", - "integrity": "sha512-E+0YW9RhZod/9Qy2gxfNZiHJjCYFlCdI69br1eviQQWB8yOTJX0JHXLs79kOYhSW0kINPVUdvddEBe6Lu6CjGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-al": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-al/-/dict-al-1.1.1.tgz", - "integrity": "sha512-sD8GCaZetgQL4+MaJLXqbzWcRjfKVp8x+px3HuCaaiATAAtvjwUQ5/Iubiqwfd1boIh2Y1/3EgM3TLQ7Q8e0wQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-aws": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@cspell/dict-aws/-/dict-aws-4.0.17.tgz", - "integrity": "sha512-ORcblTWcdlGjIbWrgKF+8CNEBQiLVKdUOFoTn0KPNkAYnFcdPP0muT4892h7H4Xafh3j72wqB4/loQ6Nti9E/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-bash": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-bash/-/dict-bash-4.2.2.tgz", - "integrity": "sha512-kyWbwtX3TsCf5l49gGQIZkRLaB/P8g73GDRm41Zu8Mv51kjl2H7Au0TsEvHv7jzcsRLS6aUYaZv6Zsvk1fOz+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/dict-shell": "1.1.2" - } - }, - "node_modules/@cspell/dict-companies": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/@cspell/dict-companies/-/dict-companies-3.2.11.tgz", - "integrity": "sha512-0cmafbcz2pTHXLd59eLR1gvDvN6aWAOM0+cIL4LLF9GX9yB2iKDNrKsvs4tJRqutoaTdwNFBbV0FYv+6iCtebQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-cpp": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-cpp/-/dict-cpp-7.0.2.tgz", - "integrity": "sha512-dfbeERiVNeqmo/npivdR6rDiBCqZi3QtjH2Z0HFcXwpdj6i97dX1xaKyK2GUsO/p4u1TOv63Dmj5Vm48haDpuA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-cryptocurrencies": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-cryptocurrencies/-/dict-cryptocurrencies-5.0.5.tgz", - "integrity": "sha512-R68hYYF/rtlE6T/dsObStzN5QZw+0aQBinAXuWCVqwdS7YZo0X33vGMfChkHaiCo3Z2+bkegqHlqxZF4TD3rUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-csharp": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-csharp/-/dict-csharp-4.0.8.tgz", - "integrity": "sha512-qmk45pKFHSxckl5mSlbHxmDitSsGMlk/XzFgt7emeTJWLNSTUK//MbYAkBNRtfzB4uD7pAFiKgpKgtJrTMRnrQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-css": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.1.1.tgz", - "integrity": "sha512-y/Vgo6qY08e1t9OqR56qjoFLBCpi4QfWMf2qzD1l9omRZwvSMQGRPz4x0bxkkkU4oocMAeztjzCsmLew//c/8w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-dart": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-dart/-/dict-dart-2.3.2.tgz", - "integrity": "sha512-sUiLW56t9gfZcu8iR/5EUg+KYyRD83Cjl3yjDEA2ApVuJvK1HhX+vn4e4k4YfjpUQMag8XO2AaRhARE09+/rqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-data-science": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/@cspell/dict-data-science/-/dict-data-science-2.0.13.tgz", - "integrity": "sha512-l1HMEhBJkPmw4I2YGVu2eBSKM89K9pVF+N6qIr5Uo5H3O979jVodtuwP8I7LyPrJnC6nz28oxeGRCLh9xC5CVA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-django": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-django/-/dict-django-4.1.6.tgz", - "integrity": "sha512-SdbSFDGy9ulETqNz15oWv2+kpWLlk8DJYd573xhIkeRdcXOjskRuxjSZPKfW7O3NxN/KEf3gm3IevVOiNuFS+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-docker": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/@cspell/dict-docker/-/dict-docker-1.1.17.tgz", - "integrity": "sha512-OcnVTIpHIYYKhztNTyK8ShAnXTfnqs43hVH6p0py0wlcwRIXe5uj4f12n7zPf2CeBI7JAlPjEsV0Rlf4hbz/xQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-dotnet": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@cspell/dict-dotnet/-/dict-dotnet-5.0.13.tgz", - "integrity": "sha512-xPp7jMnFpOri7tzmqmm/dXMolXz1t2bhNqxYkOyMqXhvs08oc7BFs+EsbDY0X7hqiISgeFZGNqn0dOCr+ncPYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-elixir": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-elixir/-/dict-elixir-4.0.8.tgz", - "integrity": "sha512-CyfphrbMyl4Ms55Vzuj+mNmd693HjBFr9hvU+B2YbFEZprE5AG+EXLYTMRWrXbpds4AuZcvN3deM2XVB80BN/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-en_us": { - "version": "4.4.33", - "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.33.tgz", - "integrity": "sha512-zWftVqfUStDA37wO1ZNDN1qMJOfcxELa8ucHW8W8wBAZY3TK5Nb6deLogCK/IJi/Qljf30dwwuqqv84Qqle9Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-en-common-misspellings": { - "version": "2.1.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.12.tgz", - "integrity": "sha512-14Eu6QGqyksqOd4fYPuRb58lK1Va7FQK9XxFsRKnZU8LhL3N+kj7YKDW+7aIaAN/0WGEqslGP6lGbQzNti8Akw==", - "dev": true, - "license": "CC BY-SA 4.0" - }, - "node_modules/@cspell/dict-en-gb-mit": { - "version": "3.1.22", - "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.22.tgz", - "integrity": "sha512-xE5Vg6gGdMkZ1Ep6z9SJMMioGkkT1GbxS5Mm0U3Ey1/H68P0G7cJcyiVr1CARxFbLqKE4QUpoV1o6jz1Z5Yl9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-filetypes": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/@cspell/dict-filetypes/-/dict-filetypes-3.0.18.tgz", - "integrity": "sha512-yU7RKD/x1IWmDLzWeiItMwgV+6bUcU/af23uS0+uGiFUbsY1qWV/D4rxlAAO6Z7no3J2z8aZOkYIOvUrJq0Rcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-flutter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-flutter/-/dict-flutter-1.1.1.tgz", - "integrity": "sha512-UlOzRcH2tNbFhZmHJN48Za/2/MEdRHl2BMkCWZBYs+30b91mWvBfzaN4IJQU7dUZtowKayVIF9FzvLZtZokc5A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-fonts": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-fonts/-/dict-fonts-4.0.6.tgz", - "integrity": "sha512-aR/0csY01dNb0A1tw/UmN9rKgHruUxsYsvXu6YlSBJFu60s26SKr/k1o4LavpHTQ+lznlYMqAvuxGkE4Flliqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-fsharp": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-fsharp/-/dict-fsharp-1.1.1.tgz", - "integrity": "sha512-imhs0u87wEA4/cYjgzS0tAyaJpwG7vwtC8UyMFbwpmtw+/bgss+osNfyqhYRyS/ehVCWL17Ewx2UPkexjKyaBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-fullstack": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-fullstack/-/dict-fullstack-3.2.9.tgz", - "integrity": "sha512-diZX+usW5aZ4/b2T0QM/H/Wl9aNMbdODa1Jq0ReBr/jazmNeWjd+PyqeVgzd1joEaHY+SAnjrf/i9CwKd2ZtWQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-gaming-terms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-gaming-terms/-/dict-gaming-terms-1.1.2.tgz", - "integrity": "sha512-9XnOvaoTBscq0xuD6KTEIkk9hhdfBkkvJAIsvw3JMcnp1214OCGW8+kako5RqQ2vTZR3Tnf3pc57o7VgkM0q1Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-git": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-git/-/dict-git-3.1.0.tgz", - "integrity": "sha512-KEt9zGkxqGy2q1nwH4CbyqTSv5nadpn8BAlDnzlRcnL0Xb3LX9xTgSGShKvzb0bw35lHoYyLWN2ZKAqbC4pgGQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-golang": { - "version": "6.0.26", - "resolved": "https://registry.npmjs.org/@cspell/dict-golang/-/dict-golang-6.0.26.tgz", - "integrity": "sha512-YKA7Xm5KeOd14v5SQ4ll6afe9VSy3a2DWM7L9uBq4u3lXToRBQ1W5PRa+/Q9udd+DTURyVVnQ+7b9cnOlNxaRg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-google": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-google/-/dict-google-1.0.9.tgz", - "integrity": "sha512-biL65POqialY0i4g6crj7pR6JnBkbsPovB2WDYkj3H4TuC/QXv7Pu5pdPxeUJA6TSCHI7T5twsO4VSVyRxD9CA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-haskell": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-haskell/-/dict-haskell-4.0.6.tgz", - "integrity": "sha512-ib8SA5qgftExpYNjWhpYIgvDsZ/0wvKKxSP+kuSkkak520iPvTJumEpIE+qPcmJQo4NzdKMN8nEfaeci4OcFAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-html": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.15.tgz", - "integrity": "sha512-GJYnYKoD9fmo2OI0aySEGZOjThnx3upSUvV7mmqUu8oG+mGgzqm82P/f7OqsuvTaInZZwZbo+PwJQd/yHcyFIw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-html-symbol-entities": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", - "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-java": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-java/-/dict-java-5.0.12.tgz", - "integrity": "sha512-qPSNhTcl7LGJ5Qp6VN71H8zqvRQK04S08T67knMq9hTA8U7G1sTKzLmBaDOFhq17vNX/+rT+rbRYp+B5Nwza1A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-julia": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-julia/-/dict-julia-1.1.1.tgz", - "integrity": "sha512-WylJR9TQ2cgwd5BWEOfdO3zvDB+L7kYFm0I9u0s9jKHWQ6yKmfKeMjU9oXxTBxIufhCXm92SKwwVNAC7gjv+yA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-k8s": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-k8s/-/dict-k8s-1.0.12.tgz", - "integrity": "sha512-2LcllTWgaTfYC7DmkMPOn9GsBWsA4DZdlun4po8s2ysTP7CPEnZc1ZfK6pZ2eI4TsZemlUQQ+NZxMe9/QutQxg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-kotlin": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-kotlin/-/dict-kotlin-1.1.1.tgz", - "integrity": "sha512-J3NzzfgmxRvEeOe3qUXnSJQCd38i/dpF9/t3quuWh6gXM+krsAXP75dY1CzDmS8mrJAlBdVBeAW5eAZTD8g86Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-latex": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-latex/-/dict-latex-5.1.0.tgz", - "integrity": "sha512-qxT4guhysyBt0gzoliXYEBYinkAdEtR2M7goRaUH0a7ltCsoqqAeEV8aXYRIdZGcV77gYSobvu3jJL038tlPAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-lorem-ipsum": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-lorem-ipsum/-/dict-lorem-ipsum-4.0.5.tgz", - "integrity": "sha512-9a4TJYRcPWPBKkQAJ/whCu4uCAEgv/O2xAaZEI0n4y1/l18Yyx8pBKoIX5QuVXjjmKEkK7hi5SxyIsH7pFEK9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-lua": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@cspell/dict-lua/-/dict-lua-4.0.8.tgz", - "integrity": "sha512-N4PkgNDMu9JVsRu7JBS/3E/dvfItRgk9w5ga2dKq+JupP2Y3lojNaAVFhXISh4Y0a6qXDn2clA6nvnavQ/jjLA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-makefile": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-makefile/-/dict-makefile-1.0.5.tgz", - "integrity": "sha512-4vrVt7bGiK8Rx98tfRbYo42Xo2IstJkAF4tLLDMNQLkQ86msDlYSKG1ZCk8Abg+EdNcFAjNhXIiNO+w4KflGAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-markdown": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@cspell/dict-markdown/-/dict-markdown-2.0.16.tgz", - "integrity": "sha512-976RRqKv6cwhrxdFCQP2DdnBVB86BF57oQtPHy4Zbf4jF/i2Oy29MCrxirnOBalS1W6KQeto7NdfDXRAwkK4PQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@cspell/dict-css": "^4.1.1", - "@cspell/dict-html": "^4.0.15", - "@cspell/dict-html-symbol-entities": "^4.0.5", - "@cspell/dict-typescript": "^3.2.3" - } - }, - "node_modules/@cspell/dict-monkeyc": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/@cspell/dict-monkeyc/-/dict-monkeyc-1.0.12.tgz", - "integrity": "sha512-MN7Vs11TdP5mbdNFQP5x2Ac8zOBm97ARg6zM5Sb53YQt/eMvXOMvrep7+/+8NJXs0jkp70bBzjqU4APcqBFNAw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-node": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-node/-/dict-node-5.0.9.tgz", - "integrity": "sha512-hO+ga+uYZ/WA4OtiMEyKt5rDUlUyu3nXMf8KVEeqq2msYvAPdldKBGH7lGONg6R/rPhv53Rb+0Y1SLdoK1+7wQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-npm": { - "version": "5.2.38", - "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.38.tgz", - "integrity": "sha512-21ucGRPYYhr91C2cDBoMPTrcIOStQv33xOqJB0JLoC5LAs2Sfj9EoPGhGb+gIFVHz6Ia7JQWE2SJsOVFJD1wmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-php": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-php/-/dict-php-4.1.1.tgz", - "integrity": "sha512-EXelI+4AftmdIGtA8HL8kr4WlUE11OqCSVlnIgZekmTkEGSZdYnkFdiJ5IANSALtlQ1mghKjz+OFqVs6yowgWA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-powershell": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/@cspell/dict-powershell/-/dict-powershell-5.0.15.tgz", - "integrity": "sha512-l4S5PAcvCFcVDMJShrYD0X6Huv9dcsQPlsVsBGbH38wvuN7gS7+GxZFAjTNxDmTY1wrNi1cCatSg6Pu2BW4rgg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-public-licenses": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/@cspell/dict-public-licenses/-/dict-public-licenses-2.0.16.tgz", - "integrity": "sha512-EQRrPvEOmwhwWezV+W7LjXbIBjiy6y/shrET6Qcpnk3XANTzfvWflf9PnJ5kId/oKWvihFy0za0AV1JHd03pSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-python": { - "version": "4.2.26", - "resolved": "https://registry.npmjs.org/@cspell/dict-python/-/dict-python-4.2.26.tgz", - "integrity": "sha512-hbjN6BjlSgZOG2dA2DtvYNGBM5Aq0i0dHaZjMOI9K/9vRicVvKbcCiBSSrR3b+jwjhQL5ff7HwG5xFaaci0GQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/dict-data-science": "^2.0.13" - } - }, - "node_modules/@cspell/dict-r": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-r/-/dict-r-2.1.1.tgz", - "integrity": "sha512-71Ka+yKfG4ZHEMEmDxc6+blFkeTTvgKbKAbwiwQAuKl3zpqs1Y0vUtwW2N4b3LgmSPhV3ODVY0y4m5ofqDuKMw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-ruby": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-ruby/-/dict-ruby-5.1.1.tgz", - "integrity": "sha512-LHrp84oEV6q1ZxPPyj4z+FdKyq1XAKYPtmGptrd+uwHbrF/Ns5+fy6gtSi7pS+uc0zk3JdO9w/tPK+8N1/7WUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-rust": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-rust/-/dict-rust-4.1.2.tgz", - "integrity": "sha512-O1FHrumYcO+HZti3dHfBPUdnDFkI+nbYK3pxYmiM1sr+G0ebOd6qchmswS0Wsc6ZdEVNiPYJY/gZQR6jfW3uOg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-scala": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/@cspell/dict-scala/-/dict-scala-5.0.9.tgz", - "integrity": "sha512-AjVcVAELgllybr1zk93CJ5wSUNu/Zb5kIubymR/GAYkMyBdYFCZ3Zbwn4Zz8GJlFFAbazABGOu0JPVbeY59vGg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-shell": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-shell/-/dict-shell-1.1.2.tgz", - "integrity": "sha512-WqOUvnwcHK1X61wAfwyXq04cn7KYyskg90j4lLg3sGGKMW9Sq13hs91pqrjC44Q+lQLgCobrTkMDw9Wyl9nRFA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-software-terms": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.2.2.tgz", - "integrity": "sha512-0CaYd6TAsKtEoA7tNswm1iptEblTzEe3UG8beG2cpSTHk7afWIVMtJLgXDv0f/Li67Lf3Z1Jf3JeXR7GsJ2TRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-sql": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@cspell/dict-sql/-/dict-sql-2.2.1.tgz", - "integrity": "sha512-qDHF8MpAYCf4pWU8NKbnVGzkoxMNrFqBHyG/dgrlic5EQiKANCLELYtGlX5auIMDLmTf1inA0eNtv74tyRJ/vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-svelte": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@cspell/dict-svelte/-/dict-svelte-1.0.7.tgz", - "integrity": "sha512-hGZsGqP0WdzKkdpeVLBivRuSNzOTvN036EBmpOwxH+FTY2DuUH7ecW+cSaMwOgmq5JFSdTcbTNFlNC8HN8lhaQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-swift": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@cspell/dict-swift/-/dict-swift-2.0.6.tgz", - "integrity": "sha512-PnpNbrIbex2aqU1kMgwEKvCzgbkHtj3dlFLPMqW1vSniop7YxaDTtvTUO4zA++ugYAEL+UK8vYrBwDPTjjvSnA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-terraform": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-terraform/-/dict-terraform-1.1.3.tgz", - "integrity": "sha512-gr6wxCydwSFyyBKhBA2xkENXtVFToheqYYGFvlMZXWjviynXmh+NK/JTvTCk/VHk3+lzbO9EEQKee6VjrAUSbA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-typescript": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", - "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-vue": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@cspell/dict-vue/-/dict-vue-3.0.5.tgz", - "integrity": "sha512-Mqutb8jbM+kIcywuPQCCaK5qQHTdaByoEO2J9LKFy3sqAdiBogNkrplqUK0HyyRFgCfbJUgjz3N85iCMcWH0JA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dict-zig": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dict-zig/-/dict-zig-1.0.0.tgz", - "integrity": "sha512-XibBIxBlVosU06+M6uHWkFeT0/pW5WajDRYdXG2CgHnq85b0TI/Ks0FuBJykmsgi2CAD3Qtx8UHFEtl/DSFnAQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspell/dynamic-import": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/dynamic-import/-/dynamic-import-10.0.0.tgz", - "integrity": "sha512-fMqu/5Ma1Q5ZCR/Par+Q4pvaTKmx5pKZzQmkwld2hNounVdk2OaIPM9MzpNn6I1mLk5J+wTnIZmfcWNAzNP9aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/url": "10.0.0", - "import-meta-resolve": "^4.2.0" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/filetypes": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/filetypes/-/filetypes-10.0.0.tgz", - "integrity": "sha512-UP57j9yrDtlCHpFxc/eGho1m8DP5olfu9KRWwd5fiqL9nMSE2rUJtPzQyvqmDwO5bVZt3B+fTVdo4gxuiqw25A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/rpc": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/rpc/-/rpc-10.0.0.tgz", - "integrity": "sha512-QrpOZMwz2pAjvl6Hky2PauYoMpLCASn3osjn7uKUbgFV70sahyj6tmx4rRgRX7vHu2WQLZev+YsuO4EujiBDOg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/strong-weak-map": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/strong-weak-map/-/strong-weak-map-10.0.0.tgz", - "integrity": "sha512-JRsato0s2IjYdsng+AGL6oAqgZVQgih5aWKdmxs21H6EdhMaoFDmRE5kXm/RT5a6OMdtnzQM9DqeToqBChWIOQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/@cspell/url": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cspell/url/-/url-10.0.0.tgz", - "integrity": "sha512-q+0pHQ8DbqjemyaOn/mTtBRbCuKDqhnsVbZ6J9zkTsxPgMpccjy0s5oLXwomfrrxMRBH+UcbERwtUmE+SbnoIQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.18.0" - } - }, "node_modules/@docsearch/css": { "version": "3.8.2", "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.2.tgz", @@ -2935,15 +2303,8 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/katex": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.8.tgz", - "integrity": "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg==", - "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/linkify-it": { "version": "5.0.0", @@ -3613,19 +2974,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ansi-regex": { - "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": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3633,13 +2981,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/array-timsort": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", - "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", - "dev": true, - "license": "MIT" - }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -3833,35 +3174,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chalk": { - "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": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk-template": { - "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": { - "chalk": "^5.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", @@ -3895,17 +3207,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -3940,30 +3241,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/comment-json": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.6.2.tgz", - "integrity": "sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-timsort": "^1.0.3", - "esprima": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/content-disposition": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", @@ -4040,190 +3317,6 @@ "node": ">= 8" } }, - "node_modules/cspell": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cspell/-/cspell-10.0.0.tgz", - "integrity": "sha512-R25gsSR1SLlcGyw48fwJwp0PjXrVdl7RDO/Dm5+s4DvC1uQSlyiUxsr/8ZtbyC/MPeUJFQN9B4luqLlSm0WelQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-json-reporter": "10.0.0", - "@cspell/cspell-performance-monitor": "10.0.0", - "@cspell/cspell-pipe": "10.0.0", - "@cspell/cspell-types": "10.0.0", - "@cspell/cspell-worker": "10.0.0", - "@cspell/dynamic-import": "10.0.0", - "@cspell/url": "10.0.0", - "ansi-regex": "^6.2.2", - "chalk": "^5.6.2", - "chalk-template": "^1.1.2", - "commander": "^14.0.3", - "cspell-config-lib": "10.0.0", - "cspell-dictionary": "10.0.0", - "cspell-gitignore": "10.0.0", - "cspell-glob": "10.0.0", - "cspell-io": "10.0.0", - "cspell-lib": "10.0.0", - "fast-json-stable-stringify": "^2.1.0", - "flatted": "^3.4.2", - "semver": "^7.7.4", - "tinyglobby": "^0.2.15" - }, - "bin": { - "cspell": "bin.mjs", - "cspell-esm": "bin.mjs" - }, - "engines": { - "node": ">=22.18.0" - }, - "funding": { - "url": "https://github.com/streetsidesoftware/cspell?sponsor=1" - } - }, - "node_modules/cspell-config-lib": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cspell-config-lib/-/cspell-config-lib-10.0.0.tgz", - "integrity": "sha512-HWK7SRnJ3N/kOThw/uzmXmQYCzBxu58Jkq2hHyte1voDl118BeNFoaNRWMpYdHbBi3kCj8gaZu8wGtm+Zmdhxw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-types": "10.0.0", - "comment-json": "^4.6.2", - "smol-toml": "^1.6.1", - "yaml": "^2.8.3" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-dictionary": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cspell-dictionary/-/cspell-dictionary-10.0.0.tgz", - "integrity": "sha512-KubSoEAJO+77KPSSWjoLCz0+MIWVNq3joGTSyxucAZrBSJD64Y1O4BHHr1aj6XHIZwXhWWNScQlrQR3OcIulng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-performance-monitor": "10.0.0", - "@cspell/cspell-pipe": "10.0.0", - "@cspell/cspell-types": "10.0.0", - "cspell-trie-lib": "10.0.0", - "fast-equals": "^6.0.0" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-gitignore": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cspell-gitignore/-/cspell-gitignore-10.0.0.tgz", - "integrity": "sha512-55XLH9Y52eR7QgyV28Uaw8V9cN1YZ3PQIyrN9YBR4ndQNBKJxO9+jX1nwSspwnccCZiE/N+GGxFzRBb75JDSCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/url": "10.0.0", - "cspell-glob": "10.0.0", - "cspell-io": "10.0.0" - }, - "bin": { - "cspell-gitignore": "bin.mjs" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-glob": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cspell-glob/-/cspell-glob-10.0.0.tgz", - "integrity": "sha512-bXS35fMcA9X7GEkfnWBfoPd/vTnxxfXW+YHt6tWxu5fejfs00qUbjWp1oLC9FxRaXWxIkfsYp2mi1k1jYl4RVw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/url": "10.0.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-grammar": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cspell-grammar/-/cspell-grammar-10.0.0.tgz", - "integrity": "sha512-49udtYzkcCYEIDJbFOb4IwiAJebOYZnYvG6o6Ep19Tq0Xwjk7i4vxUprNiFNDCWFbcbJRPE9cpwQUVwp5WFGLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-pipe": "10.0.0", - "@cspell/cspell-types": "10.0.0" - }, - "bin": { - "cspell-grammar": "bin.mjs" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-io": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cspell-io/-/cspell-io-10.0.0.tgz", - "integrity": "sha512-NQCAUhx9DwKApxPuFl7EK1K1XSaQEAPld45yjjwv93xF8rJkEGkgzOwjbqafwAD20eKYv1a7oj/9EC0S5jETSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-service-bus": "10.0.0", - "@cspell/url": "10.0.0" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-lib": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cspell-lib/-/cspell-lib-10.0.0.tgz", - "integrity": "sha512-PowW6JEjuv/F2aFEirZvBxpzHdchOnpsUJbeIcFcai0++taLTbHQObROBEBf7e0S8DnHpVD5TZkqrTME5e44wg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspell/cspell-bundled-dicts": "10.0.0", - "@cspell/cspell-performance-monitor": "10.0.0", - "@cspell/cspell-pipe": "10.0.0", - "@cspell/cspell-resolver": "10.0.0", - "@cspell/cspell-types": "10.0.0", - "@cspell/dynamic-import": "10.0.0", - "@cspell/filetypes": "10.0.0", - "@cspell/rpc": "10.0.0", - "@cspell/strong-weak-map": "10.0.0", - "@cspell/url": "10.0.0", - "cspell-config-lib": "10.0.0", - "cspell-dictionary": "10.0.0", - "cspell-glob": "10.0.0", - "cspell-grammar": "10.0.0", - "cspell-io": "10.0.0", - "cspell-trie-lib": "10.0.0", - "env-paths": "^4.0.0", - "gensequence": "^8.0.8", - "import-fresh": "^4.0.0", - "resolve-from": "^5.0.0", - "vscode-languageserver-textdocument": "^1.0.12", - "vscode-uri": "^3.1.0", - "xdg-basedir": "^5.1.0" - }, - "engines": { - "node": ">=22.18.0" - } - }, - "node_modules/cspell-trie-lib": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/cspell-trie-lib/-/cspell-trie-lib-10.0.0.tgz", - "integrity": "sha512-R8qrMx10E/bm3Lecslwxn9XYo5NzSRK1rtandEX5n9UmEYHoBXjZELkg5+TOnV8VgrVaJSK57XtcGrbKp/4kSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.18.0" - }, - "peerDependencies": { - "@cspell/cspell-types": "10.0.0" - } - }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", @@ -4413,22 +3506,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/env-paths": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-4.0.0.tgz", - "integrity": "sha512-pxP8eL2SwwaTRi/KHYwLYXinDs7gL3jxFcBYmEdYfZmZXbaVDvdppd0XBU8qVz03rDfKZMXg1omHCbsJjZrMsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-safe-filename": "^0.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -4634,20 +3711,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esquery": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", @@ -4777,22 +3840,13 @@ "license": "MIT", "peer": true }, - "node_modules/fast-equals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-6.0.0.tgz", - "integrity": "sha512-PFhhIGgdM79r5Uztdj9Zb6Tt1zKafqVfdMGwVca1z5z6fbX7DmsySSuJd8HiP6I1j505DCS83cLxo5rmSNeVEA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -4908,7 +3962,8 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/floating-vue": { "version": "5.2.2", @@ -5002,29 +4057,6 @@ "node": ">= 4" } }, - "node_modules/gensequence": { - "version": "8.0.8", - "resolved": "https://registry.npmjs.org/gensequence/-/gensequence-8.0.8.tgz", - "integrity": "sha512-omMVniXEXpdx/vKxGnPRoO2394Otlze28TyxECbFVyoSpZ9H3EO7lemjcB12OpQJzRW4e5tt/dL1rOxry6aMHg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz", - "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -5085,22 +4117,6 @@ "node": ">=10.13.0" } }, - "node_modules/global-directory": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", - "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ini": "6.0.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "17.6.0", "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz", @@ -5286,30 +4302,6 @@ "dev": true, "license": "MIT" }, - "node_modules/import-fresh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-4.0.0.tgz", - "integrity": "sha512-Fpi660c7VPDM3fPKYovStd9IP1CPOikf6v/dGxJJMmHPcwYQIMJ4W7kO1avBYEpMqkCh+Dx3Ln6H7VYqgztLjw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=22.15" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-meta-resolve": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", - "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5328,16 +4320,6 @@ "dev": true, "license": "ISC" }, - "node_modules/ini": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", - "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^20.17.0 || >=22.9.0" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -5348,43 +4330,6 @@ "node": ">= 0.10" } }, - "node_modules/is-alphabetical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", - "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-alphanumerical": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", - "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-alphabetical": "^2.0.0", - "is-decimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-decimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", - "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5408,37 +4353,13 @@ "node": ">=0.10.0" } }, - "node_modules/is-hexadecimal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", - "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-safe-filename": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-safe-filename/-/is-safe-filename-0.1.1.tgz", - "integrity": "sha512-4SrR7AdnY11LHfDKTZY1u6Ga3RuxZdl3YKWWShO5iyuG5h8QS4GD2tOb04peBJ5I7pXbR+CGBNEhTcwK+FzN3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-what": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", @@ -5460,19 +4381,6 @@ "license": "ISC", "peer": true }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -5497,50 +4405,6 @@ "license": "MIT", "peer": true }, - "node_modules/jsonc-parser": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", - "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/katex": { - "version": "0.16.45", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.45.tgz", - "integrity": "sha512-pQpZbdBu7wCTmQUh7ufPmLr0pFoObnGUoL/yhtwJDgmmQpbkg/0HSVti25Fu4rmd1oCR6NGWe9vqTWuWv3GcNA==", - "dev": true, - "funding": [ - "https://opencollective.com/katex", - "https://github.com/sponsors/katex" - ], - "license": "MIT", - "dependencies": { - "commander": "^8.3.0" - }, - "bin": { - "katex": "cli.js" - } - }, - "node_modules/katex/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5661,103 +4525,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/markdownlint": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.40.0.tgz", - "integrity": "sha512-UKybllYNheWac61Ia7T6fzuQNDZimFIpCg2w6hHjgV1Qu0w1TV0LlSgryUGzM0bkKQCBhy2FDhEELB73Kb0kAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark": "4.0.2", - "micromark-core-commonmark": "2.0.3", - "micromark-extension-directive": "4.0.0", - "micromark-extension-gfm-autolink-literal": "2.1.0", - "micromark-extension-gfm-footnote": "2.1.0", - "micromark-extension-gfm-table": "2.1.1", - "micromark-extension-math": "3.1.0", - "micromark-util-types": "2.0.2", - "string-width": "8.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/DavidAnson" - } - }, - "node_modules/markdownlint-cli": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.48.0.tgz", - "integrity": "sha512-NkZQNu2E0Q5qLEEHwWj674eYISTLD4jMHkBzDobujXd1kv+yCxi8jOaD/rZoQNW1FBBMMGQpuW5So8B51N/e0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "~14.0.3", - "deep-extend": "~0.6.0", - "ignore": "~7.0.5", - "js-yaml": "~4.1.1", - "jsonc-parser": "~3.3.1", - "jsonpointer": "~5.0.1", - "markdown-it": "~14.1.1", - "markdownlint": "~0.40.0", - "minimatch": "~10.2.4", - "run-con": "~1.3.2", - "smol-toml": "~1.6.0", - "tinyglobby": "~0.2.15" - }, - "bin": { - "markdownlint": "markdownlint.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/markdownlint-cli/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/markdownlint-micromark": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.2.tgz", - "integrity": "sha512-jRxlQg8KpOfM2IbCL9RXM8ZiYWz2rv6DlZAnGv8ASJQpUh6byTBnEsbuMZ6T2/uIgntyf7SKg/mEaEBo1164fQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/markdownlint-rule-helpers": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.21.0.tgz", - "integrity": "sha512-27WM6H76t79EZjEl3jSabV0ZzXsC5QaSslI/5N1XuXV0mJRA6i3BPMGFrtZUbhlCNgtY6oC9h5JhtpDMv95tKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "markdownlint-micromark": "0.1.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/markdownlint-rule-search-replace": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/markdownlint-rule-search-replace/-/markdownlint-rule-search-replace-1.2.0.tgz", - "integrity": "sha512-l2eeVjb0ijxO+dO1ZrODcht+qnJ0VuiAAdBx1J8oa2kAugXl3NhxAGjfNuTfEJae5OQbdSGT+NjMczyzBXvWMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "markdownlint-rule-helpers": "0.21.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/marked": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", @@ -6117,102 +4884,6 @@ "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark-extension-directive": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz", - "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "parse-entities": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", - "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", - "dev": true, - "license": "MIT", - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-footnote": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", - "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-gfm-table": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", - "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "devlop": "^1.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/micromark-extension-math": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz", - "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/katex": "^0.16.0", - "devlop": "^1.0.0", - "katex": "^0.16.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/micromark-factory-destination": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", @@ -6897,33 +5568,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-entities": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", - "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/unist": "^2.0.0", - "character-entities-legacy": "^3.0.0", - "character-reference-invalid": "^2.0.0", - "decode-named-character-reference": "^1.0.0", - "is-alphanumerical": "^2.0.0", - "is-decimal": "^2.0.0", - "is-hexadecimal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", - "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", - "dev": true, - "license": "MIT" - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -7258,16 +5902,6 @@ "dev": true, "license": "MIT" }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/rfdc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", @@ -7337,45 +5971,6 @@ "node": ">= 18" } }, - "node_modules/run-con": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", - "integrity": "sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==", - "dev": true, - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~4.1.0", - "minimist": "^1.2.8", - "strip-json-comments": "~3.1.1" - }, - "bin": { - "run-con": "cli.js" - } - }, - "node_modules/run-con/node_modules/ini": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", - "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/run-con/node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -7668,19 +6263,6 @@ "simple-concat": "^1.0.0" } }, - "node_modules/smol-toml": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", - "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/cyyynthia" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -7732,23 +6314,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string-width": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.1.0.tgz", - "integrity": "sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.3.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -7764,22 +6329,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -8875,20 +7424,6 @@ } } }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", - "dev": true, - "license": "MIT" - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true, - "license": "MIT" - }, "node_modules/vue": { "version": "3.5.33", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.33.tgz", @@ -8956,19 +7491,6 @@ "dev": true, "license": "ISC" }, - "node_modules/xdg-basedir": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", - "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/yaml": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.4.tgz", From 0e3e7e87d596829c18d14f8913895fd8f4158ba9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 09:25:45 +0200 Subject: [PATCH 038/156] chore: Update CLI texts (#2584) 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 ef548c49f8..024b717cc6 100644 --- a/tools/assets/help/cds-version-md.out.md +++ b/tools/assets/help/cds-version-md.out.md @@ -14,5 +14,5 @@ | cds.root | | .../your-project | | npm root -l | | .../node_modules | | npm root -g | | .../node_modules | - | Node.js | 24.14.1 | .../bin/node | + | Node.js | 24.15.0 | .../bin/node |
diff --git a/tools/assets/help/cds-version.out.md b/tools/assets/help/cds-version.out.md index 4ab240193b..ccb237b50a 100644 --- a/tools/assets/help/cds-version.out.md +++ b/tools/assets/help/cds-version.out.md @@ -12,5 +12,5 @@ cds.root .../your-project npm root -l .../node_modules npm root -g .../node_modules - Node.js 24.14.1 .../bin/node + Node.js 24.15.0 .../bin/node From 80050f2372c353420a64556a49acf79aa8b2c996 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 09:26:32 +0200 Subject: [PATCH 039/156] Update shiki monorepo to v4.1.0 (#2583) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@shikijs/monaco](https://redirect.github.com/shikijs/shiki) ([source](https://redirect.github.com/shikijs/shiki/tree/HEAD/packages/monaco)) | [`4.0.2` → `4.1.0`](https://renovatebot.com/diffs/npm/@shikijs%2fmonaco/4.0.2/4.1.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@shikijs%2fmonaco/4.1.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@shikijs%2fmonaco/4.0.2/4.1.0?slim=true) | | [@shikijs/vitepress-twoslash](https://redirect.github.com/shikijs/shiki) ([source](https://redirect.github.com/shikijs/shiki/tree/HEAD/packages/vitepress-twoslash)) | [`4.0.2` → `4.1.0`](https://renovatebot.com/diffs/npm/@shikijs%2fvitepress-twoslash/4.0.2/4.1.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@shikijs%2fvitepress-twoslash/4.1.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@shikijs%2fvitepress-twoslash/4.0.2/4.1.0?slim=true) | --- ### Release Notes
shikijs/shiki (@​shikijs/monaco) ### [`v4.1.0`](https://redirect.github.com/shikijs/shiki/releases/tag/v4.1.0) [Compare Source](https://redirect.github.com/shikijs/shiki/compare/v4.0.2...v4.1.0) #####    🐞 Bug Fixes - **twoslash**: Forward `tsModule` to `createTwoslasher`  -  by [@​arthurfiorette](https://redirect.github.com/arthurfiorette) in [#​1271](https://redirect.github.com/shikijs/shiki/issues/1271) [(be89a)](https://redirect.github.com/shikijs/shiki/commit/be89afcf) #####     [View changes on GitHub](https://redirect.github.com/shikijs/shiki/compare/v4.0.2...v4.1.0)
--- ### Configuration 📅 **Schedule**: (UTC) - 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> --- package-lock.json | 226 +++++++++++++++++++++++----------------------- 1 file changed, 113 insertions(+), 113 deletions(-) diff --git a/package-lock.json b/package-lock.json index d32a2da940..9b685ceeae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1950,14 +1950,14 @@ } }, "node_modules/@shikijs/core": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.0.2.tgz", - "integrity": "sha512-hxT0YF4ExEqB8G/qFdtJvpmHXBYJ2lWW7qTHDarVkIudPFE6iCIrqdgWxGn5s+ppkGXI0aEGlibI0PAyzP3zlw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.1.0.tgz", + "integrity": "sha512-jLJtSJeuFffqX6/inRE1zqU5aFv2hrszvYgq3OjbAgFRZiWv7abKMDdQzYxuSDfmUPQozZvI/kuy6VMTvnvqTQ==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/primitive": "4.0.2", - "@shikijs/types": "4.0.2", + "@shikijs/primitive": "4.1.0", + "@shikijs/types": "4.1.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" @@ -1967,28 +1967,28 @@ } }, "node_modules/@shikijs/engine-javascript": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.0.2.tgz", - "integrity": "sha512-7PW0Nm49DcoUIQEXlJhNNBHyoGMjalRETTCcjMqEaMoJRLljy1Bi/EGV3/qLBgLKQejdspiiYuHGQW6dX94Nag==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.1.0.tgz", + "integrity": "sha512-YquhawCUgaBfhsS72e2Y/dI59gCBNPHu3fEO/tvLaXrTssxZrY5ddjtNLTwndrMgPo8b3IscE+xoICDzpTmlFQ==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "4.0.2", + "@shikijs/types": "4.1.0", "@shikijs/vscode-textmate": "^10.0.2", - "oniguruma-to-es": "^4.3.4" + "oniguruma-to-es": "^4.3.6" }, "engines": { "node": ">=20" } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.0.2.tgz", - "integrity": "sha512-UpCB9Y2sUKlS9z8juFSKz7ZtysmeXCgnRF0dlhXBkmQnek7lAToPte8DkxmEYGNTMii72zU/lyXiCB6StuZeJg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.1.0.tgz", + "integrity": "sha512-axLpjVs45YBvvINa+dJF+NPW+KtFkNXsFr4SDw2BMj9GdeMnGxVB9PQb2xXlJYovslt/nz6giedAyOANkfc7hg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "4.0.2", + "@shikijs/types": "4.1.0", "@shikijs/vscode-textmate": "^10.0.2" }, "engines": { @@ -1996,27 +1996,27 @@ } }, "node_modules/@shikijs/langs": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.0.2.tgz", - "integrity": "sha512-KaXby5dvoeuZzN0rYQiPMjFoUrz4hgwIE+D6Du9owcHcl6/g16/yT5BQxSW5cGt2MZBz6Hl0YuRqf12omRfUUg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.1.0.tgz", + "integrity": "sha512-nwOMruEkbgdZfQ/b8CgpNBVOpvG1k0N5tbmgiFeqsan401+x3ILqlzZJowSla4Agmq4hG2Uf2wh5jLTEhR8VSg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "4.0.2" + "@shikijs/types": "4.1.0" }, "engines": { "node": ">=20" } }, "node_modules/@shikijs/monaco": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/monaco/-/monaco-4.0.2.tgz", - "integrity": "sha512-yA49DPAjDyj9D8yxyr1S7qjcT1TVv6BqhZ+sXccwqcdp83RuncYOCUkJ1rjqAu3NA8YDc2wdesD+/js5pHJdqg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/monaco/-/monaco-4.1.0.tgz", + "integrity": "sha512-jnCofD2i7kZa57qX0KOKKyxGmuu9Eb+lVXRRhwqOT3pOo9gLvQquVMVqQymwpbum7Jm7NTsXzEytnJFF/SvXSg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "4.0.2", - "@shikijs/types": "4.0.2", + "@shikijs/core": "4.1.0", + "@shikijs/types": "4.1.0", "@shikijs/vscode-textmate": "^10.0.2" }, "engines": { @@ -2024,13 +2024,13 @@ } }, "node_modules/@shikijs/primitive": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.0.2.tgz", - "integrity": "sha512-M6UMPrSa3fN5ayeJwFVl9qWofl273wtK1VG8ySDZ1mQBfhCpdd8nEx7nPZ/tk7k+TYcpqBZzj/AnwxT9lO+HJw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.1.0.tgz", + "integrity": "sha512-zx2/2Uwj2q9X3KSyYREEhXO23xBw5WUhP4orK2lE4r+t9JGITmEe0JH+wPmJhqHpOT2bRRs6lAL945+LDvOAGw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "4.0.2", + "@shikijs/types": "4.1.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" }, @@ -2039,13 +2039,13 @@ } }, "node_modules/@shikijs/themes": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.0.2.tgz", - "integrity": "sha512-mjCafwt8lJJaVSsQvNVrJumbnnj1RI8jbUKrPKgE6E3OvQKxnuRoBaYC51H4IGHePsGN/QtALglWBU7DoKDFnA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.1.0.tgz", + "integrity": "sha512-emCcTnUM7yO2wltYbaxm+yLvcCI4+h8XBKc4KmJ7EZUXoSGjcCHifkI//R4OFit9ewpg7H2/9tjOuXrT2v/Knw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "4.0.2" + "@shikijs/types": "4.1.0" }, "engines": { "node": ">=20" @@ -2124,15 +2124,15 @@ } }, "node_modules/@shikijs/twoslash": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-4.0.2.tgz", - "integrity": "sha512-yHRudhirlMxOwDO6Q4OFU9hJMvUqNkY8hwtUfbaSEoG7A2cYicdO4c8fdDaDtyJ50HK7I8vTokrkIHTK3DCkLQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-4.1.0.tgz", + "integrity": "sha512-XD7d3LqLXOaL6PbFKGwtdnfcyBdOfKWfxb1+c4MVknVTemwnMQxqj1wYhhWBLRdk8H3Fp9pyf/FILfy2Nzeg8g==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "4.0.2", - "@shikijs/types": "4.0.2", - "twoslash": "^0.3.6" + "@shikijs/core": "4.1.0", + "@shikijs/types": "4.1.0", + "twoslash": "^0.3.8" }, "engines": { "node": ">=20" @@ -2142,9 +2142,9 @@ } }, "node_modules/@shikijs/types": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.0.2.tgz", - "integrity": "sha512-qzbeRooUTPnLE+sHD/Z8DStmaDgnbbc/pMrU203950aRqjX/6AFHeDYT+j00y2lPdz0ywJKx7o/7qnqTivtlXg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.1.0.tgz", + "integrity": "sha512-3EQWX54fMpniOrDblzAhiwiJwpiTMW6+B9DWyUd9ska483tbayFYuw47UxwuPknI31bKnySfVQ/QW+jFL4rFdA==", "dev": true, "license": "MIT", "dependencies": { @@ -2156,13 +2156,13 @@ } }, "node_modules/@shikijs/vitepress-twoslash": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@shikijs/vitepress-twoslash/-/vitepress-twoslash-4.0.2.tgz", - "integrity": "sha512-Bk01fAYDDiTffRPLHNJdNlYwzExXIVcrHUVNciD931SMlKZArvteKib6mM3mWAUhcy78RW1llT3fczjKIgQHBA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@shikijs/vitepress-twoslash/-/vitepress-twoslash-4.1.0.tgz", + "integrity": "sha512-/eXm6H0fAcLKjU+DyEKBNjQeqpIoeCbY10IO8i8FftB7juVAX1Or49AFBJGRYfrKgTrXOaLsNaocL3jV/dgoTg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/twoslash": "4.0.2", + "@shikijs/twoslash": "4.1.0", "floating-vue": "^5.2.2", "lz-string": "^1.5.0", "magic-string": "^0.30.21", @@ -2171,10 +2171,10 @@ "mdast-util-gfm": "^3.1.0", "mdast-util-to-hast": "^13.2.1", "ohash": "^2.0.11", - "shiki": "4.0.2", - "twoslash": "^0.3.6", - "twoslash-vue": "^0.3.6", - "vue": "^3.5.29" + "shiki": "4.1.0", + "twoslash": "^0.3.8", + "twoslash-vue": "^0.3.8", + "vue": "^3.5.34" }, "engines": { "node": ">=20" @@ -2595,14 +2595,14 @@ "license": "MIT" }, "node_modules/@vue/compiler-core": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.33.tgz", - "integrity": "sha512-3PZLQwFw4Za3TC8t0FvTy3wI16Kt+pmwcgNZca4Pj9iWL2E72a/gZlpBtAJvEdDMdCxdG/qq0C7PN0bsJuv0Rw==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.34.tgz", + "integrity": "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/shared": "3.5.33", + "@babel/parser": "^7.29.3", + "@vue/shared": "3.5.34", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" @@ -2622,43 +2622,43 @@ } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.33.tgz", - "integrity": "sha512-PXq0yrfCLzzL07rbXO4awtXY1Z06LG2eu6Adg3RJFa/j3Cii217XxxLXG22N330gw7GmALCY0Z8RgXEviwgpjA==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.34.tgz", + "integrity": "sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-core": "3.5.34", + "@vue/shared": "3.5.34" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.33.tgz", - "integrity": "sha512-UTUvRO9cY+rROrx/pvN9P5Z7FgA6QGfokUCfhQE4EnmUj3rVnK+CHI0LsEO1pg+I7//iRYMUfcNcCPe7tg0CoA==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.34.tgz", + "integrity": "sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.2", - "@vue/compiler-core": "3.5.33", - "@vue/compiler-dom": "3.5.33", - "@vue/compiler-ssr": "3.5.33", - "@vue/shared": "3.5.33", + "@babel/parser": "^7.29.3", + "@vue/compiler-core": "3.5.34", + "@vue/compiler-dom": "3.5.34", + "@vue/compiler-ssr": "3.5.34", + "@vue/shared": "3.5.34", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.10", + "postcss": "^8.5.14", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.33.tgz", - "integrity": "sha512-IErjYdnj1qIupG5xxiVIYiiRvDhGWV4zuh/RCrwfYpuL+HWQzeU6lCk/nF9r7olWMnjKxCAkOctT2qFWFkzb1A==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.34.tgz", + "integrity": "sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-dom": "3.5.34", + "@vue/shared": "3.5.34" } }, "node_modules/@vue/devtools-api": { @@ -2714,57 +2714,57 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.33.tgz", - "integrity": "sha512-p8UfIqyIhb0rYGlSgSBV+lPhF2iUSBcRy7enhTmPqKWadHy9kcOFYF1AejYBP9P+avnd3OBbD49DU4pLWX/94A==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.34.tgz", + "integrity": "sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.5.33" + "@vue/shared": "3.5.34" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.33.tgz", - "integrity": "sha512-UpFF45RI9//a7rvq7RdOQblb4tup7hHG9QsmIrxkFQLzQ7R8/iNQ5LE15NhLZ1/WcHMU2b47u6P33CPUelHyIQ==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.34.tgz", + "integrity": "sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/reactivity": "3.5.34", + "@vue/shared": "3.5.34" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.33.tgz", - "integrity": "sha512-IOxMsAOwquhfITgmOgaPYl7/j8gKUxUFoflRc+u4LxyD3+783xne8vNta1PONVCvCV9A0w7hkyEepINDqfO0tw==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.34.tgz", + "integrity": "sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.33", - "@vue/runtime-core": "3.5.33", - "@vue/shared": "3.5.33", + "@vue/reactivity": "3.5.34", + "@vue/runtime-core": "3.5.34", + "@vue/shared": "3.5.34", "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.33.tgz", - "integrity": "sha512-0xylq/8/h44lVG0pZFknv1XIdEgymq2E9n59uTWJBG+dIgiT0TMCSsxrN7nO16Z0MU0MPjFcguBbZV8Itk52Hw==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.34.tgz", + "integrity": "sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-ssr": "3.5.34", + "@vue/shared": "3.5.34" }, "peerDependencies": { - "vue": "3.5.33" + "vue": "3.5.34" } }, "node_modules/@vue/shared": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.33.tgz", - "integrity": "sha512-5vR2QIlmaLG77Ygd4pMP6+SGQ5yox9VhtnbDWTy9DzMzdmeLxZ1QqxrywEZ9sa1AVubfIJyaCG3ytyWU81ufcQ==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz", + "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==", "dev": true, "license": "MIT" }, @@ -6121,18 +6121,18 @@ } }, "node_modules/shiki": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz", - "integrity": "sha512-eAVKTMedR5ckPo4xne/PjYQYrU3qx78gtJZ+sHlXEg5IHhhoQhMfZVzetTYuaJS0L2Ef3AcCRzCHV8T0WI6nIQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.1.0.tgz", + "integrity": "sha512-l/ABZPUR5v70jI10EzqfMS/I96vjSGv2y0ihUV+WYFzv0EfvW4s54m0Lg8wCrrL+2IkwBzFTuxkZjPf8b2NX9Q==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "4.0.2", - "@shikijs/engine-javascript": "4.0.2", - "@shikijs/engine-oniguruma": "4.0.2", - "@shikijs/langs": "4.0.2", - "@shikijs/themes": "4.0.2", - "@shikijs/types": "4.0.2", + "@shikijs/core": "4.1.0", + "@shikijs/engine-javascript": "4.1.0", + "@shikijs/engine-oniguruma": "4.1.0", + "@shikijs/langs": "4.1.0", + "@shikijs/themes": "4.1.0", + "@shikijs/types": "4.1.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" }, @@ -7425,17 +7425,17 @@ } }, "node_modules/vue": { - "version": "3.5.33", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.33.tgz", - "integrity": "sha512-1AgChhx5w3ALgT4oK3acm2Es/7jyZhWSVUfs3rOBlGQC0rjEDkS7G4lWlJJGGNQD+BV3reCwbQrOe1mPNwKHBQ==", + "version": "3.5.34", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.34.tgz", + "integrity": "sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.33", - "@vue/compiler-sfc": "3.5.33", - "@vue/runtime-dom": "3.5.33", - "@vue/server-renderer": "3.5.33", - "@vue/shared": "3.5.33" + "@vue/compiler-dom": "3.5.34", + "@vue/compiler-sfc": "3.5.34", + "@vue/runtime-dom": "3.5.34", + "@vue/server-renderer": "3.5.34", + "@vue/shared": "3.5.34" }, "peerDependencies": { "typescript": "*" From 0a66f9a13dd0f2b10514c0b4aac2bf82acd32ab1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 20 May 2026 09:27:15 +0200 Subject: [PATCH 040/156] Update dependency @typescript-eslint/parser to v8.59.4 (#2581) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.59.3` → `8.59.4`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.59.3/8.59.4) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/8.59.4?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/8.59.3/8.59.4?slim=true) | --- ### Release Notes
typescript-eslint/typescript-eslint (@​typescript-eslint/parser) ### [`v8.59.4`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8594-2026-05-18) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.3...v8.59.4) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.59.4) for more information. 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**: (UTC) - 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 9b685ceeae..db88d1588d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2416,16 +2416,16 @@ "license": "MIT" }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.3.tgz", - "integrity": "sha512-HPwA+hVkfcriajbNvTmZv4VRauibay+cWArYUYq7u7W7PmGShMxbPxLvrwDme55a6d5alG3nrYfhyJ/G28XlLg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", + "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/typescript-estree": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", + "@typescript-eslint/scope-manager": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/typescript-estree": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", "debug": "^4.4.3" }, "engines": { @@ -2441,14 +2441,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.3.tgz", - "integrity": "sha512-ECiUWa/KYRGDFUqTNehaRgzDshnJfkTABJxVemHk4ko22gcr0ukloKjWvyQ64g8YCV/UI47kN1dbmjf/GaQYng==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", + "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.3", - "@typescript-eslint/types": "^8.59.3", + "@typescript-eslint/tsconfig-utils": "^8.59.4", + "@typescript-eslint/types": "^8.59.4", "debug": "^4.4.3" }, "engines": { @@ -2463,14 +2463,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.3.tgz", - "integrity": "sha512-t2LvZnoEfzKtnPjgeEu41xw5gxq9mQVfYy4OoZ4Vlt0sk3JwxmhCca/AR7DwOiHrjWgjAj6as4AhRLKSDfvZIA==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", + "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3" + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2481,9 +2481,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.3.tgz", - "integrity": "sha512-PcIJHjmaREXLgIAIzLnSY9VucEzz8FKXsRgFa1DmdGCK/5tJpW03TKJF01Q6VZd1lLdz2sIKPWaDUZN9dp//dw==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", + "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", "dev": true, "license": "MIT", "engines": { @@ -2498,9 +2498,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.3.tgz", - "integrity": "sha512-ePFoH0g4ludssdRFqqDxQePCxU4WQyRa9+XVwjm7yLn0FKhMeoetC+qBEEI1Eyb1pGSDveTIT09Bvw2WhlGayg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", + "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", "dev": true, "license": "MIT", "engines": { @@ -2512,16 +2512,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.3.tgz", - "integrity": "sha512-CbRjVRAf7Lr9Kr8RopKcbY45p2VfmmHrm0ygOCYFi7oU8q19m0Fs/6iHS7kNOmwpp+ob07ZVcAqlxUod9lYdmg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", + "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.3", - "@typescript-eslint/tsconfig-utils": "8.59.3", - "@typescript-eslint/types": "8.59.3", - "@typescript-eslint/visitor-keys": "8.59.3", + "@typescript-eslint/project-service": "8.59.4", + "@typescript-eslint/tsconfig-utils": "8.59.4", + "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/visitor-keys": "8.59.4", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -2540,13 +2540,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.3", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.3.tgz", - "integrity": "sha512-f1UQF7ggd42YiwI5wGrRaPsa+P0CINBlrkLPmGfpq/u/I/oVtecoEIfFR9ag/oa1sLOsRNZ6xehf6qMZhQGBDg==", + "version": "8.59.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", + "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.3", + "@typescript-eslint/types": "8.59.4", "eslint-visitor-keys": "^5.0.0" }, "engines": { From 1f51c5d75a1ca0717bf00dc26d4400999166f063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Jeglinsky?= Date: Thu, 21 May 2026 19:05:57 +0200 Subject: [PATCH 041/156] Add `httpc` language alias for php (#2580) This is how it looks like: image --------- Co-authored-by: Christian Georgi --- .vitepress/languages/index.ts | 22 +++++++++++++++---- .../components/cds-playground/highlighter.js | 5 ++++- guides/uis/fiori.md | 6 ++--- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/.vitepress/languages/index.ts b/.vitepress/languages/index.ts index bfca47efef..c422eb9049 100644 --- a/.vitepress/languages/index.ts +++ b/.vitepress/languages/index.ts @@ -1,12 +1,26 @@ -import cds from './cds.tmLanguage.json' with {type:'json'} -import csv from './csv.tmLanguage.json' with {type:'json'} -import log from './log.tmLanguage.json' with {type:'json'} -import scsv from './scsv.tmLanguage.json' with {type:'json'} +import { bundledLanguages } from 'shiki' +import cds from './cds.tmLanguage.json' with { type: 'json' } +import csv from './csv.tmLanguage.json' with { type: 'json' } +import log from './log.tmLanguage.json' with { type: 'json' } +import scsv from './scsv.tmLanguage.json' with { type: 'json' } import type { LanguageInput } from 'shiki' + export default [ + { ...cds, aliases:['cds','cdl','dcl','cql'] }, { ...csv, aliases:['csv','csvc'] }, { ...scsv, aliases:['csvs'] }, { ...log, aliases:['log','logs'] }, + () => langAlias('php', 'httpc'), + ] as LanguageInput[] + +async function langAlias(targetLang: keyof typeof bundledLanguages, alias: string) { + const grammars = (await bundledLanguages[targetLang]()).default + const targetScope = `source.${targetLang}` + return grammars.map(g => g.scopeName === targetScope + ? { ...g, aliases: [...(g.aliases ?? []), alias] } + : g, + ) +} diff --git a/.vitepress/theme/components/cds-playground/highlighter.js b/.vitepress/theme/components/cds-playground/highlighter.js index 8f6fe37ad4..5dce6261c4 100644 --- a/.vitepress/theme/components/cds-playground/highlighter.js +++ b/.vitepress/theme/components/cds-playground/highlighter.js @@ -4,7 +4,10 @@ import languages from '../../../languages' const highlighter = await createHighlighter({ themes: ['github-dark', 'github-light'], langs: ['javascript', 'js', 'sql', 'typescript', 'vue', ...languages], - langAlias: Object.fromEntries( languages.map(l => l.aliases?.map(alias => [alias, l.name])) ) + langAlias: Object.fromEntries(languages.flatMap(l => { + if (!l || typeof l !== 'object' || !Array.isArray(l.aliases) || !l.name) return [] + return l.aliases.map(alias => [alias, l.name]) + })) }) export default highlighter diff --git a/guides/uis/fiori.md b/guides/uis/fiori.md index bfaa2224f7..76b3e42154 100644 --- a/guides/uis/fiori.md +++ b/guides/uis/fiori.md @@ -306,7 +306,7 @@ Draft locks are not applied when creating drafts for new entities, as there is n The HTTP requests sent from Fiori clients that deal with drafts are as follows: -```php:line-numbers [Requests to draft data] +```httpc:line-numbers [Requests to draft data] POST /Foo/draftNew //> NEW POST /Foo(ID,IsActiveEntity=true)/draftEdit //> EDIT GET /Foo(ID,IsActiveEntity=false) //> READ @@ -347,7 +347,7 @@ Content-Type: application/json Add `IsActiveEntity=true` as a key parameter to your requests to address *active* data directly, bypassing potentially existing drafts, for example: -```php:line-numbers [Requests to active data] +```httpc:line-numbers [Requests to active data] POST /Books { IsActiveEntity:true, ... } //> CREATE PATCH /Books(ID=201,IsActiveEntity=true) {...} //> UPDATE DELETE /Books(ID=201,IsActiveEntity=true) //> DELETE @@ -362,7 +362,7 @@ While this was always possible in CAP Java before, it's available for CAP Node.j Going one step further, we assume `IsActiveEntity=true` by default, so that clients which don't know anything about drafts, or don't want to deal with them, can simply ignore any draft-specific requests and parameters: -```php:line-numbers [Draft-agnostic requests to active data] +```httpc:line-numbers [Draft-agnostic requests to active data] POST /Foo //> CREATE GET /Foo(ID) //> READ PATCH /Foo(ID) {...} //> UPDATE From 530f24f4dd459cb408d3774bf2ff2859e9b71327 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 26 May 2026 13:47:39 +0200 Subject: [PATCH 042/156] Update dependency @typescript-eslint/parser to v8.60.0 (#2591) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@typescript-eslint/parser](https://typescript-eslint.io/packages/parser) ([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`8.59.4` → `8.60.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.59.4/8.60.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/8.60.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/8.59.4/8.60.0?slim=true) | --- ### Release Notes
typescript-eslint/typescript-eslint (@​typescript-eslint/parser) ### [`v8.60.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8600-2026-05-25) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.59.4...v8.60.0) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.60.0) for more information. 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**: (UTC) - 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 db88d1588d..46824f58de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2416,16 +2416,16 @@ "license": "MIT" }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.4.tgz", - "integrity": "sha512-zORHqO/tuhxY1zWuTvMUqddRxpiFJ72xVfcNoWpqdLjs6lfPbuQBJuW4pk+49/uBMy7Ssr4bzgjiKmmDB1UbZQ==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz", + "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/typescript-estree": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", + "@typescript-eslint/scope-manager": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/typescript-estree": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", "debug": "^4.4.3" }, "engines": { @@ -2441,14 +2441,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.4.tgz", - "integrity": "sha512-Ly00Vu4oAacfDeHp2Zg85ioNG6l8HG+tN1D7J+xTHSxu9y0awYKJ2zH1rFBn8ZSfuGK+7FxK3Cgl3uAz0aZZLg==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", + "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.4", - "@typescript-eslint/types": "^8.59.4", + "@typescript-eslint/tsconfig-utils": "^8.60.0", + "@typescript-eslint/types": "^8.60.0", "debug": "^4.4.3" }, "engines": { @@ -2463,14 +2463,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.4.tgz", - "integrity": "sha512-mUeR/3H1WrTAddJrwut8OoPjfauaztMQmRwV5fQTUyNVJCLiUXXe4lGEyYIL2oFDpP7UtgbGJXCt72wT0z2S3Q==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", + "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4" + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2481,9 +2481,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.4.tgz", - "integrity": "sha512-DLCpnKgD4alVxTBSKulK+gU1KCqOgUXfDRDXh2mZgzokQKa/70ax93I2uVO3m/LLvIAtWZIFoiifudmIqAxpMA==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", + "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", "dev": true, "license": "MIT", "engines": { @@ -2498,9 +2498,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.4.tgz", - "integrity": "sha512-F1o7WJcCq+bc8dwcO/YsSEOudAH8RDtaOhM6wcAQhcUsFhnWQl81JKy48q1hoxAU0qrzM89+31GYh1515Zde3Q==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz", + "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", "dev": true, "license": "MIT", "engines": { @@ -2512,16 +2512,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.4.tgz", - "integrity": "sha512-F+RuOmcDXo4+TPdfd/TCLS3m2nw8gE9XXyZLrA3JBfaA5tz9TtdkyD3YJFmPxulyc2cKbEok/CvFE3MgSLWnag==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", + "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.4", - "@typescript-eslint/tsconfig-utils": "8.59.4", - "@typescript-eslint/types": "8.59.4", - "@typescript-eslint/visitor-keys": "8.59.4", + "@typescript-eslint/project-service": "8.60.0", + "@typescript-eslint/tsconfig-utils": "8.60.0", + "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/visitor-keys": "8.60.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -2540,13 +2540,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.4.tgz", - "integrity": "sha512-U3gxVaDVnuZKhSspW/MzMxE1kq7zOdc072FcSNoqA1I9p8HyKbBFfEHoWckBAMgNMph4MamwS5iTVzFmrnt8TQ==", + "version": "8.60.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", + "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.4", + "@typescript-eslint/types": "8.60.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { From 6112e986383011d86453f5becded0cd7c0bfb7e2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 26 May 2026 13:48:04 +0200 Subject: [PATCH 043/156] Update dependency sass to v1.100.0 (#2590) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [sass](https://redirect.github.com/sass/dart-sass) | [`1.99.0` → `1.100.0`](https://renovatebot.com/diffs/npm/sass/1.99.0/1.100.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/sass/1.100.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/sass/1.99.0/1.100.0?slim=true) | --- ### Release Notes
sass/dart-sass (sass) ### [`v1.100.0`](https://redirect.github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11000) [Compare Source](https://redirect.github.com/sass/dart-sass/compare/1.99.0...1.100.0) - Writing two compound selectors adjacent to one another without any whitespace between them, such as `[class]a`, is now deprecated. This was always an error in CSS and Sass only supported it by mistake. See [the Sass website](https://sass-lang.com/d/adjacent-compounds) for details.
--- ### Configuration 📅 **Schedule**: (UTC) - 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 | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/package-lock.json b/package-lock.json index 46824f58de..e4e1c1276c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3208,16 +3208,16 @@ } }, "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "readdirp": "^5.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">= 20.19.0" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -5862,13 +5862,13 @@ } }, "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">= 20.19.0" }, "funding": { "type": "individual", @@ -6000,13 +6000,13 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.99.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", - "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", + "version": "1.100.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", + "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", "dev": true, "license": "MIT", "dependencies": { - "chokidar": "^4.0.0", + "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, @@ -6014,7 +6014,7 @@ "sass": "sass.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=20.19.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" From d856c7a4c43a1f2839363235e480c13ec8b24254 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Thu, 28 May 2026 12:12:37 +0100 Subject: [PATCH 044/156] Minor tweaks to the CAP-level Authorization topic page (#2568) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - The phrase "for some reason" is often interpreted negatively, with the connotation of "randomly", "unexpectedly" or simply "unwanted". So I changed the phrase to something that conveys something that is more deliberate and controlled. - Looks like a heading title changed, but one instance of a reference to it ([Instance-based Access Control](https://cap.cloud.sap/docs/guides/security/authorization#instance-based-auth)) wasn't updated. - The description for the multi-privilege example in the `@restrict` section seems a bit vague and inaccurate, so I tried to improve it. --------- Co-authored-by: René Jeglinsky --- guides/security/authorization.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/guides/security/authorization.md b/guides/security/authorization.md index 8fd1fc9f88..6b6d468cd4 100644 --- a/guides/security/authorization.md +++ b/guides/security/authorization.md @@ -96,7 +96,7 @@ service SomeService { #### Events to Auto-Exposed Entities { #events-and-auto-expose} -In general, entities can be exposed in services in different ways: they can be **explicitly exposed** by the modeler (for example, by a projection), or they can be [**auto-exposed**](../../cds/cdl#auto-exposed-entities) by the CDS compiler for some reason. +In general, entities can be exposed in services in different ways: they can be **explicitly exposed** by the modeler (for example, by a projection), or they can be [**auto-exposed**](../../cds/cdl#auto-exposed-entities) by the CDS compiler in certain circumstances. Access to auto-exposed entities needs to be controlled in a specific way. Consider the following example: ```cds @@ -205,7 +205,7 @@ The following values are supported: - The `to` property lists all [user roles](cap-users#roles) or [pseudo roles](cap-users#pseudo-roles) that the privilege applies to. Note that the `any` pseudo-role applies for all users and is the default if no value is provided. -- The `where`-clause can contain a Boolean expression in [CQL](../../cds/cql)-syntax that filters the instances that the event applies to. As it allows user values (name, attributes, etc.) and entity data as input, it's suitable for *dynamic authorizations based on the business domain*. Supported expressions and typical use cases are presented in [instance-based authorization](#instance-based-auth). +- The `where`-clause can contain a Boolean expression in [CQL](../../cds/cql)-syntax that filters the instances that the event applies to. As it allows user values (name, attributes, etc.) and entity data as input, it's suitable for *dynamic authorizations based on the business domain*. Supported expressions and typical use cases are presented in [instance-based access control](#instance-based-auth). A privilege is met, if and only if **all properties are fulfilled** for the current request. In the following example, orders can only be read by an `Auditor` who meets `AuditBy` element of the instance: @@ -245,7 +245,7 @@ entity Orders @(restrict: [ ]) {/*...*/} ``` -Here an `Auditor` user can read all orders with matching `country` or that they have created. +Here, users can read and write orders they've created, and `Auditor` users can read all orders with matching `country`. > Annotations such as @requires or @readonly are just convenience shortcuts for @restrict, for example: - `@requires: 'Viewer'` is equivalent to `@restrict: [{grant:'*', to: 'Viewer'}]` From 99d7473aa0c37bdaa0d24c2e6dd0672565e8a866 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Thu, 28 May 2026 19:21:38 +0200 Subject: [PATCH 045/156] Update fiori.md (#2595) Since its latest release VSCode's built-in link checker supports `
` tags for alternative link targets, which we should preferably use instead of h6 titles. --- guides/uis/fiori.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/uis/fiori.md b/guides/uis/fiori.md index 76b3e42154..a75cb5fd67 100644 --- a/guides/uis/fiori.md +++ b/guides/uis/fiori.md @@ -241,7 +241,7 @@ With that, all UIs on all services exposing `Books` will automatically receive V ## Fiori Draft Support -###### Draft Support +
SAP Fiori uses Drafts to enable users to save their progress while editing data and continue later on without losing changes. Drafts are stored on the server and can be accessed from different devices and locations, providing flexibility and convenience for users. CAP provides out-of-the-box support for drafts, making it easy to implement this functionality in your applications. From 2966880fcc5d857078e021a62d15bfebf92e9345 Mon Sep 17 00:00:00 2001 From: Steffen Waldmann Date: Thu, 28 May 2026 21:13:31 +0200 Subject: [PATCH 046/156] cds debug: Add warning for HTTP health check scenarios (#2589) Also see PR in cds-dk --- tools/cds-cli.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tools/cds-cli.md b/tools/cds-cli.md index 0e968484ca..ad2795ff73 100644 --- a/tools/cds-cli.md +++ b/tools/cds-cli.md @@ -643,6 +643,25 @@ If you scale out to more instances, only some of your requests will hit the inst However, it's possible to [route a request to a specific instance](https://docs.cloudfoundry.org/devguide/deploy-apps/routes-domains.html#surgical-routing), which is useful if you can't reduce the number of app instances. ::: +::: warning Cloud Foundry's HTTP health checks kill paused containers +While paused at a breakpoint, the Node.js event loop is frozen and the app cannot respond to Cloud Foundry's `http` health probe. As a consequence, Cloud Foundry marks the container unhealthy and destroys it within seconds. + +Instead, switch the health check to `process` for the duration of the debug session: + +```sh +cf set-health-check process +cf restart +``` + +Restore it afterwards: + +```sh +cf set-health-check http +``` + +`cds debug` detects this situation and prompts you to confirm before continuing. Note that the setting is overwritten on the next `cds up` unless persisted in `mta.yaml`. +::: + ### Node.js Applications #### Remote Applications From d0b01eeffd9cbf6615d874dde937f3eccaa98327 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 29 May 2026 11:09:57 +0200 Subject: [PATCH 047/156] chore: Update CLI texts (#2594) 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 024b717cc6..81b8811c39 100644 --- a/tools/assets/help/cds-version-md.out.md +++ b/tools/assets/help/cds-version-md.out.md @@ -14,5 +14,5 @@ | cds.root | | .../your-project | | npm root -l | | .../node_modules | | npm root -g | | .../node_modules | - | Node.js | 24.15.0 | .../bin/node | + | Node.js | 24.16.0 | .../bin/node | diff --git a/tools/assets/help/cds-version.out.md b/tools/assets/help/cds-version.out.md index ccb237b50a..265a98e0be 100644 --- a/tools/assets/help/cds-version.out.md +++ b/tools/assets/help/cds-version.out.md @@ -12,5 +12,5 @@ cds.root .../your-project npm root -l .../node_modules npm root -g .../node_modules - Node.js 24.15.0 .../bin/node + Node.js 24.16.0 .../bin/node From 2551bc5da2c9fda92bf5549ad7a0e6f0b3a69109 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Mon, 1 Jun 2026 14:37:56 +0200 Subject: [PATCH 048/156] chore: remove PR-SAP workflow (#2599) --- .github/workflows/PR-SAP.yml | 52 ------------------------------------ 1 file changed, 52 deletions(-) delete mode 100644 .github/workflows/PR-SAP.yml diff --git a/.github/workflows/PR-SAP.yml b/.github/workflows/PR-SAP.yml deleted file mode 100644 index 51013196ed..0000000000 --- a/.github/workflows/PR-SAP.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: PR Build (SAP) - -on: - pull_request: - merge_group: - -concurrency: - group: pr-sap-${{ github.workflow }}-${{ github.head_ref || github.run_id }} - cancel-in-progress: true - -permissions: - contents: read - -jobs: - build-sap: - runs-on: ubuntu-latest - if: '! github.event.pull_request.head.repo.fork' - steps: - - name: Checkout SAP repo - run: | - git config --global credential.helper "cache --timeout=3600" - echo -e "url=https://user:${GH_TOKEN}@github.com\n" | git credential approve - echo -e "url=https://user:${GH_TOKEN_TOOLS_DOCS}@github.tools.sap\n" | git credential approve - git clone --depth 1 --no-single-branch https://github.tools.sap/cap/docs docs - cd docs - git checkout $GITHUB_HEAD_REF || git checkout main - git submodule update --init --recursive - cd @external - git checkout $GITHUB_HEAD_REF - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_TOKEN_TOOLS_DOCS: ${{ secrets.GH_TOKEN_TOOLS_DOCS }} - - name: Use Node.js - uses: actions/setup-node@v4 - with: - node-version: 22 - cache: 'npm' - cache-dependency-path: docs/package-lock.json - - run: npm ci - working-directory: docs - - run: npm run lint - working-directory: docs - - run: npm run docs:build - working-directory: docs - env: - NODE_OPTIONS: "--max-old-space-size=6144" - VITE_CAPIRE_CI_HOST: "github.com" - VITE_CAPIRE_EXTRA_ASSETS: true - MAVEN_HOST: https://common.repositories.cloud.sap/artifactory/build.releases - MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }} - - run: npm test - working-directory: docs From c7fa27ac4e8fe15d8679cd08d35a4b72c5e3ecf0 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Mon, 1 Jun 2026 15:57:11 +0200 Subject: [PATCH 049/156] Remove console docs (#2602) As discussed, put the feature dormant. --- tools/_menu.md | 2 - tools/console.md | 223 ----------------------------------------------- 2 files changed, 225 deletions(-) delete mode 100644 tools/console.md diff --git a/tools/_menu.md b/tools/_menu.md index cc2e00d4e5..2b53c0c87d 100644 --- a/tools/_menu.md +++ b/tools/_menu.md @@ -9,5 +9,3 @@ ## [cds. add()](apis/cds-add) ## [cds. import()](apis/cds-import) ## [cds. build()](apis/cds-build) - -# [CAP Console](console) diff --git a/tools/console.md b/tools/console.md deleted file mode 100644 index 4eeb742886..0000000000 --- a/tools/console.md +++ /dev/null @@ -1,223 +0,0 @@ ---- -synopsis: Learn how to install, configure, and use the CAP console. ---- - -# The CAP Console - - -The CAP console is a native desktop app, available for Windows & macOS, designed to enhance your CAP development experience by enabling local development, BTP deployment, and monitoring from a unified interface. It simplifies the development workflow by offering different development tools and handling infrastructure complexity, so you can focus on building your application. Inspired by the CAP Developer Dashboard as well as OpenLens, it's designed to be a tool developers actually want to use. - -> [!NOTE] -> This documentation and the tool is still a work in progress. - -[[toc]] - -## Setup CAP Console - -Download the CAP console from [SAP Tools](https://tools.hana.ondemand.com/#cloud-capconsole) and install it. - -![](assets/console/console-download-tools.png){style="width:450px; box-shadow: 1px 1px 5px #888888"} - -Start the CAP console and access your running CAP projects: - -![Screenshot of CAP console start page](assets/console/console-projects.png) - -Once you start the CAP console, it will automatically scan your local processes to identify running CAP projects. This works for JavaScript as well as Java projects. Identified projects are listed on the start page, allowing you to quickly access them. As soon as you stop a project, it is automatically removed from the list. - -If you always want to have a project listed in the CAP console, even when it is not running, you can use the "Remember Project" feature. Open the ellipsis menu and select "Remember Project". To forget a project, simply click on "Forget Project" in the same menu. - -![Screenshot of CAP console menu to remember project](assets/console/console-remember-project.png) - -If your project is not detected automatically or it's currently not running, you can manually add it by clicking on the "Add Project" button and selecting the project root folder. - -There's also a filter option available, allowing you to customize which projects you want to have displayed. You can filter projects by their process status (running or stopped) as well as by their save status (detected or saved). - -## Prepare Your Projects - -To utilize the full functionality of CAP console, you need to install the CAP console plugin in your CAP project. The plugin enables additional monitoring features and allows you to change log levels on the fly. The plugin is available for JavaScript and Java. Both versions of the plugin are OpenSource and can be found on GitHub ([JS Plugin](https://github.com/cap-js/console), [Java Plugin](https://github.com/cap-java/cds-feature-console)). If you want to use the plugin in a deployed environment, make sure to read and understand the [Security](#security) section first. - -### JavaScript Plugin - -Simply install the plugin as a dependency in your project - no further configuration required: - -```bash -npm install @cap-js/console -``` - -### Java Plugin - -Add the following dependency to your `srv/pom.xml` - no further configuration required: - -```xml - - com.sap.cds - cds-feature-console - -``` - - -## Monitoring - -> [!IMPORTANT] -> To utilize the full functionality of the monitoring features, please ensure that you have the [CAP console Plugin](#prepare-your-projects) installed in your CAP project. - -If you click on any project card, you are taken to the monitoring view for that project. In the monitoring view, you can access various information about your project. - -### Project Structure - -![Screenshot of CAP console monitoring overview](assets/console/console-structure.png) - -Based on your MTA, the console visualizes the structure of your project. You can click on any component of your project structure to access detailed information about it in the bottom section of the monitoring view. - -### Status and Metrics - -You can check the health of each component of your project at a quick glance. Each component displays its current state (running, stopped, or crashed) via a colored status indicator in the top-left corner, along with real-time performance metrics including CPU and memory usage. - -### Logs - -![Screenshot of CAP console logs](assets/console/console-logs.png) - -View real-time logs for each application of your project! And if your application has the [CAP console plugin](#plugins) installed, you can switch log levels without restarting the application. For Non-CAP applications and CAP applications without the plugin, the Cloud Foundry logs are displayed. Simply click on the "Logs" button and start viewing your application logs. - -### Meta Information and Deployment Descriptor - -![Screenshot of CAP console meta information](assets/console/console-meta-information.png) - -By clicking on any of the components in your project structure, you can view detailed meta information about it as well as an excerpt of the MTA that only includes the selected component. Additionally, you have access to basic application controls for starting, stopping, and restarting CF applications, as well as viewing all registered application routes. - -### Environment Switching - -By clicking on the environment name in the top bar, you can quickly switch between different environments you have configured for your project. Every environment configuration is stored inside your project in a `.cds` folder as a YAML file. The environment configurations are git friendly and can be shared with your team. Since the CAP console does not ship with any built-in credentials, only people who have access to the CF space will be able to access the environment. - -If you want to remove an environment configuration from your project, simply remove the respective YAML file from your `.cds` folder. - -### Local Environment - -![Screenshot of CAP console local environment](assets/console/console-local-environment.png) - -CAP console also supports your local development environment. This allows you to use the same monitoring tools locally that you use for deployed applications. Simply select the "local" environment to connect to your locally running CAP project. Some functionality, like viewing BTP Services, is not available in the local environment. - -## Deployment - -CAP console streamlines the deployment of your CAP applications to the SAP Business Technology Platform, making it as effortless as possible — no manual setup, no complex configurations. - -### Step-by-Step Deployment - -![Screenshot of BTP Login](assets/console/deployment-btp-login.png) -![Screenshot of BTP Login](assets/console/deployment-btp-entitlements.png) - - -Deploying your application is as simple as clicking through a guided dialog. CAP console handles everything behind the scenes: - -- **Authentication**: Authenticates you against BTP and Cloud Foundry. -- **Entitlements**: Compares your required resources from your deployment descriptor with your available entitlements in your BTP subaccount. -- **Environment Setup**: Enables Cloud Foundry, creates CF spaces, and creates BTP service instances as needed. - -You can choose between two deployment modes: - -- **In-App Deployment**: Uses pre-packaged CLI tools with the correct versions — no need to install anything locally. - > [!note] - > Currently you still have to locally install [cds-dk](https://www.npmjs.com/package/@sap/cds-dk?activeTab=dependencies), [mbt](https://sap.github.io/cloud-mta-build-tool/download/) and in case of windows [make](https://sap.github.io/cloud-mta-build-tool/makefile/), but we are working on it! -- **CLI-Based Deployment**: Copy all necessary commands and run them in your own terminal. - -### Designed for Simplicity - -CAP console is optimized for the **initial deployment** of your application. It's ideal for developers who want to get their app running on BTP quickly after local development. - - -### Configuring Default Deployment Target - -![Screenshot of CAP console cloud connection settings](assets/console/console-cloud-settings.png) - -You can configure a default Global Account, Subaccount, and Cloud Foundry space in the settings. These default values apply globally to all projects and can be overridden in the deployment dialog. If you have configured default accounts, they are automatically selected when available. Please note that you have to provide the subdomains for the Global Account and Subaccount, which can be found in the BTP Cockpit. - - -## Security - -This section contains some important information regarding the security of using the CAP console and the associated plugins. If you want to use CAP console in a production environment, please make sure to read and understand the following information first. - -### Access Control - -CAP console itself does not come with any built-in credentials. It utilizes the user's login information to access cloud resources. This means that users can only access what they already have permissions for. - -During deployment, the CAP console needs access to BTP and Cloud Foundry. For BTP we utilize the SSO functionality from the BTP CLI API. This access is used to retrieve information about your Global Accounts, Subaccounts, BTP service instances and entitlements. If your user has the required roles, you can also assign entitlements from within CAP console, as well as create the CF Org. - -The CF login is used to create CF spaces, deploy your CAP project, retrieve information about applications and BTP service instances, start and stop applications and create an SSH Tunnel to communicate with the plugin. Again, if your user does not have the required roles, you are not able to perform these actions. - -On macOS you can store your encrypted credentials, which will allow you easy access without having to log in every time. Your tokens are encrypted using the OS keychain and are only stored locally on your machine. This functionality can be disabled in the settings. On Windows, this functionality is not available due to missing secure encryption APIs. - -### Plugins - -The CAP console Java and JavaScript plugins create an unsecured WebSocket on a separate port from your main application. Locally, any process can access this WebSocket. In deployed environments, the WebSocket remains inaccessible by default since Cloud Foundry only exposes explicitly configured ports. To access the WebSocket in a deployed environment, you need to establish an SSH tunnel, which the CAP console tries to do by default. For more information about the SSH tunnel, read the [SSH Security Implications](#ssh-security-implications) section. - -The following information is transmitted via the WebSocket: -- Log Messages from your CAP Project (only sent when a client is connected) - -The following actions can be triggered via the WebSocket: -- Changing the Log Level of your CAP Project - -### SSH Security Implications - -To access the WebSocket in a deployed environment, an SSH tunnel is required to ensure secure and encrypted communication between the CAP console and the plugin. CAP console tries to automatically create this tunnel for you. The SSH tunnel is established between the port on which the WebSocket is running inside your application container and a local port on your machine and is only used to communicate with the plugin. - -If you don't want CAP console to open an SSH tunnel, you can disable SSH for your application `cf disable-ssh `. In that case, CAP console shows you a warning while establishing the connection. You can then decide to enable SSH through the CAP console or continue without an SSH tunnel. Without the SSH tunnel, you are not able to use any of the plugin features. - -Even though the SSH tunnel is only opened to one specific port of your application container, you are still opening up a potential attack vector. CAP console tries to minimize this risk by only opening the tunnel for the duration of the connection. Once you close the CAP console, switch environments, or your user loses access to the CF Space, the SSH tunnel is closed automatically. You must ensure that you and your team understand the security implications of opening SSH tunnels in your environment and read the [Cloud Foundry SSH Documentation](https://docs.cloudfoundry.org/devguide/deploy-apps/ssh-apps.html). If attackers exploit the SSH tunnel, they will also be able to access the WebSocket and read all data transmitted via it. - -## Telemetry and Data Collection - -CAP console collects anonymous usage data to improve user experience, prioritize feature development, ensure reliability across different environments, and optimize performance. The collected data is sent to SAP in accordance with our [Privacy Statement](https://www.sap.com/about/legal/privacy.html). No personally identifiable information, project names, source code, or other sensitive details are collected. You can disable telemetry collection in the application settings if desired. - -## Limitations - -CAP console is still a young project and has some limitations that are important to know. We will try to mitigate these limitations in future releases. - -- µ-services are not supported -- mtx is not supported -- Kyma is not supported -- Only BTP services that can be added via `cds add` are currently supported for Deployment - -## Common Issues & Pitfalls - -### CDS Services Unavailable - -If you see CDS services as unavailable in the Projects Page, this usually indicates that your CAP project contains invalid definitions or hasn't been set up yet. You can use `cds compile .` in your project root to check for any issues with your CDS definitions. Once these issues are resolved, it should be detected correctly. - -### The Effect of Debug Log Level - -Debug log level produces a high volume of log messages, which can lead to performance degradation in your application. It's advisable to use the debug log level only for short periods when troubleshooting specific issues. Once you've gathered the necessary information, switch back to a less verbose log level to maintain optimal performance. CAP console cannot guarantee that the log level is automatically reset, so please make sure to change it back manually. - -## Release Notes - -### 1.3.0 - -- Comprehensive micro-services support with enhanced project detection, package-level monitoring, and deployment capabilities -- Integrated telemetry system for anonymous usage data collection to improve user experience and feature development -- Enhanced UI/UX with system theme support, responsive project card grid, and improved monitoring layout with splitter views -- Advanced CDS debugging capabilities and optimized project detection with push-based updates for better performance - -### 1.2.0 - -- Enhanced deployment workflow with support for existing BTP services and improved entitlements management -- Comprehensive monitoring improvements including detailed service information, bindings, keys, and multi-instance metrics -- Better user experience with project pinning, multiple development instances support, and responsive UI enhancements -- Upgraded to Node.js v22 and Electron v39 for improved performance and security - -### 1.1.0 - -- Complete UI redesign with new project card interface, improved monitoring highlights, and intelligent project sorting -- Enhanced deployment workflow with Environment Wizard, better CF space validation, and improved entitlements management -- Improved local development experience with better process detection, enhanced connection handling, and Windows compatibility fixes -- Performance optimizations including responsive UI during deployment, reduced bundle size, and better error handling - -### 1.0.0 - -- Initial release of CAP Console with comprehensive BTP deployment and local monitoring capabilities -- Enhanced deployment experience with retry functionality for failed deployments and improved HANA service handling -- Improved monitoring and logging with timestamped logs, fixed CF logs integration, and better environment management - -## License - -CAP console is licensed under the [SAP Developer License 3.1](https://tools.hana.ondemand.com/developer-license-3_1.txt). - -[Free & Open Source Notices](https://support.sap.com/content/dam/launchpad/en_us/osln/osln/73555000100900008421_20250930063733.pdf){.learn-more} From 6179bc815c2b07b23e66e544da67bcdb049d6d5b Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Mon, 1 Jun 2026 16:26:59 +0200 Subject: [PATCH 050/156] chore: fetch Java artifacts w/o credentials (#2600) Use Maven Central again that doesn't require creds. Let's see if this is good enough, i.e. if we hit a rate limit at all. --- .github/workflows/main.yml | 2 -- .github/workflows/update-content.yml | 3 --- 2 files changed, 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index baf6679062..b8a996c671 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -41,8 +41,6 @@ jobs: SITE_HOSTNAME: https://cap.js.org VITE_CAPIRE_PREVIEW: true VITE_CAPIRE_EXTRA_ASSETS: true - MAVEN_HOST: https://common.repositories.cloud.sap/artifactory/build.releases - MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }} - run: npm test - name: Upload artifact uses: actions/upload-pages-artifact@v3 diff --git a/.github/workflows/update-content.yml b/.github/workflows/update-content.yml index f068315242..2f302316bd 100644 --- a/.github/workflows/update-content.yml +++ b/.github/workflows/update-content.yml @@ -62,9 +62,6 @@ jobs: run: | npm ci .github/java-properties/update-properties.js - env: - MAVEN_HOST: https://common.repositories.cloud.sap/artifactory/build.releases - MAVEN_TOKEN: ${{ secrets.MAVEN_TOKEN }} - name: Check for changes run: | From 6dd8b9249292845aee7a96be64365ec75e2ede5e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 1 Jun 2026 16:41:59 +0200 Subject: [PATCH 051/156] Update dependency vite to v7.3.5 (#2601) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [vite](https://vite.dev) ([source](https://redirect.github.com/vitejs/vite/tree/HEAD/packages/vite)) | [`7.3.3` → `7.3.5`](https://renovatebot.com/diffs/npm/vite/7.3.3/7.3.5) | ![age](https://developer.mend.io/api/mc/badges/age/npm/vite/7.3.5?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/vite/7.3.3/7.3.5?slim=true) | --- ### Release Notes
vitejs/vite (vite) ### [`v7.3.5`](https://redirect.github.com/vitejs/vite/releases/tag/v7.3.5) [Compare Source](https://redirect.github.com/vitejs/vite/compare/v7.3.3...v7.3.5) Please refer to [CHANGELOG.md](https://redirect.github.com/vitejs/vite/blob/v7.3.5/packages/vite/CHANGELOG.md) for details.
--- ### Configuration 📅 **Schedule**: (UTC) - 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 e4e1c1276c..565a47bfeb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6692,9 +6692,9 @@ } }, "node_modules/vite": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.3.tgz", - "integrity": "sha512-/4XH147Ui7OGTjg3HbdWe5arnZQSbfuRzdr9Ec7TQi5I7R+ir0Rlc9GIvD4v0XZurELqA035KVXJXpR61xhiTA==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.5.tgz", + "integrity": "sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==", "dev": true, "license": "MIT", "dependencies": { From 9e1c0351c2fbd263dafd3b567bd3aa2c6a5b0af3 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Tue, 2 Jun 2026 08:13:25 +0200 Subject: [PATCH 052/156] Update package.json --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index f797be2837..c779597e28 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,7 @@ "devDependencies": { "@cap-js/cds-typer": "^0", "@cap-js/cds-types": "^0", - "@cap-js/db-service": "^2", - "@cap-js/sqlite": "^2", + "@cap-js/sqlite": ">=2", "@mdit/plugin-dl": ">=0.22.2", "@sap/cds": "^9", "@shikijs/monaco": "^4", From 08b80ca1e8f20e27c2c95b731a02969ecc1c404b Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Tue, 2 Jun 2026 08:13:52 +0200 Subject: [PATCH 053/156] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c779597e28..1096c99df2 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "@cap-js/cds-types": "^0", "@cap-js/sqlite": ">=2", "@mdit/plugin-dl": ">=0.22.2", - "@sap/cds": "^9", + "@sap/cds": ">=9", "@shikijs/monaco": "^4", "@shikijs/vitepress-twoslash": "^4", "@sqlite.org/sqlite-wasm": "latest", From b31ddf391370d5f0489ae75a60ca131070002240 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Tue, 2 Jun 2026 11:26:02 +0200 Subject: [PATCH 054/156] Hint on `cds-dk` as design-time only package. (#2603) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: René Jeglinsky --- tools/apis/index.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/apis/index.md b/tools/apis/index.md index 81292f1880..b685c76e9e 100644 --- a/tools/apis/index.md +++ b/tools/apis/index.md @@ -12,7 +12,7 @@ This guide is about programmatic CDS design-time APIs. The design-time APIs are provided with package `@sap/cds-dk` which needs to be installed locally in your project: ```sh -npm add @sap/cds-dk +npm add @sap/cds-dk --save-dev ``` That given, you can use the APIs in your project like this: @@ -21,6 +21,10 @@ const cds = require('@sap/cds-dk') cds.import(...) ``` +> [!important] Don't load cds-dk code at runtime +> Note that `@sap/cds-dk` is a design-time dependency that runs locally or in continuous integration (CI) pipelines. +> Avoid loading the previously shown code at application runtime in deployed applications. + From fb4ed1cb335960bed13661c3d246aa948525a5f9 Mon Sep 17 00:00:00 2001 From: Matthias Schur <107557548+MattSchur@users.noreply.github.com> Date: Tue, 2 Jun 2026 11:28:02 +0200 Subject: [PATCH 055/156] Remove vector dimension from examples (#2609) - `Vector` (`length`) -> `Vector` (`dimension`) - Remove vector dimension from examples --- cds/types.md | 42 +++++++++++++-------------- guides/databases/vector-embeddings.md | 6 ++-- java/cds-data.md | 2 +- java/working-with-cql/query-api.md | 2 +- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/cds/types.md b/cds/types.md index d872358c0f..c876abf6da 100644 --- a/cds/types.md +++ b/cds/types.md @@ -13,27 +13,27 @@ status: released The following table lists the built-in types in CDS, and their most common mapping to ANSI SQL types, when deployed to a relational database (concrete mappings to specific databases may differ): -| CDS Type | Remarks | ANSI SQL | -|---------------------|------------------------------------------------------------------------|----------------| -| `UUID` | [RFC 4122](https://tools.ietf.org/html/rfc4122)-compliant UUIDs | _NVARCHAR(36)_ | -| `Boolean` | Values: `true`, `false`, `null`, `0`, `1` | _BOOLEAN_ | -| `Integer` | Same as `Int32` by default | _INTEGER_ | -| `Int16` | Signed 16-bit integer, range *[ -215 ... +215 )* | _SMALLINT_ | -| `Int32` | Signed 32-bit integer, range *[ -231 ... +231 )* | _INTEGER_ | -| `Int64` | Signed 64-bit integer, range *[ -263 ... +263 )* | _BIGINT_ | -| `UInt8` | Unsigned 8-bit integer, range *[ 0 ... 255 ]* | _TINYINT_ | -| `Decimal`(`p`,`s`) | Decimal with precision `p` and scale `s` | _DECIMAL_ | -| `Double` | Floating point with binary mantissa | _DOUBLE_ | -| `Date` | e.g. `2022-12-31` | _DATE_ | -| `Time` | e.g. `23:59:59` | _TIME_ | -| `DateTime` | _sec_ precision | _TIMESTAMP_ | -| `Timestamp` | _µs_ precision, with up to 7 fractional digits | _TIMESTAMP_ | -| `String` (`length`) | Default *length*: 255; on HANA: 5000 | _NVARCHAR_ | -| `Binary` (`length`) | Default *length*: 255; on HANA: 5000 | _VARBINARY_ | -| `Vector` (`length`) | for Vector Embeddings [-> see notes below](#vector-embeddings) | ( _DB-specific_ ) | -| `LargeBinary` | Unlimited binary data, usually streamed at runtime | _BLOB_ | -| `LargeString` | Unlimited textual data, usually streamed at runtime | _NCLOB_ | -| `Map` | Mapped to *NCLOB* for HANA. | *JSON* type | +| CDS Type | Remarks | ANSI SQL | +|------------------------|------------------------------------------------------------------------|----------------| +| `UUID` | [RFC 4122](https://tools.ietf.org/html/rfc4122)-compliant UUIDs | _NVARCHAR(36)_ | +| `Boolean` | Values: `true`, `false`, `null`, `0`, `1` | _BOOLEAN_ | +| `Integer` | Same as `Int32` by default | _INTEGER_ | +| `Int16` | Signed 16-bit integer, range *[ -215 ... +215 )* | _SMALLINT_ | +| `Int32` | Signed 32-bit integer, range *[ -231 ... +231 )* | _INTEGER_ | +| `Int64` | Signed 64-bit integer, range *[ -263 ... +263 )* | _BIGINT_ | +| `UInt8` | Unsigned 8-bit integer, range *[ 0 ... 255 ]* | _TINYINT_ | +| `Decimal`(`p`,`s`) | Decimal with precision `p` and scale `s` | _DECIMAL_ | +| `Double` | Floating point with binary mantissa | _DOUBLE_ | +| `Date` | e.g. `2022-12-31` | _DATE_ | +| `Time` | e.g. `23:59:59` | _TIME_ | +| `DateTime` | _sec_ precision | _TIMESTAMP_ | +| `Timestamp` | _µs_ precision, with up to 7 fractional digits | _TIMESTAMP_ | +| `String` (`length`) | Default *length*: 255; on HANA: 5000 | _NVARCHAR_ | +| `Binary` (`length`) | Default *length*: 255; on HANA: 5000 | _VARBINARY_ | +| `Vector` (`dimension`) | for Vector Embeddings [-> see notes below](#vector-embeddings) | ( _DB-specific_ ) | +| `LargeBinary` | Unlimited binary data, usually streamed at runtime | _BLOB_ | +| `LargeString` | Unlimited textual data, usually streamed at runtime | _NCLOB_ | +| `Map` | Mapped to *NCLOB* for HANA. | *JSON* type | > [!info] Default String Lengths > Lengths can be omitted, in which case default lengths are used. While this is usual in initial phases of a project, productive apps should always use explicitly defined length. The respective default lengths are configurable through the config options diff --git a/guides/databases/vector-embeddings.md b/guides/databases/vector-embeddings.md index 99f2822ed1..86bd135bbe 100644 --- a/guides/databases/vector-embeddings.md +++ b/guides/databases/vector-embeddings.md @@ -12,11 +12,11 @@ Choose an embedding model that fits your use case and data (for example English Use the [SAP Generative AI Hub](https://www.sap.com/products/artificial-intelligence/generative-ai-hub.html) for unified consumption of embedding models and LLMs across different vendors and open-source models. Check for available models on the [SAP AI Launchpad](https://help.sap.com/docs/ai-launchpad/sap-ai-launchpad-user-guide/models-and-scenarios-in-generative-ai-hub-fef463b24bff4f44a33e98bb1e4f3148#models). ## Add Embeddings to Your CDS Model -Use the built-in CDL [Vector type](../../cds/types) in your CDS model to store embeddings. Set the vector dimensions to match the embedding model (for example, 768 for *SAP_GXY.20250407*). +Use the built-in CDL [Vector type](../../cds/types) to store embeddings. Use `Vector` without specifying a dimension to simplify changing the embedding model. If you specify a vector dimension, make sure it matches the embedding model (for example, 768 for *SAP_GXY.20250407*). ```cds extend Incidents with { - embedding : Vector(768); + embedding : Vector; } ``` @@ -34,7 +34,7 @@ To generate vector embeddings on write in SAP HANA, you can use the [vector_embe ```cds extend Incidents with { @cds.api.ignore - embedding : Vector(768) = vector_embedding( + embedding : Vector = vector_embedding( 'Title: ' || title || ', Summary: ' || summary, 'DOCUMENT', 'SAP_GXY.20250407' ) stored; diff --git a/java/cds-data.md b/java/cds-data.md index 3798486b19..761289f163 100644 --- a/java/cds-data.md +++ b/java/cds-data.md @@ -330,7 +330,7 @@ Map data can be nested and may contain nested maps and lists, which are serializ ## Vector Embeddings { #vector-embeddings } -In CDS [vector embeddings](../guides/databases/vector-embeddings) are stored in elements of type `cds.Vector`: +In CDS [vector embeddings](../guides/databases/vector-embeddings) are stored in elements of type `Vector`: CAP Java support the vector type on SAP HANA, as well as H2 and SQLite for local testing. On Postgres (beta) support for vectors requires the [pgvector](https://github.com/pgvector/pgvector) extension. diff --git a/java/working-with-cql/query-api.md b/java/working-with-cql/query-api.md index 02261a8d75..e0516d1fca 100644 --- a/java/working-with-cql/query-api.md +++ b/java/working-with-cql/query-api.md @@ -1658,7 +1658,7 @@ To automatically generate vector embeddings on write in the database, you can de ```cds extend Incidents with { @cds.api.ignore - embedding : cds.Vector(768) = vector_embedding( + embedding : Vector = vector_embedding( 'title: ' || title || ', summary: ' || summary, 'DOCUMENT', 'SAP_GXY.20250407') stored; } From 5ebb932f6fb5c42a4a3de5c27d0a44a2d0fe1f40 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Thu, 4 Jun 2026 10:26:29 +0200 Subject: [PATCH 056/156] Document codegen module migration in 5.0 (#2574) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documents module change. Co-authored-by: René Jeglinsky --- java/migration.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/migration.md b/java/migration.md index 7d6b4d281d..f3503fed36 100644 --- a/java/migration.md +++ b/java/migration.md @@ -157,6 +157,10 @@ The internally used maven modules `repackaged/odata-v4-lib` and `repackaged/odat 3. Use upstream open-source Apache Olingo. Change dependencies from corresponding internal CAP `mvn` modules to OSS packages `org.apache.olingo:olingo-odata4`, `org.apache.olingo:olingo-odata2` +#### Module `com.sap.cds:cds4j-codegen` is removed + +The module `cds4j-codegen` is no longer available in CAP 5.0. The module `com.sap.cds:cds-services-code-generator` is delivered instead. + ## CAP Java 3.10 to CAP Java 4.0 { #three-to-four } ### New License From 510391b621647efc2430f0bfa441a880190b98f9 Mon Sep 17 00:00:00 2001 From: Marten Schiwek Date: Thu, 4 Jun 2026 10:35:40 +0200 Subject: [PATCH 057/156] New no-escaped-anno-brackets eslint rule (#2565) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adding the docs for the new model modernisation rule 'no-escaped-anno-brackets'. Co-authored-by: René Jeglinsky --- .../correct/db/schema.cds | 11 ++++ .../incorrect/db/schema.cds | 11 ++++ .../rules/no-escaped-anno-brackets/index.md | 50 +++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 tools/cds-lint/rules/no-escaped-anno-brackets/correct/db/schema.cds create mode 100644 tools/cds-lint/rules/no-escaped-anno-brackets/incorrect/db/schema.cds create mode 100644 tools/cds-lint/rules/no-escaped-anno-brackets/index.md diff --git a/tools/cds-lint/rules/no-escaped-anno-brackets/correct/db/schema.cds b/tools/cds-lint/rules/no-escaped-anno-brackets/correct/db/schema.cds new file mode 100644 index 0000000000..4fd8423fa8 --- /dev/null +++ b/tools/cds-lint/rules/no-escaped-anno-brackets/correct/db/schema.cds @@ -0,0 +1,11 @@ +namespace sap.capire.bookshop; + +@UI.LineItem: [{ + Value : title, + @UI.Importance : #High, +}] +entity Books { + key ID : Integer; + @mandatory title : localized String(111); + @mandatory author : Association to Authors; +} diff --git a/tools/cds-lint/rules/no-escaped-anno-brackets/incorrect/db/schema.cds b/tools/cds-lint/rules/no-escaped-anno-brackets/incorrect/db/schema.cds new file mode 100644 index 0000000000..6a7ba1f77b --- /dev/null +++ b/tools/cds-lint/rules/no-escaped-anno-brackets/incorrect/db/schema.cds @@ -0,0 +1,11 @@ +namespace sap.capire.bookshop; + +@UI.LineItem: [{ + Value : title, + ![@UI.Importance] : #High, // escaped annotation syntax is unnecessary [!code error] +}] +entity Books { + key ID : Integer; + @mandatory title : localized String(111); + @mandatory author : Association to Authors; +} diff --git a/tools/cds-lint/rules/no-escaped-anno-brackets/index.md b/tools/cds-lint/rules/no-escaped-anno-brackets/index.md new file mode 100644 index 0000000000..ee853515b4 --- /dev/null +++ b/tools/cds-lint/rules/no-escaped-anno-brackets/index.md @@ -0,0 +1,50 @@ +--- +outline: [2,2] +breadcrumbs: + - CDS Lint + - Rules Reference +status: released +--- + + + +# no-escaped-anno-brackets + +## Rule Details + +The escaped annotation syntax `![@...]` is unnecessary in modern CAP CDS. Inline annotations can be written as `@...` directly. This rule reports usages of the old escaped syntax and provides an autofix to replace them. + +## Examples + +#### ✅   Correct example + +In the following example, inline annotations use the modern `@...` syntax without escaping: + +::: code-group +<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +::: + + +#### ❌   Incorrect example + +This example shows the old escaped annotation syntax `![@UI.Importance]` which is unnecessary and should be replaced with `@UI.Importance`: + +::: code-group +<<< incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds] +::: + + +## Version +This rule was introduced in `@sap/eslint-plugin-cds 4.2.3`. From 3029cc4f039157f9f8a97db17b8f69b526d9c4c3 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Thu, 4 Jun 2026 13:42:07 +0100 Subject: [PATCH 058/156] Minor fixes to event-queues.md (#2615) --- guides/events/event-queues.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/guides/events/event-queues.md b/guides/events/event-queues.md index 903eeba561..89f14eff84 100644 --- a/guides/events/event-queues.md +++ b/guides/events/event-queues.md @@ -1,6 +1,6 @@ --- synopsis: > - Transactional Event Queues allow to schedule events and background tasks for asynchronous exactly once processing and withultimate resilience. + Transactional Event Queues allow the scheduling of events and background tasks for asynchronous exactly once processing and with ultimate resilience. status: released --- @@ -17,12 +17,12 @@ The _Outbox Pattern_ is a reliable strategy used in distributed systems to ensur * **Outbox** → for outbound calls to remote services * **Inbox** → for asynchronously handling inbound requests -* **Background tasks** → e.g., scheduled periodically +* **Background tasks** → e.g. scheduled periodically * **Remote Callbacks** → implementing SAGA patterns The core principle remains the same: -Instead of being sent directy to receivers, event messages are persisted in an _Event Queue_ table in the database -- **within the same transaction** as the triggering action, if applicable. +Instead of being sent directly to receivers, event messages are persisted in an _Event Queue_ table in the database -- **within the same transaction** as the triggering action, if applicable. Later on, these event messages are read from the database and actually sent to the receiving services, hence **processed asynchronously** -- with retries, if necessary, so guaranteeing **ultimate resilience**. @@ -40,13 +40,13 @@ Regarding the _outbox_, please see the following existing documentation: ## Inbox { #inbox } Through the _inbox_, inbound messages can be accepted as asynchronous tasks. -That is, the messaging service persists the message to the database, acknowledges it to the message broker, and schedules its processing. +That is, the messaging service persists the message to the database, acknowledges its receipt to the message broker, and schedules its processing. Simply configure your messaging service for Node.js as cds.requires.messaging.inboxed = true and for CAP Java as cds.messaging.services=[{"name": "messaging-name", "inbox": {"enabled": true}}] **Inboxing moves the dead letter queue into your CAP app❗️** -With the inbox, all messages are acknowledged towards the message broker regardless of whether they can be processed or not. +With the inbox, all messages are acknowledged with the message broker regardless of whether they can be processed or not. Hence, failures need to be managed via the dead letter queue built on `cds.outbox.Messages`. [Learn more about the dead letter queue in Node.js.](../../node.js/queue#managing-the-dead-letter-queue){.learn-more} From 3191da61bdcd69751660a768377ba2f4c6eeae84 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Fri, 5 Jun 2026 10:03:33 +0200 Subject: [PATCH 059/156] Fixed broken link to hex-arch illustration --- .../hexagonal-archritecture-origin.png | Bin 0 -> 11669 bytes get-started/concepts.md | 33 +++++++++--------- 2 files changed, 16 insertions(+), 17 deletions(-) create mode 100644 get-started/assets/concepts/hexagonal-archritecture-origin.png diff --git a/get-started/assets/concepts/hexagonal-archritecture-origin.png b/get-started/assets/concepts/hexagonal-archritecture-origin.png new file mode 100644 index 0000000000000000000000000000000000000000..bafeced942249feff605db00a0d80bb81635c954 GIT binary patch literal 11669 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 [[toc]] @@ -43,7 +43,7 @@ The CAP framework features a mix of proven and broadly adopted open-source and S The major building blocks are as follows: - [**Core Data Services** (CDS)](../cds/) — CAP's universal modeling language, and the very backbone of everything; used to capture domain knowledge, generating database schemas, translating to and from various API languages, and most important: fueling generic runtimes to automatically serve request out of the box. - + - [**Service Runtimes**](../guides/services/providing-services) for [Node.js](../node.js/) and [Java](../java/) — providing the core frameworks for services, generic providers to serve requests automatically, database support for SAP HANA, SQLite, and PostgreSQL, and protocol adaptors for REST, OData, GraphQL, ... - [**Platform Integrations**](../plugins/) — providing CAP-level service interfaces (*'[Calesi](#the-calesi-pattern)'*) to cloud platform services in platform-agnostic ways, as much as possible. Some of these are provided out of the box, others as plugins. @@ -90,16 +90,16 @@ In a first iteration, it would look like this in CDS, with some fields added: ::: code-group ```cds [Domain Data Model] -entity Authors { +entity Authors { name : String; books : Association to many Books; } -entity Books { +entity Books { title : String; author : Association to Authors; genre : Association to Genres; } -entity Genres { +entity Genres { name : String; parent : Association to Genres; } @@ -608,13 +608,12 @@ So, in total, and in effect, we learn: -The *[Hexagonal Architecture](https://alistair.cockburn.us/hexagonal-architecture/)* (also known as *Ports and Adapters Architecture/Pattern*) as first proposed by Alistair Cockburn in 2005, is quite famous and fancied these days (rightly so). As he introduces it, its intent is to: +The *[Hexagonal Architecture](https://en.wikipedia.org/wiki/hexagonal_architecture_(software))* (also known as *Ports and Adapters Architecture/Pattern*) as first proposed by Alistair Cockburn in 2005, is quite famous and fancied these days (rightly so). As he introduces it, its intent is to: *"Allow an application to equally be driven by users, programs, automated test or batch scripts, and to be developed and tested in isolation from its eventual run-time devices and databases"* {.indent style="font-family:serif"} ... and he illustrated that like this: - -![Hexagonal architecture basic.gif](https://alistair.cockburn.us/hexFig1.png) +![Hexagonal Architecture original illustration by Alistair Cockburn](assets/concepts/hexagonal-archritecture-origin.png) In a nutshell, this introduction to the objectives of hexagonal architecture translates to that in our world of cloud-based business applications: From 27f8e83d83fb99ba71fe7773197d07528e53baca Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Fri, 5 Jun 2026 10:05:13 +0200 Subject: [PATCH 060/156] . --- get-started/concepts.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/get-started/concepts.md b/get-started/concepts.md index 422ef91d0d..1dc56f5587 100644 --- a/get-started/concepts.md +++ b/get-started/concepts.md @@ -624,7 +624,7 @@ In a nutshell, this introduction to the objectives of hexagonal architecture tra > - To reduce complexity and speed up turnaround times at *development*, and in *tests* >
→ [*'Airplane Mode' Development & Tests*](features#fast-inner-loops) > -> **In contrast to that**, if you (think you) are doing Hexagonal Architecture, but still find yourself trapped in a slow and expensive always-connected development experience, you might have missed a point... → the *Why* and *What*, not *How*. +> **In contrast to that**, if (you think) you are doing Hexagonal Architecture, but still find yourself trapped in a slow and expensive always-connected development experience, you might have missed a point... → the *Why* and *What*, not *How*. From 3965aebc1df3a25c356f909c9858ea6a940c6a25 Mon Sep 17 00:00:00 2001 From: Daniel Hutzel Date: Fri, 5 Jun 2026 11:30:25 +0200 Subject: [PATCH 061/156] polished --- get-started/concepts.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/get-started/concepts.md b/get-started/concepts.md index 1dc56f5587..7d46dc852d 100644 --- a/get-started/concepts.md +++ b/get-started/concepts.md @@ -608,23 +608,24 @@ So, in total, and in effect, we learn: -The *[Hexagonal Architecture](https://en.wikipedia.org/wiki/hexagonal_architecture_(software))* (also known as *Ports and Adapters Architecture/Pattern*) as first proposed by Alistair Cockburn in 2005, is quite famous and fancied these days (rightly so). As he introduces it, its intent is to: +The *[Hexagonal Architecture](https://en.wikipedia.org/wiki/hexagonal_architecture_(software))* (also known as *Ports and Adapters Architecture/Pattern*) as first proposed by Alistair Cockburn in 2005, is quite famous and fancied these days (rightly so). He introduced it back then with the following opening statement and illustration: -*"Allow an application to equally be driven by users, programs, automated test or batch scripts, and to be developed and tested in isolation from its eventual run-time devices and databases"* {.indent style="font-family:serif"} +*"Allow an application to equally be driven by users, programs, automated test or batch scripts, and to be developed and tested in isolation from its eventual run-time devices and databases"* {style="font-family:serif; font-size:115%; padding:0 44px"} -... and he illustrated that like this: ![Hexagonal Architecture original illustration by Alistair Cockburn](assets/concepts/hexagonal-archritecture-origin.png) -In a nutshell, this introduction to the objectives of hexagonal architecture translates to that in our world of cloud-based business applications: +We can translate that to these objectives in our world of cloud-based business applications: > [!tip] Objectives of Hexagonal Architecture > > - Your *Application* (→ the inner hexagon) should stay ***agnostic*** to *"the outside"* > - Thereby allowing to replace *"the outside"* met in production by *mocked* variants > - To reduce complexity and speed up turnaround times at *development*, and in *tests* ->
→ [*'Airplane Mode' Development & Tests*](features#fast-inner-loops) > -> **In contrast to that**, if (you think) you are doing Hexagonal Architecture, but still find yourself trapped in a slow and expensive always-connected development experience, you might have missed a point... → the *Why* and *What*, not *How*. +> -> See also: [*Inner-Loop Development & Tests*](features#fast-inner-loops) +> + +In contrast to that, if (you think) you are doing Hexagonal Architecture, but still find yourself trapped in a slow and expensive always-connected development experience, you might have missed a point... → the *Why* and *What*, not *How*. From 3ea0f9a1bfa761dc3fd5e1ac9f4477baa722fc36 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Mon, 8 Jun 2026 08:56:32 +0100 Subject: [PATCH 062/156] Update compiler error for redirection target in cdl.md (#2617) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The error emitted in the context of an ambiguous redirection is different now, so I changed it in the "danger" highlight section. In order to "contextualise" this part of the error: ```text ... as redirection target for “.Books” ``` I also added the `using` statement to explain the scoped target reference. --- cds/cdl.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cds/cdl.md b/cds/cdl.md index 7ecf16cc83..24d57a83bc 100644 --- a/cds/cdl.md +++ b/cds/cdl.md @@ -1993,10 +1993,12 @@ service AdminService { Auto-redirection fails if a target can't be resolved unambiguously, that is, when there is more than one projection with the same minimal 'distance' to the source. For example, compiling the following model with two projections on `my.Books` would produce this error: ::: danger -Target "Books" is exposed in service "AdminService" by multiple projections "AdminService.ListOfBooks", "AdminService.Books" - no implicit redirection. +Add “@cds.redirection.target” to either “AdminService.Books” or “AdminService.ListOfBooks” to select the entity as redirection target for “bookshop.Books” in this service; can't auto-redirect “AdminService.Authors:books” otherwise (in entity:“AdminService.Books”) ::: ```cds +using bookshop as my from '../db/schema'; + service AdminService { entity ListOfBooks as projection on my.Books; entity Books as projection on my.Books; From 6397b21320f485056bfcc30a5a4f705c5633c8b0 Mon Sep 17 00:00:00 2001 From: Matthias Schur <107557548+MattSchur@users.noreply.github.com> Date: Mon, 8 Jun 2026 12:38:28 +0200 Subject: [PATCH 063/156] Java Migration Guide: Set Min Maven version to `3.9.15` (#2618) --- java/migration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/migration.md b/java/migration.md index f3503fed36..4ca5139fc7 100644 --- a/java/migration.md +++ b/java/migration.md @@ -69,7 +69,7 @@ CAP Java 5.0 increased some minimum required versions: | --- | --- | | Spring Boot | 4.0 | | XSUAA (BTP Security Library) | 4.0.0 | -| Maven | 3.9.10 | +| Maven | 3.9.15 | ## Role-based Visibility -In addition to adding [restrictions on services, entities, and actions/functions](../security/authorization#restrictions), there are use cases where you only want to hide certain parts of the UI for specific users. This is possible by using the respective UI annotations like `@UI.Hidden` or `@UI.CreateHidden` in conjunction with `$edmJson` pointing to a singleton. +In addition to adding [restrictions on services, entities, and actions/functions](../security/authorization#restrictions), there are cases where you want to hide certain UI elements for specific users. You can do this using annotations such as `@UI.Hidden` or `@UI.CreateHidden` together with `$edmJson` pointing to a singleton. -First, you define the [singleton](../protocols/odata#singletons) in your service and annotate it with [`@cds.persistence.skip`](../databases/cdl-to-ddl#cds-persistence-skip) so that no database artefact is created: +First, define the [singleton](../protocols/odata#singletons) in your service and annotate it with [`@cds.persistence.skip`](../databases/cdl-to-ddl#cds-persistence-skip) so that no database artifact is created: ```cds @odata.singleton @cds.persistence.skip @@ -631,9 +632,9 @@ entity Configuration { isAdmin : Boolean; } ``` -> A key is technically not required, but without it some consumers might run into problems. +> A key is technically not required, but omitting it may cause issues for some consumers. -Then define an `on` handler for serving the request: +Then, define an `on` handler to serve the request: ```js srv.on('READ', 'Configuration', async req => { @@ -652,7 +653,7 @@ annotate service.Books with @( ); ``` -The Entity Container is OData specific and refers to the `$metadata` of the OData service in which all accessible entities are located within the Entity Container. +The Entity Container is OData-specific. It refers to the `$metadata` of the OData service, where all accessible entities are registered. :::details SAP Fiori elements also allows to not include it in the path ```cds From a3d48c4a1a580ea51f97603e899e6f04cf37b82c Mon Sep 17 00:00:00 2001 From: Daniel O'Grady <103028279+daogrady@users.noreply.github.com> Date: Wed, 10 Jun 2026 08:54:27 +0200 Subject: [PATCH 066/156] Update get-help.md (#2622) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Point out troubleshoot for missing binds, caused by having set `ignore_scripts=true`. --------- Co-authored-by: René Jeglinsky --- get-started/get-help.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/get-started/get-help.md b/get-started/get-help.md index 2704d41c6e..96b2743575 100644 --- a/get-started/get-help.md +++ b/get-started/get-help.md @@ -301,6 +301,12 @@ Even with this dependency added, on macOS and Linux the built-in implementation +### How to fix "`Error: Could not locate the bindings file. Tried: ...`" + +You probably have `ignore-scripts` set to `true` in your npm configuration. While this is generally a good idea, it prevents certain libraries, like `better-sqlite3`, from running a required postinstall script. +To solve this, you can either temporarily allow scripts and run a reinstall, or manually run the build script for the library in question. For `better-sqlite3`, run `npm run build-release` from within the _node_modules/better-sqlite3_ directory. The first line after the error message shows the relevant _node_modules_ directory. + + ## Java ### How to bypass authorization checks? From f8fd9e545dca618b206cbbec5257b20853b94a8d Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 10 Jun 2026 12:33:22 +0200 Subject: [PATCH 067/156] add docu snipped for draftPrepare with =DraftMessages (#2621) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Becker Co-authored-by: René Jeglinsky --- java/fiori-drafts.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/java/fiori-drafts.md b/java/fiori-drafts.md index a0fe1058b9..859eafb2c4 100644 --- a/java/fiori-drafts.md +++ b/java/fiori-drafts.md @@ -73,13 +73,14 @@ Draft-enabled entities have an extra key `IsActiveEntity` by which you can acces | HTTP / OData request | Event constant name | Default implementation | | ---------------------------------------------------------------------- | ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | | POST with `IsActiveEntity=false` in payload | `DraftService.EVENT_DRAFT_NEW` | Creates a new empty draft. Internally triggers `DRAFT_CREATE`. | -| POST (no `IsActiveEntity`) on entity *without* `draftNew` action | `DraftService.EVENT_DRAFT_NEW` | Creates a new empty draft. Internally triggers `DRAFT_CREATE`. | -| POST (no `IsActiveEntity`) on entity *with* `draftNew` action | `CqnService.EVENT_CREATE` | Creates a new active entity. | +| POST (no `IsActiveEntity`) on entity *without* `draftNew` action | `DraftService.EVENT_DRAFT_NEW` | Creates a new empty draft. Internally triggers `DRAFT_CREATE`. | +| POST (no `IsActiveEntity`) on entity *with* `draftNew` action | `CqnService.EVENT_CREATE` | Creates a new active entity. | | POST with action `draftNew` | `DraftService.EVENT_DRAFT_NEW` | Creates a new empty draft. Internally triggers `DRAFT_CREATE`. | -| PATCH with key `IsActiveEntity=false` | `DraftService.EVENT_DRAFT_PATCH` | Updates an existing draft. | -| DELETE with key `IsActiveEntity=false` | `DraftService.EVENT_DRAFT_CANCEL` | Deletes an existing draft. | -| DELETE with key `IsActiveEntity=true` | `CqnService.EVENT_DELETE` | Deletes an active entity *and* the corresponding draft. | -| POST with `draftPrepare` action | `DraftService.EVENT_DRAFT_PREPARE` | Empty implementation. | +| PATCH with key `IsActiveEntity=false` | `DraftService.EVENT_DRAFT_PATCH` | Updates an existing draft. | +| DELETE with key `IsActiveEntity=false` | `DraftService.EVENT_DRAFT_CANCEL` | Deletes an existing draft. | +| DELETE with key `IsActiveEntity=true` | `CqnService.EVENT_DELETE` | Deletes an active entity *and* the corresponding draft. | +| POST with `draftPrepare` action | `DraftService.EVENT_DRAFT_PREPARE` | Empty implementation. | +| POST with `draftPrepare` action and `$select=DraftMessages` | `DraftService.EVENT_DRAFT_PREPARE` | Simulates the draft activation to validate your document completely. The system triggers a `draftActivate` operation (`CREATE` or `UPDATE` event) in an isolated transaction and then rolls it back. | | POST with `draftEdit` action | `DraftService.EVENT_DRAFT_EDIT` | Creates a new draft from an active entity. Internally triggers `DRAFT_CREATE`. | | POST with `draftActivate` action | `DraftService.EVENT_DRAFT_SAVE` | Activates a draft and updates the active entity. Triggers an `CREATE` or `UPDATE` event on the affected entity. | | n/a | `DraftService.EVENT_DRAFT_CREATE` | Stores a new draft in the database. | From 41ecff751b02fe864527ce189773835e96bf6a03 Mon Sep 17 00:00:00 2001 From: Marcel Schwarz Date: Wed, 10 Jun 2026 17:56:30 +0200 Subject: [PATCH 068/156] Add `req.req` and `req.res` sections (#1603) closes `cdsnode/issues/2044` --------- Co-authored-by: Mahati Shankar --- node.js/events.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/node.js/events.md b/node.js/events.md index eb0f9fb618..c9f325a6f1 100644 --- a/node.js/events.md +++ b/node.js/events.md @@ -88,6 +88,7 @@ this.on ('*', req => { ``` Keep in mind that multiple requests (that is, instances of `cds.Request`) may share the same incoming HTTP request and outgoing HTTP response (for example, in case of an OData batch request). +See sections [`req`](#req) and [`res`](#res) of `cds.Request` to learn more about accessing the request and response objects of individual requests within an incoming batch request. @@ -251,6 +252,18 @@ Class `cds.Request` extends [`cds.Event`] with additional features to represent +### . req {.property} + +Provides access to the express request object of individual requests within an incoming batch request. For convenience, in the case of non-batch requests, it points to the same request object as [`req.http.req`](#http). + + + +### . res {.property} + +Provides access to the express response object of individual requests within an incoming batch request. For convenience, in the case of non-batch requests, it points to the same response object as [`req.http.res`](#http). + + + ### . method {.property} The HTTP method of the incoming request: From dcd24ec12f5198f96d737fab1357e14332a6b29e Mon Sep 17 00:00:00 2001 From: Johannes Vogt Date: Thu, 11 Jun 2026 14:09:58 +0200 Subject: [PATCH 069/156] Add concrete logger example for application.yaml (#2614) Currently we don't show any cds specific loggers in the `application.yaml` example. Users reading capire are expecting to find CAP specific information. Adding an example for some of the most used settings. --- java/operating-applications/observability.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/operating-applications/observability.md b/java/operating-applications/observability.md index c0b307093c..fb4b6085c5 100644 --- a/java/operating-applications/observability.md +++ b/java/operating-applications/observability.md @@ -99,6 +99,11 @@ logging.level.my.loggers.order.Consolidation: INFO # Turn off all loggers matching org.springframework.*: logging.level.org.springframework: OFF + +# Turn on debug logging for sql statements and messaging: +logging.level: + com.sap.cds.persistence.sql: DEBUG + com.sap.cds.messaging: DEBUG ``` ::: From 29f8e03db56baee16a649f3640c1e7c93b4e0aa6 Mon Sep 17 00:00:00 2001 From: Johannes Vogel <31311694+johannes-vogel@users.noreply.github.com> Date: Tue, 16 Jun 2026 04:51:19 +0200 Subject: [PATCH 070/156] fix: fiori docs to reflect cds10 reality (#2628) Co-authored-by: Daniel Hutzel --- .github/CODEOWNERS | 10 +++++----- guides/uis/fiori.md | 21 ++++++++++++--------- node.js/core-services.md | 9 +++++---- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 153265b1a8..3ea81feac7 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -2,15 +2,15 @@ # We start with defining ownership globally and later on can get more granular. # General content -* @renejeglinsky +* @renejeglinsky @danjoa -node.js/ @smahati @renejeglinsky -java/ @smahati @renejeglinsky +node.js/ @smahati @renejeglinsky @danjoa +java/ @smahati @renejeglinsky @danjoa # Infra .github/ @chgeo @swaldmann -.vitepress/ @chgeo @swaldmann -public/ @chgeo @swaldmann +.vitepress/ @chgeo @swaldmann @danjoa +public/ @chgeo @swaldmann @danjoa # allow dependencies updates through renovate w/o code owners package.json diff --git a/guides/uis/fiori.md b/guides/uis/fiori.md index 0ffea247b2..a2c5eb43c4 100644 --- a/guides/uis/fiori.md +++ b/guides/uis/fiori.md @@ -307,7 +307,7 @@ Draft locks are not applied when creating drafts for new entities, as there is n Fiori clients send the following HTTP requests for draft operations: ```php:line-numbers [Requests to draft data] -POST /Foo/draftNew //> NEW +POST /Foo //> NEW POST /Foo(ID,IsActiveEntity=true)/draftEdit //> EDIT GET /Foo(ID,IsActiveEntity=false) //> READ PATCH /Foo(ID,IsActiveEntity=false) {...} //> PATCH @@ -315,19 +315,16 @@ POST /Foo(ID,IsActiveEntity=false)/draftActivate //> SAVE DELETE /Foo(ID,IsActiveEntity=false) //> DISCARD ``` - The key parameter `IsActiveEntity=false` addresses draft data, with the exception of `draftNew`, which is an _unbound_ action, and `draftEdit` for semantic reasons. - -::: details `draftNew` actions are used and -Previously, regular `POST /Foo` requests without an `IsActiveEntity` parameter created new drafts, which caused ambiguities with requests to active data. -Can be disabled with cds.fiori.draft_new_action: false. -::: +The key parameter `IsActiveEntity=false` addresses draft data, with the exception of the empty POST and `draftEdit` for semantic reasons. ::: details Full HTTP requests ... The requests above are abbreviated for clarity. The actual HTTP requests include the service path, content-type headers, and JSON bodies as shown below. ```http -POST /odata/v4/TravelService/Travels/draftNew +POST /odata/v4/TravelService/Travels Content-Type: application/json + +{} ``` ```http POST /odata/v4/TravelService/Travels(ID=a11fb6f1-36ab-46ec-b00c-d379031e817a,IsActiveEntity=true)/draftEdit @@ -364,15 +361,21 @@ While this was always possible in CAP Java before, it's available for CAP Node.j #### Draft-agnostic Requests -Taking this further, `IsActiveEntity=true` is assumed by default, so clients that are unaware of drafts or don't need to handle them can ignore all draft-specific requests and parameters: +Taking this further, through cds.fiori.draft_new_action: true `IsActiveEntity=true` is assumed by default, so clients that are unaware of drafts or don't need to handle them can ignore all draft-specific requests and parameters: ```php:line-numbers [Draft-agnostic requests to active data] +// creation of active instances POST /Foo //> CREATE GET /Foo(ID) //> READ PATCH /Foo(ID) {...} //> UPDATE DELETE /Foo(ID) //> DELETE +// creation of draft instances +POST /Foo/draftNew //> CREATE new draft [!code ++] +... ``` +The previously used `POST /Foo` requests without an `IsActiveEntity` parameter to create new drafts is now replaced by the collection bound action `draftNew` to resolve the ambiguities with requests to active data. + ::: details Available for CAP Node.js – not yet for CAP Java Draft-agnostic requests as above assume `IsActiveEntity=true` by default for all requests that don't explicitly specify it. This was possible in CAP Node.js, but not in CAP Java, which is still bound by the [*Olingo*](https://olingo.apache.org) library. For CAP Java, explicitly add `IsActiveEntity=true` as a key parameter to address active data diff --git a/node.js/core-services.md b/node.js/core-services.md index e0df433435..fca18fd920 100644 --- a/node.js/core-services.md +++ b/node.js/core-services.md @@ -396,18 +396,19 @@ var srv.options : { //> from cds.requires config -### . entities {.property alt="The following documentation on actions also applies to entities. "} -### . events {.property alt="The following documentation on actions also applies to events. "} ### . actions {.property} +### . events {.property} +### . types {.property} +### . entities {.property} ###### srv-entities ```tsx -var srv.entities/events/actions : Iterable <{ +var srv.entities/events/actions/types : Iterable <{ name : CSN definition }> ``` -These properties provide convenient access to the CSN definitions of the *entities*, *events* and *actions* (incl. *functions*) exposed by this service. They return instances of [`LinkedDefinitions`](cds-reflect#iterable) which you can use in all of these ways: +These properties provide convenient access to the CSN definitions of the *entities*, *types*, *events*, and *actions* (incl. *functions*) exposed by this service. They return instances of [`LinkedDefinitions`](cds-reflect#iterable) which you can use in all of these ways: ```js // Assumed `this` is an instance of cds.Service From 3d5d73fa8123636ddee7f839813844fdffd4971a Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Wed, 17 Jun 2026 07:13:51 +0100 Subject: [PATCH 071/156] fix local binding registry filename in reuse-and-compose.md (#2632) The file starts with a dot and this was omitted in a couple of places in this section. --- guides/integration/reuse-and-compose.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/guides/integration/reuse-and-compose.md b/guides/integration/reuse-and-compose.md index 5b9de77126..a0bbb14e1f 100644 --- a/guides/integration/reuse-and-compose.md +++ b/guides/integration/reuse-and-compose.md @@ -594,9 +594,9 @@ You can cmd/ctrl-click or double click on that to see the file's content, and fi Whenever you start a CAP server with `cds watch`, this is what happens automatically: -1. For all *provided* services, corresponding entries are written to _~/cds-services.json_ with respective `credentials`, namely the `url`. +1. For all *provided* services, corresponding entries are written to _~/.cds-services.json_ with respective `credentials`, namely the `url`. -2. For all *required* services, corresponding entries are fetched from _~/cds-services.json_. If found, the `credentials` are filled into the respective entry in `cds.env.requires.` [as introduced previously](#bindings-via-cds-env). +2. For all *required* services, corresponding entries are fetched from _~/.cds-services.json_. If found, the `credentials` are filled into the respective entry in `cds.env.requires.` [as introduced previously](#bindings-via-cds-env). In effect, all the services that you start locally in separate processes automatically receive their required bindings so they can talk to each other out of the box. From c0cb602bd75dfe1a5ef8e125412c47321373e33e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 17 Jun 2026 06:22:32 +0000 Subject: [PATCH 072/156] Update dependency sass to v1.101.0 (#2624) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [sass](https://redirect.github.com/sass/dart-sass) | [`1.100.0` → `1.101.0`](https://renovatebot.com/diffs/npm/sass/1.100.0/1.101.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/sass/1.101.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/sass/1.100.0/1.101.0?slim=true) | --- ### Release Notes
sass/dart-sass (sass) ### [`v1.101.0`](https://redirect.github.com/sass/dart-sass/blob/HEAD/CHANGELOG.md#11010) [Compare Source](https://redirect.github.com/sass/dart-sass/compare/1.100.0...1.101.0) - **Potentially breaking bug fix:** The Node package importer now properly supports resolving import-only variants of Sass files declared in the `exports`, `sass`, and `style` fields of `package.json`. Previously, these files were ignored even when loaded via `@import`, so any code relying on loading module-system-only files this way may break.
--- ### Configuration 📅 **Schedule**: (UTC) - 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: Daniel Hutzel --- package-lock.json | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 565a47bfeb..b59be75ded 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,10 +11,9 @@ "devDependencies": { "@cap-js/cds-typer": "^0", "@cap-js/cds-types": "^0", - "@cap-js/db-service": "^2", - "@cap-js/sqlite": "^2", + "@cap-js/sqlite": ">=2", "@mdit/plugin-dl": ">=0.22.2", - "@sap/cds": "^9", + "@sap/cds": ">=9", "@shikijs/monaco": "^4", "@shikijs/vitepress-twoslash": "^4", "@sqlite.org/sqlite-wasm": "latest", @@ -6000,9 +5999,9 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.100.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.100.0.tgz", - "integrity": "sha512-B5j0rYMlinhhOo9tjQebMVVn0TfyXAF+wB3b2ggZUuJ/is/Y+7+JGjirAMxHZ9Z3hIP98NPfamlAkBHa1lAaXQ==", + "version": "1.101.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.101.0.tgz", + "integrity": "sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==", "dev": true, "license": "MIT", "dependencies": { From 6876aeb447ef3be4a7e733126752edeca674a224 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Wed, 17 Jun 2026 18:25:37 +0200 Subject: [PATCH 073/156] Remove obsolete migration menu entry (#2636) --- node.js/_menu.md | 1 - 1 file changed, 1 deletion(-) diff --git a/node.js/_menu.md b/node.js/_menu.md index bca3500453..b4a60c31e4 100644 --- a/node.js/_menu.md +++ b/node.js/_menu.md @@ -63,4 +63,3 @@ # [TypeScript](typescript) # [Best Practices](best-practices) # [Integrate with UCL](../../node.js/ucl) -# [Upgrading @sap/cds](../../node.js/upgrading) From 3fee2515da796ea9e07b1484f90dd5b5af4068e2 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Wed, 17 Jun 2026 19:28:11 +0200 Subject: [PATCH 074/156] fix: support redirects ending with `/` (#2634) So that http://cap.cloud.sap/docs/about/ works again. This one is referenced from https://me.sap.com/notes/3464370. --- .vitepress/rewrites.js | 1 - 1 file changed, 1 deletion(-) diff --git a/.vitepress/rewrites.js b/.vitepress/rewrites.js index 3caf87b0d2..4ec676f0db 100644 --- a/.vitepress/rewrites.js +++ b/.vitepress/rewrites.js @@ -18,7 +18,6 @@ export class Rewrites { for (let line of md.split('\n')) { let [,from,to] = /^[^[]*\[(.*)\]\((.*)\)/.exec(line) || [] if (!from || !to) continue - if (from.at(-1) === '/') from = from.slice(0,-1) entries[from] = to } } catch {/* ignored */} From 68688832bd0f60786488923e2c32c522585122c7 Mon Sep 17 00:00:00 2001 From: Daniel Schlachter Date: Thu, 18 Jun 2026 08:25:41 +0200 Subject: [PATCH 075/156] fix: drop Node.js 20 references, recommend 22/24 (#2635) Node.js 20 reached end of life in April 2026. Update the get-help guide to no longer list it as a supported LTS version and bump the Maven pom.xml example to v24.14.1. --- get-started/get-help.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/get-started/get-help.md b/get-started/get-help.md index 96b2743575..61cdb3558c 100644 --- a/get-started/get-help.md +++ b/get-started/get-help.md @@ -34,7 +34,7 @@ To start VS Code via the `code` CLI, users on macOS must first run a command (*S ### Check the Node.js version { #node-version} -Run the latest LTS version of Node.js (even numbers: 20, 22, 24). Avoid odd versions, as some modules with native parts may not install. Check version with: +Run the latest LTS version of Node.js (even numbers: 22, 24). Avoid odd versions, as some modules with native parts may not install. Check version with: ```sh node -v @@ -335,7 +335,7 @@ To fix this, either switch the Node.js version using a Node version manager, or ```xml - v20.11.0 + v24.14.1 From 7ce20cc528af75daf3732d469625d5206c69e7b9 Mon Sep 17 00:00:00 2001 From: Maximilian Eckert Date: Thu, 18 Jun 2026 12:35:51 +0200 Subject: [PATCH 076/156] add data privacy plugin to plugins list (#2637) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: René Jeglinsky --- plugins/_menu.md | 1 + plugins/index.md | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/plugins/_menu.md b/plugins/_menu.md index d4aef87915..6a0af31310 100644 --- a/plugins/_menu.md +++ b/plugins/_menu.md @@ -6,6 +6,7 @@ # [Attachments](index#attachments) # [SAP Document Management](index#@cap-js/sdm) # [Audit Logging](index#audit-logging) +# [Data Privacy](index#data-privacy) # [Change Tracking](index#change-tracking) # [Notifications](index#notifications) # [Telemetry](index#telemetry) diff --git a/plugins/index.md b/plugins/index.md index 52f07d16ac..a4414305fd 100644 --- a/plugins/index.md +++ b/plugins/index.md @@ -274,6 +274,20 @@ Available for: Learn more about audit logging in [Node.js](../guides/security/dpp-audit-logging.md) and in [Java](../java/auditlog) {.learn-more} +## Data Privacy + +The Node.js plugin `@cap-js/data-privacy` provides out-of-the-box integration for CAP applications with the [SAP Data Privacy Integration (DPI)](https://help.sap.com/docs/data-privacy-integration) service. + +Based on `@PersonalData` and `@ILM` annotations in your data model, the plugin automatically exposes two endpoints that SAP DPI consumes: + +- **`/dpp/information`** — returns personal data for display in the _Manage Personal Data_ app +- **`/dpp/retention`** — handles data blocking and deletion based on retention rules defined in SAP DPI + +Available for: + +[![Node.js](/logos/nodejs.svg 'Link to the plugin repository.'){style="height:2.5em; display:inline; margin:0 0.2em;"}](https://github.com/cap-js/data-privacy#readme) + + ## Change Tracking From c4bc04e70e29129c5bde524e93a2f401cb2f7e0a Mon Sep 17 00:00:00 2001 From: Markus Ofterdinger Date: Thu, 18 Jun 2026 13:20:43 +0200 Subject: [PATCH 077/156] Update min. Maven version to 3.9.14 in Java Migration Guide (#2627) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Consider changes in PR: https://github.wdf.sap.corp/cds-java/cds-services/pull/6919 --------- Co-authored-by: Adrian Görler --- java/migration.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java/migration.md b/java/migration.md index 4ca5139fc7..c3e3e9624e 100644 --- a/java/migration.md +++ b/java/migration.md @@ -69,7 +69,7 @@ CAP Java 5.0 increased some minimum required versions: | --- | --- | | Spring Boot | 4.0 | | XSUAA (BTP Security Library) | 4.0.0 | -| Maven | 3.9.15 | +| Maven | 3.9.14 | +| `cds.errors.combined` | Was deprecated since CAP Java 4.0. The property had no effect anymore and has been removed. | +| `cds.mcp.autoConfig` | Replaced by `cds.mcp.autoWired`. | +| `cds.multiTenancy.serviceManager` `.acceptInstancesWithoutTenant` | Removed. No replacement — silent breaking change. | +| `cds.multiTenancy.serviceManager` `.ignoreDuplicateTenantInstances` | Removed. No replacement — silent breaking change. | +| `cds.odataV2.searchMode` | Removed. The runtime now behaves as if `pass-through` was set (the search string is passed through to the data store). The property has no effect anymore. Remove any configured value. | +| `cds.odataV4.searchMode` | Removed. The runtime now behaves as if `pass-through` was set (the search string is passed through to the data store). The property has no effect anymore. Remove any configured value. | +| `cds.sql.collate` | Removed. The property had no documented effect and was never exposed. Remove any configured value. | +| `cds.sql.hana.optimizationMode` | Was deprecated since CAP Java 4.0. SAP HANA's HEX engine is used ever since. | +| `cds.sql.search.mode`| Replaced by `cds.sql.search.localized` with value `view` to change the default. `generic` is not supported anymore. | +| `cds.taskScheduler.enabled` | Replaced by `cds.outbox.persistent.scheduler.enabled`. | ### Removed Java APIs { #removed-java-apis-4-to-5 } @@ -102,17 +125,18 @@ Removed deprecated methods: | Removed method | Replacement / Explanation | |--------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------| -| `c.s.c.feature.ucl.services.AssignEventContext.setUclResult(SpiiResult)` | `setResult(SpiiResult)` | -| `c.s.c.feature.ucl.services.AssignEventContext.getUclResult()` | `getResult()` | -| `c.s.c.services.mt.SaaSRegistryDependency.getAppId()` | `getXsappname()` | -| `c.s.c.services.mt.SaaSRegistryDependency.setAppId(String appId)` | `setXsappname(appId)` | -| `c.s.c.services.mt.SaaSRegistryDependency.getAppName()` | `getXsappname()` | -| `c.s.c.services.mt.SaaSRegistryDependency.setAppName(String appName)` | `setXsappname(appName)` | -| `c.s.c.services.ServiceExceptionUtils.getLocalizedMessage (String code, Object[] args, Locale locale)` | `getLocalizedMessage(code, args, locale, true)` (pass `true` for `errorStatusFallback` to keep the previous behavior) | -| `c.s.c.services.ServiceExceptionUtils.getMessageTarget(Path path, CdsElement element)` | `MessageTarget.create(path, element)` | -| `c.s.c.services.ServiceExceptionUtils.getMessageTarget(String target)` | `MessageTarget.create(target)` | -| `c.s.c.services.ServiceExceptionUtils.getMessageTarget(String parameter, Class type, Function path)` | `MessageTarget.create(parameter, type, path)` | -| `c.s.c.services.ServiceExceptionUtils.getMessageTarget(String parameter, Function path)` | `MessageTarget.create(parameter, path)` | +| `c.s.c.feature.ucl.services.AssignEventContext` `.getUclResult()` | `getResult()` | +| `c.s.c.feature.ucl.services.AssignEventContext` `.setUclResult(SpiiResult)` | `setResult(SpiiResult)` | +| `c.s.c.reflect.CdsEntity.isAbstract()` | always `false` | +| `c.s.c.services.mt.SaaSRegistryDependency` `.getAppId()` | `getXsappname()` | +| `c.s.c.services.mt.SaaSRegistryDependency` `.setAppId(String appId)` | `setXsappname(appId)` | +| `c.s.c.services.mt.SaaSRegistryDependency` `.getAppName()` | `getXsappname()` | +| `c.s.c.services.mt.SaaSRegistryDependency` `.setAppName(String appName)` | `setXsappname(appName)` | +| `c.s.c.services.ServiceExceptionUtils` `.getLocalizedMessage (String code, Object[] args, Locale locale)` | `getLocalizedMessage(code, args, locale, true)` (pass `true` for `errorStatusFallback` to keep the previous behavior) | +| `c.s.c.services.ServiceExceptionUtils` `.getMessageTarget(Path path, CdsElement element)` | `MessageTarget.create(path, element)` | +| `c.s.c.services.ServiceExceptionUtils` `.getMessageTarget(String target)` | `MessageTarget.create(target)` | +| `c.s.c.services.ServiceExceptionUtils` `.getMessageTarget(String parameter, Class type, Function path)` | `MessageTarget.create(parameter, type, path)` | +| `c.s.c.services.ServiceExceptionUtils` `.getMessageTarget(String parameter, Function path)` | `MessageTarget.create(parameter, path)` | ### Changes in the `cds-maven-plugin` From 5cb82cc2bf19bcb2d8f18a97148626218e99ced1 Mon Sep 17 00:00:00 2001 From: David H Lam Date: Fri, 19 Jun 2026 15:04:10 +0200 Subject: [PATCH 083/156] Update remote-services.md (#2630) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added subsection about configuring `on-behalf-of` for IAS app-2-app destinations. --------- Co-authored-by: Stefan Henke Co-authored-by: René Jeglinsky --- java/cqn-services/remote-services.md | 32 ++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/java/cqn-services/remote-services.md b/java/cqn-services/remote-services.md index a8e319a599..7c408e4eb9 100644 --- a/java/cqn-services/remote-services.md +++ b/java/cqn-services/remote-services.md @@ -213,6 +213,38 @@ At runtime, this destination configuration will use the bound `identity` service [Learn more about consuming APIs from other IAS-Applications in the **SAP Cloud Identity Services documentation**.](https://help.sap.com/docs/cloud-identity-services/cloud-identity-services/consume-apis-from-other-applications){.learn-more} +##### Configuring the Authentication Strategy + +By default, when calling a remote IAS-based API through a destination, CAP propagates the user identity associated with the current `RequestContext` (`currentUser`). If the `RequestContext` contains a named user, CAP propagates the named user. If not, CAP requests a technical user token. + +For background processing or technical integrations, you may want to force the remote API call to use a technical user. Use the `destination.onBehalfOf` configuration to control this behavior: + +::: code-group +```yaml [srv/src/main/resources/application.yaml] +cds: + remote.services: + RemoteIasService: + destination: + name: my-ias-destination + onBehalfOf: systemUser +``` + +The following options are available: + +| Value | Description | +|-------|-------------| +| `currentUser` | Propagates the named user if available, or falls back to a tenant-specific technical user. **(default)** | +| `systemUser` | Uses a tenant-specific technical user, based on the tenant set in the current Request Context. | +| `systemUserProvider` | Uses a technical user of the provider tenant. Useful for internal communication that does not require tenant-specific authorization. | + +::: tip Behaves similar to binding-based configuration +This behaves identically to the [`onBehalfOf` option in binding-based configurations](#configuring-the-authentication-strategy). Use it when your IAS app-2-app communication is configured via a BTP destination with `cloudsdk.ias-dependency-name` rather than a direct service binding. +::: + +::: warning Only applicable to IAS app-2-app destinations +The `onBehalfOf` option applies only to IAS app-2-app destinations (destinations with the `cloudsdk.ias-dependency-name` property set). It has no effect on other destination types. +::: + #### Retrieve Destinations The CAP Java SDK obtains the destination for a _Remote Service_ from the `DestinationAccessor` using the name that is configured in the _Remote Service_'s destination configuration. From 32194596d3e4e34328caada2b228b7d935557462 Mon Sep 17 00:00:00 2001 From: DJ Adams Date: Mon, 22 Jun 2026 08:11:15 +0100 Subject: [PATCH 084/156] Fix minor typo in schema-evolution.md (#2645) --- guides/databases/schema-evolution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/databases/schema-evolution.md b/guides/databases/schema-evolution.md index 2092079a5a..78c21f27bb 100644 --- a/guides/databases/schema-evolution.md +++ b/guides/databases/schema-evolution.md @@ -195,7 +195,7 @@ Learn more about that in the [SAP HANA](hana.md) guide, section [HDI Schema Evol For Java-based CAP projects, you can also use [Liquibase](https://www.liquibase.org/) to control when, where, and how you deploy database changes. ::: tip Liquibase license change -Please be aware that Liquibase [changed it's license to Functional Source License (FSL)](https://www.liquibase.com/blog/liquibase-community-for-the-future-fsl) with release 5.0. You need to check if this license is compatible with your application. +Please be aware that Liquibase [changed its license to Functional Source License (FSL)](https://www.liquibase.com/blog/liquibase-community-for-the-future-fsl) with release 5.0. You need to check if this license is compatible with your application. ::: Learn more about that in the [PostgreSQL](postgres.md) guide, section [Using Liquibase (Java)](postgres#using-liquibase-java). From 31f06390c26812f91eb6f8ce2a108e0b50af204a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 07:10:38 +0000 Subject: [PATCH 085/156] Update CAP Java SDK to v4.9.1 (#2644) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [com.sap.cds:cds4j-api](http://www.sap.com) ([source](https://cap.cloud.sap/docs/java/)) | `4.9.0` → `4.9.1` | ![age](https://developer.mend.io/api/mc/badges/age/maven/com.sap.cds:cds4j-api/4.9.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.sap.cds:cds4j-api/4.9.0/4.9.1?slim=true) | --- ### Configuration 📅 **Schedule**: (UTC) - 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> --- .vitepress/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vitepress/config.js b/.vitepress/config.js index f972802f2b..5647c17206 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -133,7 +133,7 @@ if (!siteURL.pathname.endsWith('/')) siteURL.pathname += '/' config.themeConfig.capire = { versions: { java_services: '4.9.0', - java_cds4j: '4.9.0', + java_cds4j: '4.9.1', cloud_sec_ams: '3.8.1' }, gotoLinks: [], From 22ddfd8c48954828c393c51c2e371313dad05434 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 09:12:31 +0200 Subject: [PATCH 086/156] Update shiki monorepo to v4.2.0 (#2612) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@shikijs/monaco](https://redirect.github.com/shikijs/shiki) ([source](https://redirect.github.com/shikijs/shiki/tree/HEAD/packages/monaco)) | [`4.1.0` → `4.2.0`](https://renovatebot.com/diffs/npm/@shikijs%2fmonaco/4.1.0/4.2.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@shikijs%2fmonaco/4.2.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@shikijs%2fmonaco/4.1.0/4.2.0?slim=true) | | [@shikijs/vitepress-twoslash](https://redirect.github.com/shikijs/shiki) ([source](https://redirect.github.com/shikijs/shiki/tree/HEAD/packages/vitepress-twoslash)) | [`4.1.0` → `4.2.0`](https://renovatebot.com/diffs/npm/@shikijs%2fvitepress-twoslash/4.1.0/4.2.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@shikijs%2fvitepress-twoslash/4.2.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@shikijs%2fvitepress-twoslash/4.1.0/4.2.0?slim=true) | --- ### Release Notes
shikijs/shiki (@​shikijs/monaco) ### [`v4.2.0`](https://redirect.github.com/shikijs/shiki/releases/tag/v4.2.0) [Compare Source](https://redirect.github.com/shikijs/shiki/compare/v4.1.0...v4.2.0) #####    🚀 Features - Add [@​shikijs/stream](https://redirect.github.com/shikijs/stream) and [@​shikijs/magic-move](https://redirect.github.com/shikijs/magic-move) packages  -  by [@​antfu](https://redirect.github.com/antfu) in [#​1283](https://redirect.github.com/shikijs/shiki/issues/1283) [(d031f)](https://redirect.github.com/shikijs/shiki/commit/d031f9b6) #####    🐞 Bug Fixes - **transformers**: Handle YAML comment prefixes correctly for v3  -  by [@​AkaHarshit](https://redirect.github.com/AkaHarshit) in [#​1266](https://redirect.github.com/shikijs/shiki/issues/1266) [(f694a)](https://redirect.github.com/shikijs/shiki/commit/f694a725) - **vitepress-twoslash**: Scroll blocking on mobile viewports  -  by [@​micaiguai](https://redirect.github.com/micaiguai) in [#​1262](https://redirect.github.com/shikijs/shiki/issues/1262) [(9e0e8)](https://redirect.github.com/shikijs/shiki/commit/9e0e89c8) #####     [View changes on GitHub](https://redirect.github.com/shikijs/shiki/compare/v4.1.0...v4.2.0)
--- ### Configuration 📅 **Schedule**: (UTC) - 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> --- package-lock.json | 292 +++++++++++++++++++++++++--------------------- 1 file changed, 156 insertions(+), 136 deletions(-) diff --git a/package-lock.json b/package-lock.json index b59be75ded..6986a037a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -290,9 +290,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "engines": { @@ -300,9 +300,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, "license": "MIT", "engines": { @@ -310,13 +310,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -326,14 +326,14 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1949,14 +1949,14 @@ } }, "node_modules/@shikijs/core": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.1.0.tgz", - "integrity": "sha512-jLJtSJeuFffqX6/inRE1zqU5aFv2hrszvYgq3OjbAgFRZiWv7abKMDdQzYxuSDfmUPQozZvI/kuy6VMTvnvqTQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-4.2.0.tgz", + "integrity": "sha512-Hc87Ab1Ld/vEbZRCbwx344I5v+4RU8CVToUTRkqXL1+TjbuOp9U5Xa0M23V4GEWHxVn+yO5otb+HkQVm3ptWQQ==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/primitive": "4.1.0", - "@shikijs/types": "4.1.0", + "@shikijs/primitive": "4.2.0", + "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4", "hast-util-to-html": "^9.0.5" @@ -1966,13 +1966,13 @@ } }, "node_modules/@shikijs/engine-javascript": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.1.0.tgz", - "integrity": "sha512-YquhawCUgaBfhsS72e2Y/dI59gCBNPHu3fEO/tvLaXrTssxZrY5ddjtNLTwndrMgPo8b3IscE+xoICDzpTmlFQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-4.2.0.tgz", + "integrity": "sha512-fjETeq1k5ffyXqRgS6+3hpvqseLalp1kjNfRbXpUgWR8FpZ1CmQfiNHovc5lncYjt/Vg5JK/WJEmLahjwMa0og==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "4.1.0", + "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", "oniguruma-to-es": "^4.3.6" }, @@ -1981,13 +1981,13 @@ } }, "node_modules/@shikijs/engine-oniguruma": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.1.0.tgz", - "integrity": "sha512-axLpjVs45YBvvINa+dJF+NPW+KtFkNXsFr4SDw2BMj9GdeMnGxVB9PQb2xXlJYovslt/nz6giedAyOANkfc7hg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-4.2.0.tgz", + "integrity": "sha512-hTorK1dffPkpbMUk6Z+828PgRo7d07HbnizoP0hNPFjhxMHctj0Px/qoHeGMYafc6ju+u9iMldN4JbVzNQM++g==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "4.1.0", + "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2" }, "engines": { @@ -1995,27 +1995,27 @@ } }, "node_modules/@shikijs/langs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.1.0.tgz", - "integrity": "sha512-nwOMruEkbgdZfQ/b8CgpNBVOpvG1k0N5tbmgiFeqsan401+x3ILqlzZJowSla4Agmq4hG2Uf2wh5jLTEhR8VSg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/langs/-/langs-4.2.0.tgz", + "integrity": "sha512-bwrVRlJ0wUhZxAbVdvBbv2TTC9yLsh4C/IO5Ofz0T8MQntgDvyVnkbjw9vi50r1kx7RCIJdnJnjZAwmAsXFLZQ==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "4.1.0" + "@shikijs/types": "4.2.0" }, "engines": { "node": ">=20" } }, "node_modules/@shikijs/monaco": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/monaco/-/monaco-4.1.0.tgz", - "integrity": "sha512-jnCofD2i7kZa57qX0KOKKyxGmuu9Eb+lVXRRhwqOT3pOo9gLvQquVMVqQymwpbum7Jm7NTsXzEytnJFF/SvXSg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/monaco/-/monaco-4.2.0.tgz", + "integrity": "sha512-NBAY81HWX6wNYsbedqzkg3c75/XiwncUthARZNMp2Ac3656HjCfyfAdiRujdxq93LFTZJ5545yIyBz8hKMKZpw==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "4.1.0", - "@shikijs/types": "4.1.0", + "@shikijs/core": "4.2.0", + "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2" }, "engines": { @@ -2023,13 +2023,13 @@ } }, "node_modules/@shikijs/primitive": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.1.0.tgz", - "integrity": "sha512-zx2/2Uwj2q9X3KSyYREEhXO23xBw5WUhP4orK2lE4r+t9JGITmEe0JH+wPmJhqHpOT2bRRs6lAL945+LDvOAGw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/primitive/-/primitive-4.2.0.tgz", + "integrity": "sha512-NOq+DtUkVBJtZMVXL5A0vI0Xk8nvDYaXetFHSJFlOqjDZIVhIPRYFdGkSoElDqNuegikcc3A76SNUa8dTqtAYA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "4.1.0", + "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" }, @@ -2038,13 +2038,13 @@ } }, "node_modules/@shikijs/themes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.1.0.tgz", - "integrity": "sha512-emCcTnUM7yO2wltYbaxm+yLvcCI4+h8XBKc4KmJ7EZUXoSGjcCHifkI//R4OFit9ewpg7H2/9tjOuXrT2v/Knw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/themes/-/themes-4.2.0.tgz", + "integrity": "sha512-RX8IHYeLv8Cu2W6ruc3RxUqWn0IYCqSrMBzi/uRGAmfyDNOnNO5BF/Px7o97n4XTpmFTo5GbRaazuOWj+2ak2w==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/types": "4.1.0" + "@shikijs/types": "4.2.0" }, "engines": { "node": ">=20" @@ -2123,14 +2123,14 @@ } }, "node_modules/@shikijs/twoslash": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-4.1.0.tgz", - "integrity": "sha512-XD7d3LqLXOaL6PbFKGwtdnfcyBdOfKWfxb1+c4MVknVTemwnMQxqj1wYhhWBLRdk8H3Fp9pyf/FILfy2Nzeg8g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-4.2.0.tgz", + "integrity": "sha512-PG/F0tMyt4zAvHVBL7Ehtk/ZpI2Rq3PwaXRYJaOO41eIK/iV9GOO/20jZhQkScOdcP6aFwHC2/x/GxmeR4tMlA==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "4.1.0", - "@shikijs/types": "4.1.0", + "@shikijs/core": "4.2.0", + "@shikijs/types": "4.2.0", "twoslash": "^0.3.8" }, "engines": { @@ -2141,9 +2141,9 @@ } }, "node_modules/@shikijs/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.1.0.tgz", - "integrity": "sha512-3EQWX54fMpniOrDblzAhiwiJwpiTMW6+B9DWyUd9ska483tbayFYuw47UxwuPknI31bKnySfVQ/QW+jFL4rFdA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-4.2.0.tgz", + "integrity": "sha512-VT/MKtlpOhEPZloSH3Pb9WCZEBDoQVMa9jedp5UAwmJOar1DVc9DRODAxmYPW9M93IK4ryuqRejFfmlvlVDemw==", "dev": true, "license": "MIT", "dependencies": { @@ -2155,25 +2155,25 @@ } }, "node_modules/@shikijs/vitepress-twoslash": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@shikijs/vitepress-twoslash/-/vitepress-twoslash-4.1.0.tgz", - "integrity": "sha512-/eXm6H0fAcLKjU+DyEKBNjQeqpIoeCbY10IO8i8FftB7juVAX1Or49AFBJGRYfrKgTrXOaLsNaocL3jV/dgoTg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@shikijs/vitepress-twoslash/-/vitepress-twoslash-4.2.0.tgz", + "integrity": "sha512-xji8w8GLho9XuBi+1chJg3K4jRiM9dSq21tL44HrxP2mkRqTadUOcCT+cW2fbjcLE6Zq6AkRizDWXD7yFjyVTg==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/twoslash": "4.1.0", + "@shikijs/twoslash": "4.2.0", "floating-vue": "^5.2.2", "lz-string": "^1.5.0", "magic-string": "^0.30.21", - "markdown-it": "^14.1.1", + "markdown-it": "^14.2.0", "mdast-util-from-markdown": "^2.0.3", "mdast-util-gfm": "^3.1.0", "mdast-util-to-hast": "^13.2.1", "ohash": "^2.0.11", - "shiki": "4.1.0", + "shiki": "4.2.0", "twoslash": "^0.3.8", "twoslash-vue": "^0.3.8", - "vue": "^3.5.34" + "vue": "^3.5.35" }, "engines": { "node": ">=20" @@ -2594,14 +2594,14 @@ "license": "MIT" }, "node_modules/@vue/compiler-core": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.34.tgz", - "integrity": "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.38.tgz", + "integrity": "sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@vue/shared": "3.5.34", + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.38", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" @@ -2621,43 +2621,43 @@ } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.34.tgz", - "integrity": "sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.38.tgz", + "integrity": "sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.34", - "@vue/shared": "3.5.34" + "@vue/compiler-core": "3.5.38", + "@vue/shared": "3.5.38" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.34.tgz", - "integrity": "sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.38.tgz", + "integrity": "sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@vue/compiler-core": "3.5.34", - "@vue/compiler-dom": "3.5.34", - "@vue/compiler-ssr": "3.5.34", - "@vue/shared": "3.5.34", + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.38", + "@vue/compiler-dom": "3.5.38", + "@vue/compiler-ssr": "3.5.38", + "@vue/shared": "3.5.38", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.14", + "postcss": "^8.5.15", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.34.tgz", - "integrity": "sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.38.tgz", + "integrity": "sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.34", - "@vue/shared": "3.5.34" + "@vue/compiler-dom": "3.5.38", + "@vue/shared": "3.5.38" } }, "node_modules/@vue/devtools-api": { @@ -2713,57 +2713,57 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.34.tgz", - "integrity": "sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.38.tgz", + "integrity": "sha512-pG6LV/NDNRbKizcUjFFLAfjaL8mcv4DmR9avNcUw2gDHBzZneuS2TWCmp633ynzxz9YYKNeEPK2I8Wraqy2HUQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.5.34" + "@vue/shared": "3.5.38" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.34.tgz", - "integrity": "sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.38.tgz", + "integrity": "sha512-iyW8WVfF1CpCXxncZY5Ei6rSd6oZr5DgEom//fUjRBRl56AXPD+s9ATvukRt77ZFTuYlnVA1bxY+dJB94tWVYw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.34", - "@vue/shared": "3.5.34" + "@vue/reactivity": "3.5.38", + "@vue/shared": "3.5.38" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.34.tgz", - "integrity": "sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.38.tgz", + "integrity": "sha512-apX2wt9sdfDshS+a2xueFZLVpt0GkRJZSoPmrW/SA4yzXTznhfcMVW59gr7h4YQeY0vJhdJkk2rsIDwgfFgC5A==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.34", - "@vue/runtime-core": "3.5.34", - "@vue/shared": "3.5.34", + "@vue/reactivity": "3.5.38", + "@vue/runtime-core": "3.5.38", + "@vue/shared": "3.5.38", "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.34.tgz", - "integrity": "sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.38.tgz", + "integrity": "sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.34", - "@vue/shared": "3.5.34" + "@vue/compiler-ssr": "3.5.38", + "@vue/shared": "3.5.38" }, "peerDependencies": { - "vue": "3.5.34" + "vue": "3.5.38" } }, "node_modules/@vue/shared": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz", - "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.38.tgz", + "integrity": "sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==", "dev": true, "license": "MIT" }, @@ -4431,10 +4431,20 @@ } }, "node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", + "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], "license": "MIT", "dependencies": { "uc.micro": "^2.0.0" @@ -4496,15 +4506,25 @@ "license": "MIT" }, "node_modules/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", - "linkify-it": "^5.0.0", + "linkify-it": "^5.0.1", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" @@ -5645,9 +5665,9 @@ } }, "node_modules/postcss": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", - "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", "dev": true, "funding": [ { @@ -5665,7 +5685,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -6120,18 +6140,18 @@ } }, "node_modules/shiki": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.1.0.tgz", - "integrity": "sha512-l/ABZPUR5v70jI10EzqfMS/I96vjSGv2y0ihUV+WYFzv0EfvW4s54m0Lg8wCrrL+2IkwBzFTuxkZjPf8b2NX9Q==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-4.2.0.tgz", + "integrity": "sha512-hjNax6o/ylDy9lefQEaSDtzaT3iVNtZ3WmpQnbuQNoG4xvnSKf2kSKbihZVO4JRG1TTMejs7CmNRYlWgAL66pQ==", "dev": true, "license": "MIT", "dependencies": { - "@shikijs/core": "4.1.0", - "@shikijs/engine-javascript": "4.1.0", - "@shikijs/engine-oniguruma": "4.1.0", - "@shikijs/langs": "4.1.0", - "@shikijs/themes": "4.1.0", - "@shikijs/types": "4.1.0", + "@shikijs/core": "4.2.0", + "@shikijs/engine-javascript": "4.2.0", + "@shikijs/engine-oniguruma": "4.2.0", + "@shikijs/langs": "4.2.0", + "@shikijs/themes": "4.2.0", + "@shikijs/types": "4.2.0", "@shikijs/vscode-textmate": "^10.0.2", "@types/hast": "^3.0.4" }, @@ -7424,17 +7444,17 @@ } }, "node_modules/vue": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.34.tgz", - "integrity": "sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==", + "version": "3.5.38", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.38.tgz", + "integrity": "sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.34", - "@vue/compiler-sfc": "3.5.34", - "@vue/runtime-dom": "3.5.34", - "@vue/server-renderer": "3.5.34", - "@vue/shared": "3.5.34" + "@vue/compiler-dom": "3.5.38", + "@vue/compiler-sfc": "3.5.38", + "@vue/runtime-dom": "3.5.38", + "@vue/server-renderer": "3.5.38", + "@vue/shared": "3.5.38" }, "peerDependencies": { "typescript": "*" From 8f5641f42f17ad41699e4d01e6b89a253ed7c0c2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 09:13:01 +0200 Subject: [PATCH 087/156] chore: Update CLI texts (#2611) 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 81b8811c39..12867e8786 100644 --- a/tools/assets/help/cds-version-md.out.md +++ b/tools/assets/help/cds-version-md.out.md @@ -4,7 +4,7 @@ | Package | Version | Location | | -------------------- | ------- | ------------------------------------------------------------------ | - | @sap/cds-dk (global) | 9.9.1 | .../node_modules/@sap/cds-dk | + | @sap/cds-dk (global) | 9.9.2 | .../node_modules/@sap/cds-dk | | @sap/cds | 9.9.1 | .../node_modules/@sap/cds | | @sap/cds-compiler | 6.9.2 | .../node_modules/@sap/cds-compiler | | @sap/cds-fiori | 2.3.0 | .../node_modules/@sap/cds-fiori | diff --git a/tools/assets/help/cds-version.out.md b/tools/assets/help/cds-version.out.md index 265a98e0be..4eb5f45dac 100644 --- a/tools/assets/help/cds-version.out.md +++ b/tools/assets/help/cds-version.out.md @@ -2,7 +2,7 @@
 > cds version
 
-  @sap/cds-dk (global)  9.9.1    .../node_modules/@sap/cds-dk 
+  @sap/cds-dk (global)  9.9.2    .../node_modules/@sap/cds-dk 
   @sap/cds              9.9.1    .../node_modules/@sap/cds                                            
   @sap/cds-compiler     6.9.2    .../node_modules/@sap/cds-compiler                                   
   @sap/cds-fiori        2.3.0    .../node_modules/@sap/cds-fiori                                      

From 2e2a13ecb9fdd9308552c9a5a4f118d81d9e39d7 Mon Sep 17 00:00:00 2001
From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com>
Date: Mon, 22 Jun 2026 09:13:23 +0200
Subject: [PATCH 088/156] Update ESLint to v8.61.1 (#2607)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This PR contains the following updates:

| Package | Change |
[Age](https://docs.renovatebot.com/merge-confidence/) |
[Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|
|
[@typescript-eslint/parser](https://typescript-eslint.io/packages/parser)
([source](https://redirect.github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser))
| [`8.60.0` →
`8.61.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/8.60.0/8.61.1)
|
![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/8.61.1?slim=true)
|
![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/8.60.0/8.61.1?slim=true)
|

---

### Release Notes

typescript-eslint/typescript-eslint (@​typescript-eslint/parser) ### [`v8.61.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8611-2026-06-15) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.61.0...v8.61.1) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.61.1) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.61.0`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8610-2026-06-08) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.60.1...v8.61.0) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.61.0) for more information. You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. ### [`v8.60.1`](https://redirect.github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#8601-2026-06-01) [Compare Source](https://redirect.github.com/typescript-eslint/typescript-eslint/compare/v8.60.0...v8.60.1) This was a version bump only for parser to align it with other projects, there were no code changes. See [GitHub Releases](https://redirect.github.com/typescript-eslint/typescript-eslint/releases/tag/v8.60.1) for more information. 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**: (UTC) - 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 6986a037a6..5d179b8983 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2415,16 +2415,16 @@ "license": "MIT" }, "node_modules/@typescript-eslint/parser": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.60.0.tgz", - "integrity": "sha512-fcqpj/MyK4sxDPcbe7STNPbpQL4RLZOPWuaTmwZYuc+hJKzRf58yRxfhqGpc6PIq9ZyfSBpfHgmUHmHs0KwHwg==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.1.tgz", + "integrity": "sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.60.0", - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/typescript-estree": "8.60.0", - "@typescript-eslint/visitor-keys": "8.60.0", + "@typescript-eslint/scope-manager": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/typescript-estree": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", "debug": "^4.4.3" }, "engines": { @@ -2440,14 +2440,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.60.0.tgz", - "integrity": "sha512-aZu74NNKJeUWqCjDddzdiKaS82dgYgV/vmf+Ui3ZdZejmgfXR/q+pRumgobnQ2cCJTgGTWp4ypiwsuofFubavg==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz", + "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.60.0", - "@typescript-eslint/types": "^8.60.0", + "@typescript-eslint/tsconfig-utils": "^8.61.1", + "@typescript-eslint/types": "^8.61.1", "debug": "^4.4.3" }, "engines": { @@ -2462,14 +2462,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.60.0.tgz", - "integrity": "sha512-pFzqhllJMs+jghLQWzV00ds39xLzuyqPSev5pd8f4Ir0rtKR3ZLUB4/4dhjOFighWb9larvtfJvqL+4yKDI3Xw==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz", + "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/visitor-keys": "8.60.0" + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2480,9 +2480,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.60.0.tgz", - "integrity": "sha512-BZPR3RGYlAXnly6ymAxfkVn5rCbZzQNou0rxv3GfWZ8cTQp+hhVd73khbGLAd8k1TlAPLISH337M+tAgAnaJDQ==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz", + "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==", "dev": true, "license": "MIT", "engines": { @@ -2497,9 +2497,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.60.0.tgz", - "integrity": "sha512-AsE7x2XaAK+CVbeih0Fvbn+r1qHxtpLDJ3XUuFcIinT318T90yHMJC+Zgv+jUuDjQQd06HKwxnDu6sz1IcTilA==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz", + "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==", "dev": true, "license": "MIT", "engines": { @@ -2511,16 +2511,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.60.0.tgz", - "integrity": "sha512-3AcZNBGMClm6CXDyo8kYvVGT/sx29sS0oBsIb9oZI2gunA4Vm2M3YHzRLPvsUBBsl+yB5FPtltq7gGH0iTlp9g==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz", + "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.60.0", - "@typescript-eslint/tsconfig-utils": "8.60.0", - "@typescript-eslint/types": "8.60.0", - "@typescript-eslint/visitor-keys": "8.60.0", + "@typescript-eslint/project-service": "8.61.1", + "@typescript-eslint/tsconfig-utils": "8.61.1", + "@typescript-eslint/types": "8.61.1", + "@typescript-eslint/visitor-keys": "8.61.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -2539,13 +2539,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.60.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.60.0.tgz", - "integrity": "sha512-9WI52t8ZGLVGrPMBet25yAftqY/n95+zmoUUtJBBQTKDSKUu7OsPTroT2op7U9JatkoRccL0YkWDNMFfC4Sjxg==", + "version": "8.61.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz", + "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.60.0", + "@typescript-eslint/types": "8.61.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { From 8ecf9ad4210952e945b501061cc5ab1311cab3ad Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Mon, 22 Jun 2026 09:14:06 +0200 Subject: [PATCH 089/156] Fix links (#2646) Those were added by #2495 but were not detected by the link checks that we removed. --- java/migration.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/java/migration.md b/java/migration.md index 1338843ade..0af8605a09 100644 --- a/java/migration.md +++ b/java/migration.md @@ -79,15 +79,15 @@ Some property defaults have been adjusted: | Property | Old Value | New Value | Explanation | | --- | --- | --- | --- | -| [cds.errors.preferServiceException](../developing-applications/properties#cds-errors-preferServiceException) | `false` | `true` | `ServiceException` is now preferred over generic exceptions when mapping errors to HTTP responses. | -| [cacheRefreshInterval](../developing-applications/properties#cds-multiTenancy-serviceManager-cacheRefreshInterval) | `PT20M` (20 min) | `PT60M` (60 min) | The service manager cache is now refreshed less frequently to reduce overhead. | -| [cds.outbox.services.<key>.ordered](../developing-applications/properties#cds-outbox-services-%3Ckey%3E-ordered) | `true` | `false` | Outbox instances now process entries in parallel by default. Set to `true` to restore ordered, single-threaded processing. | -| [enforceTransactional](../developing-applications/properties#cds-persistence-changeSet-enforceTransactional) | `true` | `false` | Transactional enforcement for change sets is now opt-in. | +| [cds.errors.preferServiceException](./developing-applications/properties#cds-errors-preferServiceException) | `false` | `true` | `ServiceException` is now preferred over generic exceptions when mapping errors to HTTP responses. | +| [cacheRefreshInterval](./developing-applications/properties#cds-multiTenancy-serviceManager-cacheRefreshInterval) | `PT20M` (20 min) | `PT60M` (60 min) | The service manager cache is now refreshed less frequently to reduce overhead. | +| [cds.outbox.services.<key>.ordered](./developing-applications/properties#cds-outbox-services-%3Ckey%3E-ordered) | `true` | `false` | Outbox instances now process entries in parallel by default. Set to `true` to restore ordered, single-threaded processing. | +| [enforceTransactional](./developing-applications/properties#cds-persistence-changeSet-enforceTransactional) | `true` | `false` | Transactional enforcement for change sets is now opt-in. | | `cds.query.deepEntityReadonly` | `false` | `true` | Readonly handling is now enforced for deep entity reads by default. | -| [cds.query.restrictions.enabled](../developing-applications/properties#cds-query-restrictions) | `false` | `true` | | -| [cds.security.authentication.mode](../developing-applications/properties#cds-security-authentication) | `model-strict` | `model-relaxed` | Authentication mode now defaults to `model-relaxed`, which only enforces authentication for endpoints protected via `@requires` or `@restrict`. | -| [cds.sql.hana.search.fuzzy](../developing-applications/properties#cds-sql-hana-search-fuzzy) | `false` | `true` | Fuzzy search is now enabled on HANA by default | -| [cds.sql.toOnePath.mode](../developing-applications/properties#cds-sql-toOnePath-mode) | `always-join` | `optimize` | SQL generation now avoids joins for to-one path expressions when a FK column can be selected directly, improving query performance. | +| [cds.query.restrictions.enabled](./developing-applications/properties#cds-query-restrictions) | `false` | `true` | | +| [cds.security.authentication.mode](./developing-applications/properties#cds-security-authentication) | `model-strict` | `model-relaxed` | Authentication mode now defaults to `model-relaxed`, which only enforces authentication for endpoints protected via `@requires` or `@restrict`. | +| [cds.sql.hana.search.fuzzy](./developing-applications/properties#cds-sql-hana-search-fuzzy) | `false` | `true` | Fuzzy search is now enabled on HANA by default | +| [cds.sql.toOnePath.mode](./developing-applications/properties#cds-sql-toOnePath-mode) | `always-join` | `optimize` | SQL generation now avoids joins for to-one path expressions when a FK column can be selected directly, improving query performance. | ### Deprecated Properties @@ -98,8 +98,8 @@ The following properties have been deprecated and might be removed in a future m | Deprecated Property | Explanation | | --- | --- | | `cds.dashboard.*` | The entire `cds.dashboard` configuration namespace is deprecated and may be removed in a future major version. | -| [cds.outbox.inMemory.emitDuringChangeSetContext](../developing-applications/properties#cds-outbox-inMemory-emitDuringChangeSetContext) | The functionality provided by this property is enabled by default and there is no reason to switch it off. | -| [cds.outbox.inMemory.enabled](../developing-applications/properties#cds-outbox-inMemory-enabled) | The functionality provided by this property is enabled by default and there is no reason to switch it off. | +| [cds.outbox.inMemory.emitDuringChangeSetContext](./developing-applications/properties#cds-outbox-inMemory-emitDuringChangeSetContext) | The functionality provided by this property is enabled by default and there is no reason to switch it off. | +| [cds.outbox.inMemory.enabled](./developing-applications/properties#cds-outbox-inMemory-enabled) | The functionality provided by this property is enabled by default and there is no reason to switch it off. | ### Removed Properties
From 2489b2ae87827bcc5057d536a46f93e346f15db4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 14:56:40 +0200 Subject: [PATCH 090/156] Update dependency @cap-js/cds-typer to v0.40.0 (#2652) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@cap-js/cds-typer](https://cap.cloud.sap/) ([source](https://redirect.github.com/cap-js/cds-typer)) | [`0.39.1` → `0.40.0`](https://renovatebot.com/diffs/npm/@cap-js%2fcds-typer/0.39.1/0.40.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@cap-js%2fcds-typer/0.40.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@cap-js%2fcds-typer/0.39.1/0.40.0?slim=true) | --- ### Release Notes
cap-js/cds-typer (@​cap-js/cds-typer) ### [`v0.40.0`](https://redirect.github.com/cap-js/cds-typer/blob/HEAD/CHANGELOG.md#0400---2026-06-22) [Compare Source](https://redirect.github.com/cap-js/cds-typer/compare/v0.39.1...v0.40.0) ##### Added ##### Changed - `output_d_ts_files` now defaults to `true` and emits proper ambient `.d.ts` declaration files instead of merely renaming `.ts` output files. Plain `.ts` files are treated as source by TypeScript and other build tools, which caused them to be compiled and their `.js` output to silently overwrite the runtime module exports generated by cds-typer. Projects with strict `tsconfig.json` settings will benefit from this change, as `.d.ts` files do not require special handling in `cds build` or development scripts. Set to `false` to restore the old behaviour. ##### Deprecated ##### Removed ##### Fixed - Entities with name conflicts with any of their ancestors now have their aspect name generated properly again - Fixed sporadic `[Object object]` appearing in log output ##### Security
--- ### Configuration 📅 **Schedule**: (UTC) - 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 | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5d179b8983..f27a71776d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -340,14 +340,17 @@ } }, "node_modules/@cap-js/cds-typer": { - "version": "0.39.1", - "resolved": "https://registry.npmjs.org/@cap-js/cds-typer/-/cds-typer-0.39.1.tgz", - "integrity": "sha512-efMnQDA4NRu2xwX9Yncvcd92GtgIEVZOgemORxaLCbhigTqwFVpHG6i7FOxL+hqk21AEItMrdiWXVs3+kQxS9g==", + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@cap-js/cds-typer/-/cds-typer-0.40.0.tgz", + "integrity": "sha512-8UWwa4q6DL1vRCq7KwwLXtLAHHkMI6HoPXsIXLVvRMaW11xvtSkMFHcaNjR8WBlccZTA7RWIqHavgKbq57zpKg==", "dev": true, "license": "Apache-2.0", "bin": { "cds-typer": "lib/cli.js" }, + "engines": { + "node": ">=22" + }, "peerDependencies": { "@cap-js/cds-types": ">=0.9", "@sap/cds": ">=8" From e0c67a8d21a0c01580bb0fe98d87955d6062e7de Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 16:05:52 +0200 Subject: [PATCH 091/156] Update CAP Java SDK (#2651) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [com.sap.cds:cds-services-api](https://cap.cloud.sap/docs/java) | `4.9.0` → `4.9.1` | ![age](https://developer.mend.io/api/mc/badges/age/maven/com.sap.cds:cds-services-api/4.9.1?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/maven/com.sap.cds:cds-services-api/4.9.0/4.9.1?slim=true) | --- ### Configuration 📅 **Schedule**: (UTC) - 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> --- .vitepress/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vitepress/config.js b/.vitepress/config.js index 5647c17206..71c4b79772 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -132,7 +132,7 @@ const siteURL = new URL(process.env.SITE_HOSTNAME || 'http://localhost:4173/docs if (!siteURL.pathname.endsWith('/')) siteURL.pathname += '/' config.themeConfig.capire = { versions: { - java_services: '4.9.0', + java_services: '4.9.1', java_cds4j: '4.9.1', cloud_sec_ams: '3.8.1' }, From e74d6e050e0d841da12534ad756a4b502f91d1af Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 22 Jun 2026 16:06:15 +0200 Subject: [PATCH 092/156] Update dependency @cap-js/cds-types to v0.18.0 (#2653) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR contains the following updates: | Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) | |---|---|---|---| | [@cap-js/cds-types](https://cap.cloud.sap/) ([source](https://redirect.github.com/cap-js/cds-types)) | [`0.17.0` → `0.18.0`](https://renovatebot.com/diffs/npm/@cap-js%2fcds-types/0.17.0/0.18.0) | ![age](https://developer.mend.io/api/mc/badges/age/npm/@cap-js%2fcds-types/0.18.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@cap-js%2fcds-types/0.17.0/0.18.0?slim=true) | --- ### Release Notes
cap-js/cds-types (@​cap-js/cds-types) ### [`v0.18.0`](https://redirect.github.com/cap-js/cds-types/blob/HEAD/CHANGELOG.md#0180---2026-06-22) [Compare Source](https://redirect.github.com/cap-js/cds-types/compare/v0.17.0...v0.18.0) ##### Added ##### Changed - Installing `@cap-js/cds-types` no longer executes a postinstall script that creates a symlink in `node_modules/@​types`. Instead, use a `paths` entry in your tsconfig.json. This entry can be created by running `cds add typescript` in your project. ##### Deprecated ##### Removed ##### Fixed ##### Security
--- ### Configuration 📅 **Schedule**: (UTC) - 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 | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index f27a71776d..a7e2fc3ad8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -357,15 +357,14 @@ } }, "node_modules/@cap-js/cds-types": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@cap-js/cds-types/-/cds-types-0.17.0.tgz", - "integrity": "sha512-PmCEcIaKXbN5o9PsmuWPNja0t2q33/Em4Vj3eH7aPHzUfmoLCJuhKn7/0I3TFZcoSe4akOO0AEmZ4Och6dIZzw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@cap-js/cds-types/-/cds-types-0.18.0.tgz", + "integrity": "sha512-2F4jI4USwDG8p78o2TXBWOLHUOyiQmdZe/7GKEqNHCOc1hjU5UgLY6AT1M3X5kG1fJRjUNui9jdnjlIchuZZtA==", "dev": true, - "hasInstallScript": true, "license": "Apache-2.0", "peerDependencies": { "@sap/cds": ">=9.0.0", - "@sap/cds-dk": "^9", + "@sap/cds-dk": ">=9", "@types/express": ">=4" }, "peerDependenciesMeta": { From b4d94f2c4a9a4383d6892e11ea0f9696e4baeead Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Mon, 22 Jun 2026 16:33:11 +0200 Subject: [PATCH 093/156] Exclude old MTX apis+migration from sitemap (#2649) This is confusing in SAP4Me search. Co-authored-by: Steffen Waldmann --- guides/multitenancy/old-mtx-apis.md | 1 + guides/multitenancy/old-mtx-migration.md | 6 +----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/guides/multitenancy/old-mtx-apis.md b/guides/multitenancy/old-mtx-apis.md index c0edef1512..97bbee657c 100644 --- a/guides/multitenancy/old-mtx-apis.md +++ b/guides/multitenancy/old-mtx-apis.md @@ -2,6 +2,7 @@ synopsis: > API reference documentation for MTX Services. search: false +sitemap: false --- diff --git a/guides/multitenancy/old-mtx-migration.md b/guides/multitenancy/old-mtx-migration.md index 62ea2730e1..464982f6de 100644 --- a/guides/multitenancy/old-mtx-migration.md +++ b/guides/multitenancy/old-mtx-migration.md @@ -2,11 +2,7 @@ shorty: MTX Migration synopsis: > Explains how to migrate from @sap/cds-mtx (aka Old MTX) to 'streamlined' @sap/cds-mtxs. -breadcrumbs: - - Cookbook - - Multitenancy - - Migration -# layout: cookbook +sitemap: false impl-variants: true --- From c9747f4535cfa59b688a243bc09fc4a9ba39aa13 Mon Sep 17 00:00:00 2001 From: Eric P Date: Tue, 23 Jun 2026 13:27:56 +0200 Subject: [PATCH 094/156] Update build.md (#2626) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bold phrase about not overwriting models to emphasize to users its importance. A number of users miss this and open unnecessary tickets. Co-authored-by: René Jeglinsky --- guides/deploy/build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/deploy/build.md b/guides/deploy/build.md index f8055bbd3e..c72dbdb9d7 100644 --- a/guides/deploy/build.md +++ b/guides/deploy/build.md @@ -52,7 +52,7 @@ cds.build?.register?.('my-plugin', If custom build tasks are configured, those properties have precedence. -For example, you want to configure the _src_ folder and add the default models. To achieve this, do not define the _model_ option in your build task: +For example, you want to configure the _src_ folder and add the default models. To achieve this, **do not define the _model_ option in your build task**: ::: code-group ```jsonc [package.json] From acbf7efb9d97fec0454c74e4cfcc67299dd3a805 Mon Sep 17 00:00:00 2001 From: sjvans <30337871+sjvans@users.noreply.github.com> Date: Tue, 23 Jun 2026 22:31:55 +0200 Subject: [PATCH 095/156] Node.js: Consistent Return Values (#2642) --- node.js/app-services.md | 28 ++++++++++++++++++++++++++++ node.js/core-services.md | 6 +++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/node.js/app-services.md b/node.js/app-services.md index 9a4394c17c..eb831f0981 100644 --- a/node.js/app-services.md +++ b/node.js/app-services.md @@ -155,3 +155,31 @@ cds.ApplicationService.handle_log_events = cds.service.impl (function(){ this.on('*', req => console.log(req.event)) }) ``` + + +## Results of Generic CRUD Handlers + +Custom `.on` handlers can return any value. When no custom handler provides a result — that is, when CAP's built-in generic handler runs the CRUD operation — the result follows a consistent shape: + +| Operation | Return value | +|-----------|-------------| +| **READ** | `object[]` — the matching records, or a single `object \| null` for singleton requests | +| **INSERT** / **CREATE** | An array of primary-key objects of the inserted rows, with `.affected` set to the number of rows written | +| **UPDATE** / **UPSERT** / **DELETE** | An empty array with `.affected` set to the number of rows changed or deleted | + +The `.affected` count is a property directly on the returned array: + +```js +const inserted = await srv.create(Books).entries({title:'Catweazle'}) +inserted[0] // { ID: '...' } — primary key of the inserted row +inserted.affected // 1 + +const updated = await srv.update(Books).set({discount:'10%'}).where({stock:{'>':111}}) +updated.affected // number of rows updated +``` + +When a write targets a **specific subject** (for example, `srv.update(Books, 201)` or `srv.delete(Books, '1')`) and no row is matched, the handler throws a `404` error. A query using only a `where` clause with zero matches returns `{ affected: 0 }` without throwing. + +::: tip Consistent results across local and remote services +This return shape was introduced in **cds 10** to make results from local services, HCQL-proxied remote services, and database services consistent. To restore the previous behavior, set `{ "features": { "legacy_srv_results": true } }` in your project configuration. +::: diff --git a/node.js/core-services.md b/node.js/core-services.md index fca18fd920..8ea29f4681 100644 --- a/node.js/core-services.md +++ b/node.js/core-services.md @@ -616,7 +616,7 @@ function srv.after (event, entity?, handler: ( Use this method to register handlers to run *after* the `.on` handlers, frequently used to enrich outbound data. The handlers receive two arguments: -- `results` — the outcomes of the `.on` handler which ran before +- `results` — the outcomes of the `.on` handler which ran before; see [Results of Generic CRUD Handlers](app-services#results-of-generic-crud-handlers) for the shape returned by the built-in handler - `req` — an instance of [`cds.Request`](./events.md#cds-request) ::: warning @@ -1035,7 +1035,7 @@ async function srv.handle ( return : result of executed .on handlers ``` -This is the internal method called by [`this.dispatch()`](#srv-dispatch-event) to actually process requests or events by executing registered event handlers. Argument `event` is expected to be an instance of [`cds.Event`](./events.md#cds-event) or [`cds.Request`](./events.md#cds-request). +This is the internal method called by [`this.dispatch()`](#srv-dispatch-event) to actually process requests or events by executing registered event handlers. See [Results of Generic CRUD Handlers](app-services#results-of-generic-crud-handlers) for the return value shape of the built-in handler. Argument `event` is expected to be an instance of [`cds.Event`](./events.md#cds-event) or [`cds.Request`](./events.md#cds-request). The implementation basically works like that: @@ -1156,7 +1156,7 @@ srv.update('Books',...)... --> UPDATE.entity ('Books',...)... srv.delete('Books',...)... --> DELETE.from ('Books',...)... ``` -You can further construct the queries using the `cds.ql` fluent APIs, and then `await` them for execution thru `this.run()`. Here are some examples: +You can further construct the queries using the `cds.ql` fluent APIs, and then `await` them for execution thru `this.run()`. See [Results of Generic CRUD Handlers](app-services#results-of-generic-crud-handlers) for the return value shape. Here are some examples: ```js await srv.read(Books,201) From 4f0ee04952bf81577a73bc0667a8772e3cfd7f42 Mon Sep 17 00:00:00 2001 From: ecklie <52252271+ecklie@users.noreply.github.com> Date: Wed, 24 Jun 2026 09:51:12 +0200 Subject: [PATCH 096/156] Hook for TMS CMK usage (#2660) --- guides/multitenancy/index.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/guides/multitenancy/index.md b/guides/multitenancy/index.md index 6994ab476c..b8819528e5 100644 --- a/guides/multitenancy/index.md +++ b/guides/multitenancy/index.md @@ -951,6 +951,8 @@ public void beforeSubscription(SubscribeEventContext context) { This will affect every new [tenant subscription](/@external/java/multitenancy.md#subscribe-tenant) and will set the specified SAP HANA tenant ID. +
+ ##### Delete SAP HANA tenants From 7cafb2d57100bc7a559d2b9e961fdb5604b54188 Mon Sep 17 00:00:00 2001 From: ecklie <52252271+ecklie@users.noreply.github.com> Date: Wed, 24 Jun 2026 10:03:51 +0200 Subject: [PATCH 097/156] add more hints how to set the database_id (#2656) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit More hints how to handle the database_id with tms, requested by Harald --------- Co-authored-by: René Jeglinsky --- guides/multitenancy/index.md | 2 ++ guides/multitenancy/mtxs.md | 25 +++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/guides/multitenancy/index.md b/guides/multitenancy/index.md index b8819528e5..302bbc06fa 100644 --- a/guides/multitenancy/index.md +++ b/guides/multitenancy/index.md @@ -838,6 +838,8 @@ If you start with a multitenant application that's configured to use to SAP HANA For SAP HANA TMS v2, you also need to specify the database ID of the database that you plan to use for your tenant containers. You can specify this using the [`cds.xt.DeploymentService` configuration](/@external/guides/multitenancy/mtxs#deployment-config). +With `cds.xt.DeploymentService` you only configure the default database ID. If you want to specify different database IDs for a tenant HDI container, you need to [add the database ID to the payload of the individual subscription using a handler](/@external/guides/multitenancy/mtxs#example-handler-for-saasprovisioningservice). + To keep the application configuration agnostic, we recommend adding the cds/requires/cds.xt.DeploymentService/hdi/create/database_id configuration as an environment variable to the MTX service in _mta.yaml_: ```yaml{6-17} - name: bookshop-mtx diff --git a/guides/multitenancy/mtxs.md b/guides/multitenancy/mtxs.md index ce5efd6c78..808e9eee89 100644 --- a/guides/multitenancy/mtxs.md +++ b/guides/multitenancy/mtxs.md @@ -607,6 +607,31 @@ cds.on('served', ()=>{ For CLI usage via `cds subscribe|upgrade|unsubscribe` you can create a `mtx/sidecar/cli.js` file, which works analogously to a `server.js`. ::: +#### Example handler for SaasProvisioningService + +A common usecase is the specification of an individual database ID per subscription. +```js +cds.on('served', async () => { + const { + 'cds.xt.SaasProvisioningService': provisioning, + } = cds.services + + await provisioning.prepend(() => { + provisioning.on('UPDATE', 'tenant', async (req, next) => { + req.data = cds.utils.merge(req?.data, { + _: { + hdi: { + create: { + database_id: '', + } + } + } + }) + return next() + }) + }) +}) +``` ## Consumption ### Via Programmatic APIs From 0780fffd5b5c5133b18232713a0dcc760aa00f79 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 24 Jun 2026 11:07:14 +0200 Subject: [PATCH 098/156] chore: Update CLI texts (#2663) 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 12867e8786..ffcbd5f1dc 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-dk (global) | 9.9.2 | .../node_modules/@sap/cds-dk | | @sap/cds | 9.9.1 | .../node_modules/@sap/cds | - | @sap/cds-compiler | 6.9.2 | .../node_modules/@sap/cds-compiler | + | @sap/cds-compiler | 6.9.3 | .../node_modules/@sap/cds-compiler | | @sap/cds-fiori | 2.3.0 | .../node_modules/@sap/cds-fiori | | @cap-js/db-service | 2.11.0 | .../node_modules/@cap-js/db-service | | @cap-js/sqlite | 2.4.0 | .../node_modules/@cap-js/sqlite | diff --git a/tools/assets/help/cds-version.out.md b/tools/assets/help/cds-version.out.md index 4eb5f45dac..2499fd89e8 100644 --- a/tools/assets/help/cds-version.out.md +++ b/tools/assets/help/cds-version.out.md @@ -4,7 +4,7 @@ @sap/cds-dk (global) 9.9.2 .../node_modules/@sap/cds-dk @sap/cds 9.9.1 .../node_modules/@sap/cds - @sap/cds-compiler 6.9.2 .../node_modules/@sap/cds-compiler + @sap/cds-compiler 6.9.3 .../node_modules/@sap/cds-compiler @sap/cds-fiori 2.3.0 .../node_modules/@sap/cds-fiori @cap-js/db-service 2.11.0 .../node_modules/@cap-js/db-service @cap-js/sqlite 2.4.0 .../node_modules/@cap-js/sqlite From e4074f9bb9a65f8f74925a8c64e830f1d03237dd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 24 Jun 2026 11:42:39 +0200 Subject: [PATCH 099/156] chore: Update Java Properties (#2662) Updates Java properties to the latest version. Co-authored-by: chgeo <7470719+chgeo@users.noreply.github.com> --- java/developing-applications/properties.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/java/developing-applications/properties.json b/java/developing-applications/properties.json index e73fd301e0..b098cabe5b 100644 --- a/java/developing-applications/properties.json +++ b/java/developing-applications/properties.json @@ -1459,6 +1459,13 @@ "type": "String", "doc": "The token exchange strategy used, when loading destinations from SAP BTP Destination
Service. See
https://sap.github.io/cloud-sdk/docs/java/features/connectivity/sdk-connectivity-destination-service#token-exchange-options
for possible values." }, + { + "header": false, + "name": "cds.remote.services..destination.onBehalfOf", + "type": "String", + "default": "currentUser", + "doc": "Determines the user and tenant context that is used for IAS app-2-app destinations.
Possible values are: {@code currentUser}, {@code systemUser} and {@code
systemUserProvider}" + }, { "header": true, "name": "cds.remote.services..binding", From 485d25a058415e711e7e30568afb673d543b514b Mon Sep 17 00:00:00 2001 From: Vladimir Date: Wed, 24 Jun 2026 15:30:08 +0200 Subject: [PATCH 100/156] Document annotation processors change in Java 23+ (#2575) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Documents the change affecting Java applications that use Lombok and switch to Java 25. --------- Co-authored-by: René Jeglinsky Co-authored-by: Adrian Görler --- java/migration.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java/migration.md b/java/migration.md index 0af8605a09..e7008b9827 100644 --- a/java/migration.md +++ b/java/migration.md @@ -171,6 +171,11 @@ The `cds-services-archetype` is used by the `@sap/cds-dk` to generate initial CA The default JDK version of new CAP Java projects has been changed to JDK **25**. The minimum required JDK version is now **21**. +If your project uses Lombok, you need to explicitly add its annotation processor to your POM when you switch to Java 25. This is a change in Java compiler and affects all other annotation processors. + +[Learn more about Maven setup with Lombok.](https://projectlombok.org/setup/maven){.learn-more} +[Learn more about about the change in the Java compiler.](https://bugs.java.com/bugdatabase/JDK-8321314/description){.learn-more} + ### Removed repackaged Olingo Dependencies { #removed-olingo-4-to-5 } The internally used maven modules `repackaged/odata-v4-lib` and `repackaged/odata-v2-lib` are removed from the delivery. If the project directly references these modules and doesn't compile after migrating to CAP Java 5.x, there are 3 options to keep the compatibility of the code base: From 50352b7d445cc03e12568d13491b797db1c4eef5 Mon Sep 17 00:00:00 2001 From: Lisa Julia Nebel Date: Thu, 25 Jun 2026 08:47:41 +0200 Subject: [PATCH 101/156] Add AI plugin to external plugin section (#2650) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: René Jeglinsky Co-authored-by: Maximilian Eckert --- plugins/_menu.md | 1 + plugins/assets/index/recommendations.png | Bin 0 -> 326299 bytes plugins/index.md | 19 ++++++++++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 plugins/assets/index/recommendations.png diff --git a/plugins/_menu.md b/plugins/_menu.md index 9f10e3755a..bba0f5a24b 100644 --- a/plugins/_menu.md +++ b/plugins/_menu.md @@ -16,3 +16,4 @@ # [Advanced Event Mesh](index#advanced-event-mesh) # [Process Automation](index#sap-build-process-automation) # [Data Inspector](index#data-inspector) +# [AI](index#ai) diff --git a/plugins/assets/index/recommendations.png b/plugins/assets/index/recommendations.png new file mode 100644 index 0000000000000000000000000000000000000000..bbfe7f1c98ebc4d6e9c3e8f894e8c2ae8d6030d4 GIT binary patch literal 326299 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

j2iOU(>%{2|Gqv$jH0Ij)1Ko6a^?Vf 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 sUyOj@K6PVG+#w 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≀C3rc@Kg-H{4ftfeQA}f(0bU0* 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 LRw#OA`0@V%yz0>R literal 0 HcmV?d00001 diff --git a/plugins/index.md b/plugins/index.md index c5985418ea..251b3d8572 100644 --- a/plugins/index.md +++ b/plugins/index.md @@ -452,4 +452,21 @@ Features: Available for: -[![Node.js logo](/logos/nodejs.svg){style="height:2.5em; display:inline; margin:0 0.2em;"}](https://github.com/cap-js/data-inspector#readme) \ No newline at end of file +[![Node.js logo](/logos/nodejs.svg){style="height:2.5em; display:inline; margin:0 0.2em;"}](https://github.com/cap-js/data-inspector#readme) + +## AI + +The AI plugin provides out-of-the-box UI field recommendations powered by SAP RPT-1. It automatically detects fields with `@Common.ValueList` or `@cds.odata.valuelist` annotations and provides intelligent recommendations in SAP Fiori draft-enabled UIs without requiring custom handlers. + +AI-powered recommendations are then added to your Fiori UIs as shown below. + +![Screenshot showing the Recommendations](assets/index/recommendations.png) + +Additionally, the AI Plugin embeds SAP AI Core as a standard CAP service following the Calesi pattern, giving you automatic service binding resolution along with tenant-aware access including managed resource groups and deployments. + +The Java version of this plugin is currently in alpha. + +Available for: + +[![Node.js](/logos/nodejs.svg){style="height:2.5em; display:inline; margin:0 0.2em;"}](https://github.com/cap-js/ai) +[![Java](/logos/java.svg){style="height:3em; display:inline; margin:0 0.2em;"}](https://github.com/cap-java/cds-ai) From 50160883cbb8c108bb21aa1836e5595925a17730 Mon Sep 17 00:00:00 2001 From: Christian Georgi Date: Thu, 25 Jun 2026 11:22:21 +0200 Subject: [PATCH 102/156] vitepress2 + vite8 (#2657) Co-authored-by: Johannes Vogt Co-authored-by: Rene Jeglinsky --- .vitepress/config.js | 15 +- .vitepress/lib/md-typed-models.ts | 11 +- .vitepress/theme/code.scss | 1 + .../components/cds-playground/LiveCode.vue | 6 +- .vitepress/theme/styles.scss | 7 +- get-started/get-help.md | 6 +- guides/integration/reuse-and-compose.md | 2 +- index.md | 12 +- java/auditlog.md | 2 +- java/cqn-services/application-services.md | 12 +- java/cqn-services/persistence-services.md | 2 +- java/developing-applications/building.md | 8 +- .../properties.data.ts | 3 +- java/developing-applications/testing.md | 4 +- java/event-handlers/indicating-errors.md | 2 +- java/getting-started.md | 2 +- java/migration.md | 14 +- java/multitenancy-classic.md | 14 +- java/multitenancy.md | 2 +- java/outbox.md | 2 +- node.js/cds-connect.md | 6 +- node.js/cds-server.md | 1 + package-lock.json | 2557 ++++++++--------- package.json | 4 +- tools/cds-typer.md | 26 +- 25 files changed, 1287 insertions(+), 1434 deletions(-) diff --git a/.vitepress/config.js b/.vitepress/config.js index 71c4b79772..9edd75fca2 100644 --- a/.vitepress/config.js +++ b/.vitepress/config.js @@ -201,12 +201,6 @@ config.themeConfig.search = { } } -// Add twoslash transformer to the markdown config (if requested as it slows down builds) -import { transformerTwoslash } from '@shikijs/vitepress-twoslash' -if (process.env.VITE_CAPIRE_EXTRA_ASSETS) { - config.markdown.codeTransformers = [ transformerTwoslash() ] -} - // Add custom markdown renderers... import { dl } from '@mdit/plugin-dl' import * as MdAttrsPropagate from './lib/md-attrs-propagate' @@ -222,6 +216,15 @@ config.markdown.config = md => { md.use(dl) } +// Add twoslash transformer to the markdown config (if requested as it slows down builds) +import { transformerTwoslash } from '@shikijs/vitepress-twoslash' +if (process.env.VITE_CAPIRE_EXTRA_ASSETS) { + config.markdown.codeTransformers = [transformerTwoslash({ + twoslashOptions: { compilerOptions: { paths: { "@sap/cds": [MdTypedModels.cdsTypesPath()] } } } + })], + config.markdown.languages.push('js', 'jsx', 'ts', 'tsx') +} + // Add custom buildEnd hook import { promises as fs } from 'node:fs' import * as cdsMavenSite from './lib/cds-maven-site' diff --git a/.vitepress/lib/md-typed-models.ts b/.vitepress/lib/md-typed-models.ts index 5df9fcbbe9..83ccd19d02 100644 --- a/.vitepress/lib/md-typed-models.ts +++ b/.vitepress/lib/md-typed-models.ts @@ -1,5 +1,6 @@ import { MarkdownRenderer } from 'vitepress' import { execSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' import { dirname, join, relative, resolve } from 'node:path' import { existsSync } from 'node:fs' @@ -22,6 +23,7 @@ export function install(md: MarkdownRenderer) { const typedModels = env.frontmatter.typedModels as Record|undefined if (typedModels) { const mdDir = dirname(env.realPath ?? env.path) // realPath is only set if Vitepress path rewrites are in place + const cdsPath = cdsTypesPath() for (const modelKey in typedModels) { const modelPath = typedModels[modelKey] @@ -32,7 +34,9 @@ export function install(md: MarkdownRenderer) { const resPath = resolvedImportPath(srcDir, modelOut) // console.log(`📚 ${modelPath} -> ${resPath}`) - tokens[idx].content = tokens[idx].content.replaceAll(`%typedModels:${modelKey}:resolved%`, resPath) + tokens[idx].content = tokens[idx].content + .replaceAll(`%typedModels:${modelKey}:resolved%`, resPath) + .replaceAll(`%sap_cds:resolved%`, cdsPath) } } @@ -40,6 +44,11 @@ export function install(md: MarkdownRenderer) { } } +export function cdsTypesPath() { + const path = fileURLToPath(import.meta.resolve!('@cap-js/cds-types/package.json')) + return resolve(path, '..').replace(/\\/g, '/') +} + function resolvedImportPath(srcDir: string, modelOut: string) { // make resolved path relative - tsc seems to have problems with absolute Windows paths (C:\...) let resolvedPath = relative(process.cwd(), srcDir) diff --git a/.vitepress/theme/code.scss b/.vitepress/theme/code.scss index 6ca9d796c3..53408d455e 100644 --- a/.vitepress/theme/code.scss +++ b/.vitepress/theme/code.scss @@ -16,6 +16,7 @@ main .vp-doc { padding: 12px 0 !important; code { padding: 0 22px !important; + white-space: pre !important; } } div[class*='language-'] > button.copy { diff --git a/.vitepress/theme/components/cds-playground/LiveCode.vue b/.vitepress/theme/components/cds-playground/LiveCode.vue index c8a9ec370f..d10b51179f 100644 --- a/.vitepress/theme/components/cds-playground/LiveCode.vue +++ b/.vitepress/theme/components/cds-playground/LiveCode.vue @@ -2,7 +2,7 @@