diff --git a/.github/eslint-plugin/index.js b/.github/eslint-plugin/index.js
old mode 100644
new mode 100755
index 462a0578ab..3ac03ef9b6
--- a/.github/eslint-plugin/index.js
+++ b/.github/eslint-plugin/index.js
@@ -10,19 +10,15 @@
import * as fs from 'node:fs'
import * as path from 'node:path'
-const RULES_BASE_PATH = path.join('tools', 'cds-lint', 'rules');
-const EXAMPLES_BASE_PATH = path.join('tools', 'cds-lint', 'examples');
+const RULES_BASE_PATH = path.join(import.meta.dirname, '../../tools/cds-lint/rules');
+const EXAMPLES_BASE_PATH = RULES_BASE_PATH
const MENU_FILE_NAME = '_menu.md';
/**
* Get a list of all rule description files.
* @returns {string[]} An array of rule description file names.
*/
-const getRuleDescriptionFiles = () =>
- fs.readdirSync(RULES_BASE_PATH)
- .filter(file => file.endsWith('.md'))
- .filter(file => !['index.md', MENU_FILE_NAME].includes(file))
- .sort()
+const getRuleDescriptionFiles = () => fs.globSync(path.join(RULES_BASE_PATH, '*/index.md')).sort()
/**
* Generates the menu markdown file
@@ -33,12 +29,13 @@ const getRuleDescriptionFiles = () =>
function generateMenuMarkdown () {
const rules = getRuleDescriptionFiles();
const menu = rules.map(rule => {
- const clean = rule.replace('.md', '');
- return `# [${clean}](${clean})`
+ const folderPath = path.posix.dirname(path.relative(RULES_BASE_PATH, rule));
+ const name = path.basename(folderPath);
+ return `# [${name}](${folderPath}/)`
}).join('\n');
- const menuFilePath = path.join(RULES_BASE_PATH, '_menu.md')
+ const menuFilePath = path.join(RULES_BASE_PATH, MENU_FILE_NAME)
fs.writeFileSync(menuFilePath, menu);
- console.info(`generated menu to ${menuFilePath}`)
+ console.info(`generated menu to ${path.relative(process.cwd(), menuFilePath)}`);
}
/**
@@ -52,11 +49,12 @@ function generateJsRuleStub (ruleName) {
console.error('Please provide a rule name, e.g. "no-shared-handler-variables" as second argument');
process.exit(1);
}
- const stubFilePath = path.join(RULES_BASE_PATH, ruleName + '.md');
+ const stubFilePath = path.join(RULES_BASE_PATH, ruleName, 'index.md');
if (fs.existsSync(stubFilePath)) {
console.error(`file ${stubFilePath} already exists, will not overwrite`);
process.exit(2);
}
+ fs.mkdirSync(path.dirname(stubFilePath), { recursive: true });
const stub = fs.readFileSync(path.join(import.meta.dirname, 'js-rule-stub.md'), 'utf-8').replaceAll('$RULE_NAME', ruleName);
fs.writeFileSync(stubFilePath, stub);
console.info(`generated stub to ${stubFilePath}`);
diff --git a/.github/eslint-plugin/js-rule-stub.md b/.github/eslint-plugin/js-rule-stub.md
index 6cdbe627bc..8fce4bb4e1 100644
--- a/.github/eslint-plugin/js-rule-stub.md
+++ b/.github/eslint-plugin/js-rule-stub.md
@@ -3,7 +3,7 @@ status: released
---
# $RULE_NAME
@@ -22,7 +22,7 @@ This rule was introduced in `@sap/eslint-plugin-cds x.y.z`.
DESCRIPTION OF CORRECT EXAMPLE
::: code-group
-<<< ../examples/$RULE_NAME/correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
+<<< correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
:::
') doe
:::
+### Why do I get a _404 Cannot GET /_ error?
+For security reasons, the **index page is not served in production** by default in both [Node.js](../node.js/cds-server#toggle-generic-index-page) and [Java](../java/developing-applications/configuring#production-profile).
+
+If you try to access your backend URL, you will therefore see a _404 Cannot GET /_ error.
+This also means you **cannot use the `/` path as a health status indicator**. See the [Health Checks guide](../guides/deployment/health-checks) for the correct paths.
+
+Only if absolutely required and you understand the security implications to your application, you can enable this page in your deployment.
+
+Learn more about the generic index page in [Java](../java/developing-applications/properties#cds-indexPage) and in [Node.js](../node.js/cds-server#toggle-generic-index-page).{.learn-more}
## CAP on Kyma
diff --git a/guides/databases-hana.md b/guides/databases-hana.md
index 2c7733c920..9fc25a5443 100644
--- a/guides/databases-hana.md
+++ b/guides/databases-hana.md
@@ -9,10 +9,14 @@ status: released
[SAP HANA Cloud](https://www.sap.com/products/technology-platform/hana.html) is supported as the CAP standard database and recommended for productive use with full support for schema evolution and multitenancy.
-::: warning
+::: warning Validation strategy
CAP isn't validated with other variants of SAP HANA, like "SAP HANA Database as a Service" or "SAP HANA (on premise)".
+The database services are validated against the latest maintained QRC version of SAP HANA Cloud. It's not guaranteed that outdated versions are fully functional with the latest database services.
+
+[See the official SAP HANA Cloud documentation for their maintenance strategy.](https://help.sap.com/docs/HANA_CLOUD_CN/1f64fe39189f4176bf659e737d62222a/6ced4d164e234b74aa9bea82435ce9a8.html){.learn-more}
+
:::
## Setup & Configuration
@@ -53,9 +57,6 @@ The datasource for SAP HANA is then auto-configured based on available service b
:::
-
-
-
## Running `cds build`
Deployment to SAP HANA is done via the [SAP HANA Deployment Infrastructure (HDI)](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-developer-guide-for-cloud-foundry-multitarget-applications-sap-business-app-studio/sap-hdi-deployer?) which in turn requires running `cds build` to generate all the deployable HDI artifacts. For example, run this in [capire/bookshop](https://github.com/capire/bookshop):
@@ -201,7 +202,7 @@ cds deploy --to hana
Behind the scenes, `cds deploy` does the following:
* Compiles the CDS model to SAP HANA files (usually in _gen/db_, or _db/src/gen_)
-* Generates _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata?)_ files for the [CSV files](databases#providing-initial-data) in the project. If a _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata?)_ file is already present next to the CSV files, no new file is generated.
+* Generates _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata)_ files for the [CSV files](databases#providing-initial-data) in the project. If a _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata)_ file is already present next to the CSV files, no new file is generated.
* Creates a Cloud Foundry service of type `hdi-shared`, which creates an HDI container. Also, you can explicitly specify the name like so: `cds deploy --to hana:`.
* Starts `@sap/hdi-deploy` locally. If you need a tunnel to access the database, you can specify its address with `--tunnel-address `.
* Stores the binding information with profile `hybrid` in the _.cdsrc-private.json_ file of your project. You can use a different profile with parameter `--for`. With this information, `cds watch`/`run` can fetch the SAP HANA credentials at runtime, so that the server can connect to it.
@@ -651,7 +652,7 @@ Only use CSV files for _configuration data_ that can't be changed by application
:::
-Yet, if you need to support initial data with user changes, you can use the `include_filter` option that _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata?version=2024_1_QRC)_ offers.
+Yet, if you need to support initial data with user changes, you can use the `include_filter` option that _[.hdbtabledata](https://help.sap.com/docs/hana-cloud-database/sap-hana-cloud-sap-hana-database-deployment-infrastructure-hdi-reference/table-data-hdbtabledata)_ offers.
diff --git a/guides/deployment/to-cf.md b/guides/deployment/to-cf.md
index bff80285d4..9c4f408fbc 100644
--- a/guides/deployment/to-cf.md
+++ b/guides/deployment/to-cf.md
@@ -194,22 +194,20 @@ Two deployment options are available:
#### Option A: SAP Cloud Portal
-If you intend to deploy user interface applications, you also need to set up the [HTML5 Application Repository](https://discovery-center.cloud.sap/serviceCatalog/html5-application-repository-service) in combination with the [SAP Cloud Portal service](https://discovery-center.cloud.sap/serviceCatalog/cloud-portal-service):
+If you intend to deploy **multi-tenant** user interface applications, you also need to set up the [HTML5 Application Repository](https://discovery-center.cloud.sap/serviceCatalog/html5-application-repository-service) in combination with the [SAP Cloud Portal service](https://discovery-center.cloud.sap/serviceCatalog/cloud-portal-service):
```sh
cds add portal
```
-#### Option B: SAP Build Work Zone, Standard Edition
+#### Option B: SAP BTP Application Frontend
-For **single-tenant applications**, you can use [SAP Build Work Zone, Standard Edition](https://discovery-center.cloud.sap/serviceCatalog/sap-build-work-zone-standard-edition):
+For **single-tenant** applications, you can use the new [SAP BTP Application Frontend](https://help.sap.com/docs/application-frontend-service) service:
```sh
-cds add workzone
+cds add app-front
```
-**Important:** This also requires you to set up SAP Build Work Zone, Standard Edition [according to the SAP Learning tutorial](https://developers.sap.com/tutorials/spa-configure-workzone.html).
-
### 6. Optional: Multitenancy { #add-multitenancy }
To enable multitenancy for production, run the following command:
diff --git a/guides/extensibility/composition.md b/guides/extensibility/composition.md
index 223f9dfea1..c04d25bdc5 100644
--- a/guides/extensibility/composition.md
+++ b/guides/extensibility/composition.md
@@ -134,7 +134,7 @@ Add the dependency to the reuse package to your `pom.xml`:
:::
As Maven dependencies are - in contrast to `npm` packages - downloaded into a global cache, you need to make the artifacts from the reuse package available in your project locally.
-The CDS Maven Plugin provides a simple goal named `resolve`, that performs this task for you and extracts reuse packages into the `target/cds/` folder of the Maven project.
+The CDS Maven Plugin provides a simple goal named `resolve`, that performs this task for you and extracts reuse packages into the `target/cds/` folder of the CAP project.
Include this goal into the `pom.xml`, if not already present:
::: code-group
diff --git a/guides/multitenancy/index.md b/guides/multitenancy/index.md
index e6667b2542..9363531382 100644
--- a/guides/multitenancy/index.md
+++ b/guides/multitenancy/index.md
@@ -175,12 +175,18 @@ cds add multitenancy
"devDependencies": {
"@cap-js/sqlite": "^2"
},
+ "engines": {
+ "node": ">=20"
+ },
"scripts": {
"start": "cds-serve",
"build": "cds build ../.. --for mtx-sidecar --production && npm ci --prefix gen"
},
"cds": {
- "profile": "mtx-sidecar"
+ "profiles": [
+ "mtx-sidecar",
+ "java"
+ ]
}
}
```
@@ -772,6 +778,13 @@ cds up --to k8s
:::
+:::tip Ensure a unique metadata container
+To prevent potential conflicts during the initial creation of the MTXS metadata container (`t0`), it is recommended to perform the initial deployment with only one instance of the MTXS sidecar.
+
+Alternatively, you can run `cds-mtx upgrade t0` beforehand, such as in a [Cloud Foundry hook](#run-as-cloud-foundry-hook).
+:::
+
+
### Subscribe
**Create a BTP subaccount** to subscribe to your deployed application. This subaccount has to be in the same region as the provider subaccount, for example, `us10`.
@@ -980,6 +993,8 @@ cds watch --profile dev
:::
+
+
## SaaS Dependencies {#saas-dependencies}
Some of the xsuaa-based services your application consumes need to be registered as _reuse services_ to work in multitenant environments. This holds true for the usage of both the SaaS Registry service and the Subscription Manager Service (SMS).
diff --git a/java/building-plugins.md b/java/building-plugins.md
index 03a2e78a64..8f7136f764 100644
--- a/java/building-plugins.md
+++ b/java/building-plugins.md
@@ -22,7 +22,7 @@ In the following sections, the different extension points and mechanisms are exp
### Java Version
-When building CAP Java plugin modules, you need to keep in mind that the generated Java byte code of the plugin has to be compatible with the Java byte code version of the potential consumers of the plugin. To be on the safe side, we recommend using *Java 17* as this is anyways the minimum Java version for CAP Java (for 2.x release) applications. In case you deviate from this you need to check and align with the potential consumers of the plugin.
+When building CAP Java plugin modules, you need to keep in mind that the generated Java byte code of the plugin has to be compatible with the Java byte code version of the potential consumers of the plugin. To be on the safe side, we recommend using *Java 17* as this is anyways the minimum Java version for CAP Java applications. In case you deviate from this you need to check and align with the potential consumers of the plugin.
### Maven GroupId and Java Packages
@@ -31,13 +31,12 @@ Of course, it's up to your project / plugin how you call the corresponding Maven
## Share CDS Models via Maven Artifacts
-Before the CAP Java 2.2 release CDS definitions had to be shared as Node.js modules, also for Java projects.
-
-Starting with the 2.2 release CDS models, CSV import data and i18n files can now be shared through Maven dependencies in addition to npm packages. This means you can now provide CDS models, CSV files, i18n files, and Java code (for example, event handlers) in a single Maven dependency.
+CDS models, CSV import data and i18n files can be shared through Maven dependencies. In addition they can also be shared through npm packages.
+This means you can provide CDS models, CSV files, i18n files, and Java code (for example, event handlers) in a single Maven dependency.
### Create the CDS Model in a New Maven Artifact
-Simply create a plain Maven Java project and place your CDS models in the `main/resources/cds` folder of the reuse package under a unique module directory (for example, leveraging group ID and artifact ID): `src/main/resources/cds/com.sap.capire/bookshop/`. With `com.sap.capire` being the group ID and `bookshop` being the artifact ID.
+Simply create a plain Maven Java project and place your CDS models in the `src/main/resources/cds` folder of the reuse package under a unique module directory (for example, leveraging group ID and artifact ID): `src/main/resources/cds/com.sap.capire/bookshop/`. With `com.sap.capire` being the group ID and `bookshop` being the artifact ID.
You can simplify the creation of such a **plain Maven Java** project by calling the following Maven archetype command:
@@ -65,7 +64,7 @@ Projects wanting to import the content simply add a Maven dependency to the reus
```
:::
-Additionally, the new `resolve` goal from the CDS Maven Plugin needs to be added, to extract the models into the `target/cds/` folder of the Maven project, in order to make them available to the CDS Compiler.
+Additionally, the `resolve` goal from the CDS Maven Plugin needs to be added, to extract the models into the `target/cds/` folder of the Maven project, in order to make them available to the CDS Compiler.
::: code-group
```xml [srv/pom.xml]
@@ -87,8 +86,8 @@ Additionally, the new `resolve` goal from the CDS Maven Plugin needs to be added
```
:::
-::: details Reuse module as Maven module
-Please be aware that the module that uses the reuse module needs to be a Maven module itself or a submodule to a Maven module that declares the dependency to the Maven module. Usually you would declare the dependency in the `srv` module of your CAP Java project and use the reuse model in the service's CDS files then. In case you want to use the reuse model in your `db` module you need to make sure that your `db` module is a Maven module and include it to the project's parent `pom.xml` file.
+::: details Scope of the Reuse Package
+Usually you would declare the dependency to the reuse package in the `srv` module of your CAP Java project. Since CAP Java 4.4.0 this makes the reuse models available to all CDS files in the CAP project. The models are extracted to the root `target/cds` folder. In case you want to make the reuse models only available within the Maven module that declared the dependency (e.g. `srv`) set the configuration `to` of the `resolve` goal to `${project.build.directory}`. In earlier versions of CAP Java reuse models where only available within CDS files placed in the Maven module that declared the dependency by default.
:::
When your Maven build is set up correctly, you can use the reuse models in your CDS files using the standard `using` directive:
@@ -112,7 +111,7 @@ In most of the cases an event handler plugin for a CAP Java application can be a
```xml
- 2.4.0
+ ...
diff --git a/java/developing-applications/building.md b/java/developing-applications/building.md
index 4fe2d173ac..7199d28a6e 100644
--- a/java/developing-applications/building.md
+++ b/java/developing-applications/building.md
@@ -335,10 +335,10 @@ It supports the following command-line options:
| `-Dpackage=` | The Java package for your project's classes. Defaults to `${groupId}.${artifactId}`. |
| `-DincludeModel=true` | Adds a minimalistic sample CDS model to the project. |
| `-DincludeIntegrationTest=true` | Adds an integration test module to the project. |
-| `-DodataVersion=[v2\|v4]` | Specify which protocol adapter is activated by default. |
+| `-DodataVersion=[v2\|v4]` | Specify which protocol adapter is activated by default. Defaults to `v4`|
| `-DtargetPlatform=cloudfoundry` | Adds CloudFoundry target platform support to the project. |
| `-DinMemoryDatabase=[h2\|sqlite]` | Specify which in-memory database is used for local testing. If not specified, the default value is `h2`. |
-| `-DjdkVersion=[17\|21]` | Specifies the target JDK version. If not specified, the default value is `21`. |
+| `-DjdkVersion=[17\|21\|25]` | Specifies the target JDK version. Defaults to `21`. |
| `-Dpersistence=[true\|false]` | Specify whether persistence is enabled (`true`) or disabled (`false`). Defaults to `true`. |
| `-DcdsdkVersion=` | Sets the provided cds-dk version in the project. If not specified, the default of CAP Java is used. |
diff --git a/java/developing-applications/properties.json b/java/developing-applications/properties.json
index e799703212..b9966611ab 100644
--- a/java/developing-applications/properties.json
+++ b/java/developing-applications/properties.json
@@ -168,7 +168,7 @@
"header": false,
"name": "cds.model.provider.cache.expirationTime",
"type": "int",
- "default": "600",
+ "default": "3600",
"doc": "The lifetime of an entry in seconds after the entry's creation, the most recent
replacement of its value, or its last access."
},
{
@@ -959,6 +959,24 @@
"default": "PT30S",
"doc": "The oauth token retrieval timeout (as Duration)."
},
+ {
+ "header": true,
+ "name": "cds.multiTenancy.hanaMtService",
+ "doc": "Properties for the Hana multi tenant service"
+ },
+ {
+ "header": false,
+ "name": "cds.multiTenancy.hanaMtService.tokenRetrievalTimeout",
+ "type": "Duration",
+ "default": "PT30S",
+ "doc": "The oauth token retrieval timeout (as Duration)."
+ },
+ {
+ "header": false,
+ "name": "cds.multiTenancy.hanaMtService.hanaTenantPrefix",
+ "type": "String",
+ "doc": "Optional prefix for HANA tenant id calculation as hash from _id>"
+ },
{
"header": true,
"name": "cds.multiTenancy.security",
@@ -1455,6 +1473,13 @@
"default": "joint",
"doc": "Determines the persistence mode for draft-enabled entities. In case of `joint` persistence
queries with JOINs between databases tables/views of active instances and databases tables of
draft instances can occur. If set to `split` such queries are avoided. Possible values are:
`joint`, `split`."
},
+ {
+ "header": false,
+ "name": "cds.drafts.enforceReadonly",
+ "type": "boolean",
+ "default": "false",
+ "doc": "Determines, if @readonly, @Core.Computed and similar annotations are enforced on draft
instances already and therefore no longer during activation."
+ },
{
"header": true,
"name": "cds.drafts.gc",
diff --git a/java/event-handlers/indicating-errors.md b/java/event-handlers/indicating-errors.md
index 73e0767535..c7abfdfe8c 100644
--- a/java/event-handlers/indicating-errors.md
+++ b/java/event-handlers/indicating-errors.md
@@ -70,6 +70,10 @@ Writing the messages into explicitly modeled messages properties isn't yet suppo
SAP Fiori uses these messages to display detailed information on the UI. The style how a message appears on the UI depends on the severity of the message.
+::: warning User Input & Injection Vulnerabilities
+Ensure proper validation of the message text and URL if they contain values from user input.
+:::
+
### Throwing a ServiceException from Error Messages { #throwing-a-serviceexception-from-messages}
It is also possible to throw a [ServiceException](https://www.javadoc.io/doc/com.sap.cds/cds-services-api/latest/com/sap/cds/services/ServiceException.html) from error messages. This can, for example, be useful to cancel a request after collecting multiple validation errors. The individual validation checks will collect error messages in the `Messages` API. After the validation checks have been run, you call the `throwIfError()` method. Only if error messages have been collected, this method cancels the request with a [ServiceException](https://www.javadoc.io/doc/com.sap.cds/cds-services-api/latest/com/sap/cds/services/ServiceException.html):
diff --git a/java/operating-applications/dashboard.md b/java/operating-applications/dashboard.md
index 74995e3669..911d94fa8f 100644
--- a/java/operating-applications/dashboard.md
+++ b/java/operating-applications/dashboard.md
@@ -171,10 +171,10 @@ In some cases, your application may run in a complex environment and you simply
import org.springframework.security.web.SecurityFilterChain;
@Configuration
- @Order(1)
public class WebSecurity {
@Bean
+ @Order(1)
public SecurityFilterChain appFilterChain(HttpSecurity http) throws Exception {
return http
@@ -189,4 +189,4 @@ In some cases, your application may run in a complex environment and you simply
:::
-
\ No newline at end of file
+
diff --git a/java/outbox.md b/java/outbox.md
index 80b8139a4e..0bd0d0c2a8 100644
--- a/java/outbox.md
+++ b/java/outbox.md
@@ -163,6 +163,73 @@ To be sure that the deployment version has been set correctly, you can find a lo
And finally, if for some reason you don't want to use a version check for a particular outbox collector, you can switch it off via the outbox configuration [cds.outbox.services.MyCustomOutbox.checkVersion: false](../java/developing-applications/properties#cds-outbox-services--checkVersion).
+### Outbox for Shared Databases
+
+Currently, CAP Java does not yet support microservices with shared database out of the box, as this can lead to unexpected behavior when different isolated services use the same outboxes.
+Since CAP automatically creates two outboxes with a static name — **DefaultOutboxOrdered** and **DefaultOutboxUnordered** — these would be shared across all services which introduces conflicts.
+
+To avoid this, you can apply a manual workaround as follows:
+
+ 1. Customize the outbox configuration and isolating them via distinct namespaces for each service.
+ 2. Adapt the Audit Log outbox configuration.
+ 3. Adapt the messaging outbox configuration per service.
+
+ These steps are described in the following sections.
+
+#### Deactivate Default Outboxes
+
+First, deactivate the two default outboxes and create custom outboxes with configurations tailored to your needs.
+
+```yaml
+cds:
+ outbox:
+ services:
+ # deactivate default outboxes
+ DefaultOutboxUnordered.enabled: false
+ DefaultOutboxOrdered.enabled: false
+ # custom outboxes with unique names
+ Service1CustomOutboxOrdered:
+ maxAttempts: 10
+ storeLastError: true
+ ordered: true
+ Service1CustomOutboxUnordered:
+ maxAttempts: 10
+ storeLastError: true
+ ordered: false
+
+```
+
+#### Adapt Audit Log Configuration
+
+The **DefaultOutboxUnordered** outbox is automatically used for audit logging. Therefore, you must update the audit log configuration to point to the custom one.
+
+```yaml
+cds:
+ ...
+ auditlog:
+ outbox.name: Service1CustomOutboxUnordered
+```
+
+#### Adapt Messaging Configuration
+
+Next, adapt the messaging configuration of **every** messaging service in the application so that they use the custom-defined outboxes.
+
+```yaml
+cds:
+ messaging:
+ services:
+ MessagingService1:
+ outbox.name: Service1CustomOutboxOrdered
+ MessagingService2:
+ outbox.name: Service1CustomOutboxOrdered
+```
+
+
+::: tip Important Note
+It is crucial to **deactivate** the default outboxes, and ensure **unique outbox namespaces** in order to achieve proper isolation between services in a shared DB scenario.
+:::
+
+
## Outboxing CAP Service Events
Outbox services support outboxing of arbitrary CAP services. A typical use case is to outbox remote OData
diff --git a/java/security.md b/java/security.md
index 4970eefd84..0eba8a281f 100644
--- a/java/security.md
+++ b/java/security.md
@@ -42,7 +42,7 @@ Without security configured, CDS services are exposed to public. Proper configur
## Authentication { #authentication}
-Authentication rejects user requests with invalid authentication and limits the possible resource impact.
+Authentication rejects user requests with invalid authentication and limits the possible resource impact.
Rejecting them as soon as possible is one of the reasons why it's not an integral part of the CAP runtime and needs to be configured on the application framework level. In addition, CAP Java is based on a [modular architecture](./developing-applications/building#modular_architecture) and allows flexible configuration of any authentication method.
By default, it supports the standard BTP platform identity services [out of the box](#xsuaa-ias):
@@ -50,7 +50,7 @@ By default, it supports the standard BTP platform identity services [out of the
- [SAP Cloud Identity Services Identity Authentication (IAS)](https://help.sap.com/docs/cloud-identity-services) - preferred solution integrating endpoints cross SAP-systems
- [SAP Authorization and Trust Management Service (XSUAA)](https://help.sap.com/docs/authorization-and-trust-management-service) - previous offering scoped to a BTP landscape
-Which are highly recommended for production usage. For specific use cases, [custom authentication](#custom-authentication) can be configured as well.
+Which are highly recommended for production usage. For specific use cases, [custom authentication](#custom-authentication) can be configured as well.
Local development and testing can be done easily with built-in [mock user](#mock-users) support.
### Configure XSUAA and IAS Authentication { #xsuaa-ias}
@@ -164,15 +164,18 @@ Please note that the authentication mode has no impact on the *authorization* be
#### Customizing Spring Boot Security Configuration { #custom-spring-security-config}
-If you want to explicitly change the automatic security configuration, you can add an _additional_ Spring security configuration on top that overrides the default configuration by CAP. This can be useful, for instance, if an alternative authentication method is required for *specific endpoints* of your application.
+If you want to explicitly change the automatic security configuration, you can add an _additional_ Spring security configuration on top that overrides the default configuration by CAP.
+This can be useful, for instance, if an alternative authentication method is required for *specific endpoints* of your application.
+
+As the default security configurations provided by CAP act as the last line of defense and handle any request by default, you need to ensure that your custom security configurations have higher precedence. At the `SecurityFilterChain` bean method, set the `@Order` annotation with a lower numeric value, for example `1`:
```java
@Configuration
@EnableWebSecurity
-@Order(1) // needs to have higher priority than CAP security config
public class AppSecurityConfig {
@Bean
+ @Order(1) // needs to have higher priority than CAP security config
public SecurityFilterChain appFilterChain(HttpSecurity http) throws Exception {
return http
.securityMatcher(AntPathRequestMatcher.antMatcher("/public/**"))
@@ -184,9 +187,6 @@ public class AppSecurityConfig {
}
```
Due to the custom configuration, all URLs matching `/public/**` are opened for public access.
-::: tip
-The Spring `SecurityFilterChain` requires CAP Java SDK [1.27.x](../releases/archive/2022/aug22#minimum-spring-boot-version-2-7-x) or later. Older versions need to use the deprecated `WebSecurityConfigurerAdapter`.
-:::
::: warning _❗ Warning_
Be cautious with the configuration of the `HttpSecurity` instance in your custom configuration. Make sure that only the intended endpoints are affected.
@@ -197,11 +197,11 @@ Another typical example is the configuration of [Spring Actuators](https://docs.
```java
@Configuration
@EnableWebSecurity
-@Order(1)
public class ActuatorSecurityConfig {
@Bean
- public SecurityFilterChain actuatorFilterChain(HttpSecurity http)
+ @Order(1)
+ public SecurityFilterChain actuatorFilterChain(HttpSecurity http)
throws Exception {
return http
.securityMatcher(AntPathRequestMatcher.antMatcher("/actuator/**"))
@@ -214,6 +214,8 @@ public class ActuatorSecurityConfig {
}
```
+In case you want to write your own custom security configuration that acts as a last line of defense and handles any request you need to disable the CAP security configurations by setting cds.security.authentication.authConfig.enabled: false, as Spring Security forbids registering multiple security configurations with an any request security matcher.
+
### Custom Authentication { #custom-authentication}
You're free to configure any authentication method according to your needs. CAP isn't bound to any specific authentication method or user representation such as introduced with XSUAA, it rather runs the requests based on a [user abstraction](../guides/security/authorization#user-claims). The CAP user of a request is represented by a [UserInfo](https://www.javadoc.io/doc/com.sap.cds/cds-services-api/latest/com/sap/cds/services/request/UserInfo.html) object that can be retrieved from the [RequestContext](https://www.javadoc.io/doc/com.sap.cds/cds-services-api/latest/com/sap/cds/services/request/RequestContext.html) as explained in [Enforcement API & Custom Handlers](#enforcement-api).
@@ -238,7 +240,7 @@ public class CustomUserInfoProvider implements UserInfoProvider {
}
}
if (userInfo != null) {
- /* any modification of the resolved user goes here: */
+ /* any modification of the resolved user goes here: */
XsuaaUserInfo xsuaaUserInfo = userInfo.as(XsuaaUserInfo.class);
userInfo.setName(xsuaaUserInfo.getEmail() + "/" +
xsuaaUserInfo.getOrigin()); // normalizes name
@@ -625,7 +627,7 @@ In addition to standard authorization, CAP Java provides additional out of the b
### Deep Authorization { #deep-auth}
-Queries to Application Services are not only authorized by the target entity which has a `@restrict` or `@requires` annotation, but also for all __associated entities__ that are used in the statement.
+Queries to Application Services are not only authorized by the target entity which has a `@restrict` or `@requires` annotation, but also for all __associated entities__ that are used in the statement.
__Compositions__ are neither checked nor extended with additional filters.
For instance, consider the following model:
@@ -643,15 +645,15 @@ entity Orders {
}
```
-For the following OData request `GET Orders(ID='1')/items?$expand=book`, authorizations for `Orders` and for `Books` are checked.
-If the entity `Books` has a `where` clause for [instance-based authorization](/java/security#instance-based-auth),
+For the following OData request `GET Orders(ID='1')/items?$expand=book`, authorizations for `Orders` and for `Books` are checked.
+If the entity `Books` has a `where` clause for [instance-based authorization](/java/security#instance-based-auth),
it will be added as a filter to the sub-request with the expand.
-Custom CQL statements submitted to the [Application Service](/java/cqn-services/application-services) instances
+Custom CQL statements submitted to the [Application Service](/java/cqn-services/application-services) instances
are also authorized by the same rules including the path expressions and subqueries used in them.
-For example, the following statement checks role-based authorizations for both `Orders` and `Books`,
-because the association to `Books` is used in the select list.
+For example, the following statement checks role-based authorizations for both `Orders` and `Books`,
+because the association to `Books` is used in the select list.
```java
Select.from(Orders_.class,
@@ -675,15 +677,15 @@ Be careful when you modify or extend the statements in custom handlers.
Make sure you keep the filters for authorization.
:::
-Starting with CAP Java `4.0`, deep authorization is on by default.
+Starting with CAP Java `4.0`, deep authorization is on by default.
It can be disabled by setting cds.security.authorization.deep.enabled: false.
[Learn more about `@restrict.where` in the instance-based authorization guide.](/guides/security/authorization#instance-based-auth){.learn-more}
### Forbidden on Rejected Entity Selection { #reject-403 }
-Entities that have an instance-based authorization condition, that is [`@restrict.where`](/guides/security/authorization#restrict-annotation),
-are guarded by the CAP Java runtime by adding a filter condition to the DB query **excluding not matching instances from the result**.
+Entities that have an instance-based authorization condition, that is [`@restrict.where`](/guides/security/authorization#restrict-annotation),
+are guarded by the CAP Java runtime by adding a filter condition to the DB query **excluding not matching instances from the result**.
Hence, if the user isn't authorized to query an entity, requests targeting a *single* entity return *404 - Not Found* response and not *403 - Forbidden*.
To allow the UI to distinguish between *not found* and *forbidden*, CAP Java can detect this situation and rejects`PATCH` and `DELETE` requests to single entities with forbidden accordingly.
diff --git a/java/working-with-cql/query-api.md b/java/working-with-cql/query-api.md
index a4a1a410ed..b783766985 100644
--- a/java/working-with-cql/query-api.md
+++ b/java/working-with-cql/query-api.md
@@ -621,7 +621,22 @@ Select.from("bookshop.Books")
b.get("title").startsWith("Wuth")));
```
-### Grouping
+
+### Aggregating Data { #aggregating }
+
+You can aggregate data in two ways:
+
+- **Aggregate the current entity:** Use [aggregate functions](#aggregation-functions) like `sum` in the columns clause of your `Select` statement, usually together with [groupBy](#group-by), to summarize or group data.
+
+- **Aggregate associated entities:** Use dedicated aggregation methods to calculate values over to-many associations directly in your queries. See [Aggregating over Associations](#aggregating-associations).
+
+
+#### Aggregation Functions { #aggregation-functions }
+
+Use [aggregation functions](/guides/databases#aggregate-functions) to calculate minimums, maximums, totals, averages, and counts of values. You can use them in *columns* of `Select` statements to include the aggregated values in the result set, or in the [having](#having) clause to filter based on aggregated values.
+
+
+#### Grouping { #grouping }
The Query Builder API offers a way to group the results into summarized rows (in most cases these are aggregate functions) and apply certain criteria on it.
@@ -635,7 +650,7 @@ Let's assume the following dataset for our examples:
|103 |Hugo |
|104 |Smith |
-#### Group By
+##### Group By { #group-by }
The `groupBy` clause groups by one or more elements and usually involves aggregate [functions](query-api#scalar-functions), such as `count`, `countDistinct`, `sum`, `max`, `avg`, and so on. It returns one row for each group.
@@ -658,7 +673,7 @@ If we execute the query on our dataset, we get the following result:
|Hugo |1 |
-#### Having
+##### Having { #having }
To filter the [grouped](#group-by) result, `having` is used. Both, `having` and `where`, filter the result before `group by` is applied and can be used in the same query.
@@ -678,6 +693,65 @@ If we execute the query on our dataset, we get the following result:
|Smith |3 |
+#### Aggregating over Associations { #aggregating-associations }
+
+Use the aggregation methods `min`, `max`, `sum`, and `count` to calculate minimums, maximums, totals, and counts of values of associated entities directly in your CQL queries. You can use these aggregation methods in *columns* to include the aggregated values in the result set, or in the *where* clause to filter the result set based on aggregated values.
+
+::: tip
+Use [infix filters](/cds/cql#with-infix-filters) to aggregate only a subset of a (to-many) association.
+:::
+
+##### min
+
+Find the minimum value of an element in a collection.
+
+```java
+Select.from(ORDERS).columns(
+ o -> o.id(),
+ o -> o.items()
+ .filter(i -> i.amount().gt(0)) // optional filter
+ .min(i -> i.amount()).as("minAmount")
+);
+```
+
+This query selects each order’s id and the minimum item amount greater than 0 as "minAmount".
+
+##### max
+
+Find the maximum value of an element in a collection.
+
+```java
+Select.from(ORDERS)
+ .where(o -> o.items().max(i -> i.amount()).gt(100));
+```
+
+This query selects all orders where the maximum item amount is greater than 100.
+
+##### sum
+
+Calculate the total of a numeric element across related entities.
+
+```java
+Select.from(ORDERS).columns(
+ o -> o.id(),
+ o -> o.items().sum(i -> i.amount().times(i.price())).as("orderTotal")
+);
+```
+
+This query selects each order's id and the total order amount (sum of amount times price) as "orderTotal".
+
+##### count
+
+Count non-null values of an element in a collection.
+
+```java
+Select.from(ORDERS)
+ .where(o -> o.items().count(i -> i.discount()).gt(0));
+```
+
+This query selects all orders where at least one item has a discount.
+
+
### Ordering and Pagination
The Query Builder API allows to specify the sort order of query results. The _sort specification_ governs, according to which elements the result is sorted, and which sort order (ascending or descending) is applied.
@@ -1409,6 +1483,10 @@ Scalar functions are values that are calculated from other values. This calculat
.where(e -> e.get("name").substring(2).eq("ter"));
```
+* Concat
+
+ See [`Concat`](#string-expressions) String Expression
+
#### Case-When-Then Expressions
Use a case expression to compute a value based on the evaluation of conditions. The following query converts the stock of Books into a textual representation as 'stockLevel':
@@ -1420,6 +1498,17 @@ Select.from(BOOKS).columns(
.when(b.stock().gt(100)).then("high")
.orElse("medium").as("stockLevel").type(CdsBaseType.STRING));
```
+#### String Expressions
+
+* Concat
+
+ Function `concat` creates a string expression to concatenate a specified value to this value.
+
+ ```java
+ // SELECT from Author {name || ' - the Author' as author_name : String}
+ Select.from(AUTHOR)
+ .columns(a -> a.name().concat(" - the Author").as("author_name"));
+ ```
#### Arithmetic Expressions
diff --git a/menu.md b/menu.md
index 716409ff24..0560593e0f 100644
--- a/menu.md
+++ b/menu.md
@@ -88,26 +88,26 @@
### [Personal Data Management](guides/data-privacy/pdm)
### [Data Retention Management](guides/data-privacy/drm)
-## [Deployment](../guides/deployment/)
+## [Deployment](guides/deployment/)
- ### [Deploy to Cloud Foundry](../guides/deployment/to-cf)
- ### [Deploy to Kyma/K8s](../guides/deployment/to-kyma)
- ### [Microservices with CAP](../guides/deployment/microservices)
- ### [Deploy with Confidence](../guides/deployment/dwc)
- ### [Deploy with CI/CD](../guides/deployment/cicd)
- ### [Custom Builds](../guides/deployment/custom-builds)
- ### [Health Checks](../guides/deployment/health-checks)
+ ### [Deploy to Cloud Foundry](guides/deployment/to-cf)
+ ### [Deploy to Kyma/K8s](guides/deployment/to-kyma)
+ ### [Microservices with CAP](guides/deployment/microservices)
+ ### [Deploy with Confidence](guides/deployment/dwc)
+ ### [Deploy with CI/CD](guides/deployment/cicd)
+ ### [Custom Builds](guides/deployment/custom-builds)
+ ### [Health Checks](guides/deployment/health-checks)
-## [Multitenancy](../guides/multitenancy/)
+## [Multitenancy](guides/multitenancy/)
- ### [MTX Reference](../guides/multitenancy/mtxs)
- ### [MTX Migration](../guides/multitenancy/old-mtx-migration)
+ ### [MTX Reference](guides/multitenancy/mtxs)
+ ### [MTX Migration](guides/multitenancy/old-mtx-migration)
-## [Extensibility](../guides/extensibility/)
+## [Extensibility](guides/extensibility/)
- ### [Extend SaaS Apps](../guides/extensibility/customization)
- ### [Feature Toggles](../guides/extensibility/feature-toggles)
- ### [Reuse & Compose](../guides/extensibility/composition)
+ ### [Extend SaaS Apps](guides/extensibility/customization)
+ ### [Feature Toggles](guides/extensibility/feature-toggles)
+ ### [Reuse & Compose](guides/extensibility/composition)
## [Performance](advanced/performance-modeling)
diff --git a/node.js/_menu.md b/node.js/_menu.md
index effe4d2bca..f019e188a7 100644
--- a/node.js/_menu.md
+++ b/node.js/_menu.md
@@ -31,8 +31,6 @@
## [Class cds. RemoteService](remote-services)
## [Class cds. MessagingService](messaging)
## [Class cds. DatabaseService](databases)
- ## [Serving Fiori UIs](fiori)
- ## [Integrate with UCL](../../node.js/ucl)
# [cds. Events](events)
@@ -57,9 +55,11 @@
# [cds. env](cds-env)
# [cds. utils](cds-utils)
+# [Serving Fiori UIs](fiori)
# [Transactions](cds-tx)
# [Security](authentication)
# [Plugins](cds-plugins)
# [Testing](cds-test)
# [TypeScript](typescript)
# [Best Practices](best-practices)
+# [Integrate with UCL](ucl)
diff --git a/node.js/cds-i18n.md b/node.js/cds-i18n.md
index 2df1c38d17..6c32988efe 100644
--- a/node.js/cds-i18n.md
+++ b/node.js/cds-i18n.md
@@ -674,11 +674,11 @@ Ensure you correctly understand how the config option `cds.i18n.folders` work be
These are the current i18n entries for [`cds.i18n.messages`](#messages) used by the CAP runtime, which you can provide own translations for in your app-specific `_i18n/messages_.properties` files:
```properties
-MULTIPLE_ERRORS = Multiple errors occurred. Please see the details for more information.
-ASSERT_FORMAT = Value "{0}" is not in specified format "{1}"
-ASSERT_RANGE = Value {0} is not in specified range [{1}, {2}]
-ASSERT_ENUM = Value {0} is invalid according to enum declaration {{1}}
-ASSERT_NOT_NULL = Value is required
+MULTIPLE_ERRORS = Multiple errors occurred, see details below.
+ASSERT_FORMAT = Enter a value matching the pattern {1}.
+ASSERT_RANGE = Enter a value between {1} and {2}.
+ASSERT_ENUM = Enter one of the allowed values: {1}.
+ASSERT_MANDATORY = Provide the missing value.
```
In addition the following HTTP status codes can be translated:
diff --git a/node.js/cds-ql.md b/node.js/cds-ql.md
index 3c17956112..51eb0b8c02 100644
--- a/node.js/cds-ql.md
+++ b/node.js/cds-ql.md
@@ -704,30 +704,37 @@ If a queried record is already exclusively locked by another transaction, the `.
Passes hints to the database query optimizer that can influence the execution plan. The hints can be passed as individual arguments or as an array.
-
```js
SELECT ... .hints ('IGNORE_PLAN_CACHE')
SELECT ... .hints ('IGNORE_PLAN_CACHE', 'MAX_CONCURRENCY(1)')
SELECT ... .hints (['IGNORE_PLAN_CACHE', 'MAX_CONCURRENCY(1)'])
```
-### pipeline() {.method}
-Returns the data from the database as a raw stream.
+### pipeline() {.method}
+Pipes the data from the database into the given writable stream.
```js
-SELECT ... .pipeline ()
SELECT ... .pipeline (cds.context.http.res)
```
> Please note that the after handlers don't have effect if this stream is piped to the HTTP response.
+
+### stream() {.method}
+
+Returns the data from the database as a raw stream.
+
+```js
+SELECT ... .stream ()
+```
+
+
### foreach() {.method}
Creates an object stream and calls the provided callback for each object.
-
```js
await SELECT.from(Books).foreach ((book) => { ... })
```
@@ -742,6 +749,8 @@ for await (const book of SELECT.from(Books)) { ... }
As of now, `SELECT.foreach()` and `SELECT.pipeline()` are only supported by `cds.DatabaseService`. `cds.RemoteService` does not support the streaming APIs yet.
:::
+
+
## INSERT {.class}
Fluent API to construct [CQN INSERT](../cds/cqn#insert) query objects in a [CQL](../cds/cql)/SQL-like style. In contrast to SQL, though, the clauses can be arrayed in arbitrary order.
diff --git a/node.js/events.md b/node.js/events.md
index 8bfdf52dbe..8fdb54101b 100644
--- a/node.js/events.md
+++ b/node.js/events.md
@@ -548,6 +548,9 @@ req.warn ('Some warning message')
The methods are similar to [`req.error()`](#req-error), also accepting the [same arguments](#req-reject), but the messages are collected in `req.messages` instead of `req.errors`, not decorated with stack traces, and returned in a HTTP response header (e.g. `sap-messages`), instead of the response body.
+::: warning User Input & Injection Vulnerabilities
+Ensure proper validation of the message text if it contains values from user input.
+:::
## Error Responses
@@ -609,3 +612,21 @@ Content-Type: application/json
> In production, error responses should never disclose internal information that could be exploited by attackers. To ensure that, all errors with a `5xx` status code are returned to the client with only the respective generic message (example: `500 Internal Server Error`).
>
> In very rare cases, you might want to return 5xx errors with a meaningful message to the client. This can be achieved with `err.$sanitize = false`. Use that option with care!
+
+
+## Translations for Validation Errors
+
+For the following annotations/error codes, the runtime provides default translations:
+
+| Annotation | Error Code |
+|-------------------------|---------------------------------|
+| `@mandatory` | ASSERT_MANDATORY(1) |
+| `@assert.range` | ASSERT_RANGE |
+| `@assert.range` on enum | ASSERT_ENUM |
+| `@assert.format` | ASSERT_FORMAT |
+| `@assert.target` | ASSERT_TARGET |
+
+(1) Falls back to error code `ASSERT_NOT_NULL` if provided in custom translations.
+
+These can be overridden by the known technique of providing [custom i18n messages](cds-i18n#localized-messages).
+
diff --git a/node.js/fiori.md b/node.js/fiori.md
index be75edf5ff..249b783d52 100644
--- a/node.js/fiori.md
+++ b/node.js/fiori.md
@@ -19,52 +19,131 @@ See [Cookbook > Serving UIs > Draft Support](../advanced/fiori#draft-support) fo
-->
-## Lean Draft
+## Draft Entities {#draft-support}
-Lean draft is a new approach which makes it easier to differentiate between drafts and active instances in your code. This new architecture drastically reduces the complexity.
+Draft-enabled entities have corresponding CSN entities for drafts:
-### Handlers Registration {#draft-support}
+```js
+const { MyEntity } = srv.entities
+MyEntity.drafts // points to model.definitions[MyEntity.drafts]
+```
+
+In event handlers, the `target` is resolved before the handler execution and points to either the active or draft entity:
+
+```js
+srv.on('READ', MyEntity.drafts, (req, next) => {
+ assert.equal(req.target.name, MyEntity.drafts)
+ return next()
+})
+```
-Class `ApplicationService` provides built-in support for Fiori Draft. All CRUD events are supported for both, active and draft entities.
-Please note that draft-enabled entities must follow a specific draft choreography.
+In the special case of the Fiori Elements filter "Editing Status: All", two separate `READ` events are triggered for either the active or draft entity.
+The individual results are then combined behind the scenes.
-The examples are provided for `.on` handlers, but the same is true for `.before` and `.after` handlers.
+Manual filtering on draft-related properties is not allowed, only certain draft scenarios are supported.
- ```js
- // only active entities
- srv.on(['CREATE', 'READ', 'UPDATE', 'DELETE'], 'MyEntity', /*...*/)
- // only draft entities
- srv.on(['CREATE', 'READ', 'UPDATE', 'DELETE'], 'MyEntity.drafts', /*...*/)
- // bound action/function on active entity
- srv.on('boundActionOrFunction', 'MyEntity', /*...*/)
- // bound action/function on draft entity
- srv.on('boundActionOrFunction', 'MyEntity.drafts', /*...*/)
- ```
-It's also possible to use the array variant to register a handler for both entities, for example: `srv.on('boundActionOrFunction', ['MyEntity', 'MyEntity.drafts'], /*...*/)`.
-:::warning Bound actions/functions modifying active entity instances
-If a bound action/function modifies an active entity instance, custom handlers need to take care that a draft entity doesn't exist, otherwise all changes are overridden when saving the draft.
-:::
+## Draft-specific Events
+
+In addition to the standard CRUD events, draft entities provide draft-specific events in the lifecycle of a draft, as outlined in the following subsections.
+
+
+### `NEW`
+
+```js
+srv.before('NEW', MyEntity.drafts, req => {
+ req.data.ID = uuid()
+})
+srv.after('NEW', MyEntity.drafts, /*...*/)
+srv.on('NEW', MyEntity.drafts, /*...*/)
+```
+
+The `NEW` event is triggered when the user created a new draft.
+As a result `MyEntity.drafts` is created in the database.
+You can modify the initial draft data in a `before` handler.
+
+
+### `EDIT`
+
+```js
+srv.before('EDIT', MyEntity, /*...*/)
+srv.after('EDIT', MyEntity, /*...*/)
+srv.on('EDIT', MyEntity, /*...*/)
+```
+
+The `EDIT` event is triggered when the user starts editing an active entity.
+As a result, a new entry to `MyEntity.drafts` is created.
+
+For logical reasons handlers for the `EDIT` event are registered on the active entity, i.e. `MyEntity` in the code above, not on the `MyEntity.drafts` entity.
+
+You can also register handlers on the standard `CREATE` events for draft entities, which would be called whenever a new draft is created, be it via `NEW` or `EDIT`, like so:
+
+```js
+srv.before('CREATE', MyEntity.drafts, /*...*/)
+srv.after('CREATE', MyEntity.drafts, /*...*/)
+srv.on('CREATE', MyEntity.drafts, /*...*/)
+```
+
+
+### `DISCARD`
+
+```js
+srv.before('DISCARD', MyEntity.drafts, /*...*/)
+srv.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.
-Additionally, you can add your logic to the draft-specific events as follows:
+`CANCEL`, as a synonym for `DISCARD`, works as well.
- ```js
- // When a new draft is created
- srv.on('NEW', 'MyEntity.drafts', /*...*/)
- // When a draft is discarded
- srv.on('CANCEL', 'MyEntity.drafts', /*...*/)
- // When a new draft is created from an active instance
- srv.on('EDIT', 'MyEntity', /*...*/)
- // When the active entity is changed
- srv.on('SAVE', 'MyEntity', /*...*/)
- ```
-- The `CANCEL` event is triggered when you cancel the draft. In this case, the draft entity is deleted and the active entity isn't changed.
-- The `EDIT` event is triggered when you start editing an active entity. As a result `MyEntity.drafts` is created.
-- The `SAVE` event is just a shortcut for `['UPDATE', 'CREATE']` on an active entity. This event is also triggered when you press the `SAVE` button in UI after finishing editing your draft. Note, that composition children of the active entity will also be updated or created.
+### `PATCH`
-### Draft Locks
+```js
+srv.before('PATCH', MyEntity.drafts, /*...*/)
+srv.after('PATCH', MyEntity.drafts, /*...*/)
+srv.on('PATCH', MyEntity.drafts, /*...*/)
+```
+
+The `PATCH` event is triggered whenever the user edits a field in a draft.
+It's actually an alias for the standard CRUD `UPDATE` event.
+
+
+### `SAVE`
+
+```js
+srv.before('SAVE', MyEntity.drafts, /*...*/)
+srv.after('SAVE', MyEntity.drafts, /*...*/)
+srv.on('SAVE', MyEntity.drafts, /*...*/)
+```
+
+The `SAVE` event is triggered when the user saves / activates a draft. This results in either a CREATE or an UPDATE on the active entity depending on whether the draft was created via `NEW` or `EDIT`.
+
+> [!note]
+> The `SAVE` event is also available for non-draft, i.e. active entities. In that case it acts as an convenience shortcut for registering handlers for the combination of `CREATE` and `UPDATE` events. In contrast to that, the `SAVE` event on draft entities is a distinct event that is only triggered when **activating** a draft.
+
+
+### Custom Actions
+
+Custom bound actions and functions defined for draft-enabled entities are also inherited by the draft entities.
+This allows you to implement different logic depending on whether the action/function is called on the active or draft entity, like so:
+
+```js
+srv.on('someAction', MyEntity, /*...*/)
+srv.on('someAction', MyEntity.drafts, /*...*/)
+```
+
+If you want the same handler logic for both, do that:
+
+```js
+srv.on('someAction', [ MyEntity, MyEntity.drafts ], /*...*/)
+```
+
+
+## Draft Locks
To prevent inconsistency, the entities with draft are locked for modifications by other users. The lock is released when the draft is saved, canceled or a timeout is hit. The default timeout is 15 minutes. You can configure this timeout by the following application configuration property:
@@ -73,7 +152,7 @@ cds.fiori.draft_lock_timeout=30min
```
You can set the property to one of the following:
-- number of hours like `'1h'`
+- number of hours like `'1h'`
- number of minutes like `'10min'`
- number of milliseconds like `1000`
@@ -81,7 +160,8 @@ You can set the property to one of the following:
If the `draft_lock_timeout` has been reached, every user can delete other users' drafts to create an own draft. There can't be two drafts at the same time on the same entity.
:::
-### Garbage Collection of Stale Drafts
+
+## Draft Timeouts
Inactive drafts are deleted automatically after the default timeout of 30 days. You can configure or deactivate this timeout by the following configuration:
@@ -97,7 +177,7 @@ Inactive drafts are deleted automatically after the default timeout of 30 days.
You can set the property to one of the following:
- `false` in order to deactivate the timeout
-- number of days like `'30d'`
+- number of days like `'30d'`
- number of hours like `'72h'`
- number of milliseconds like `1000`
@@ -105,7 +185,8 @@ You can set the property to one of the following:
It can occur that inactive drafts are still in the database after the configured timeout. The deletion is implemented as a side effect of creating new drafts and there's no periodic job that does the garbage collection.
:::
-### Bypassing the SAP Fiori Draft Flow
+
+## Bypassing Drafts
Creating or modifying active instances directly is possible without creating drafts. This comes in handy when technical services without a UI interact with each other.
To enable this feature, set this feature flag in your configuration:
@@ -149,36 +230,8 @@ Note that this feature creates additional entry points to your application. Cust
payloads rather than the complete business object.
:::
-### Differences to Previous Version
-
-- Draft-enabled entities have corresponding CSN entities for drafts:
-
- ```js
- const { MyEntity } = srv.entities
- MyEntity.drafts // points to model.definitions['MyEntity.drafts']
- ```
-
-- Queries are now cleansed from draft-related properties (like `IsActiveEntity`)
-- `PATCH` event isn't supported anymore.
-- The target is resolved before the handler execution and points to either the active or draft entity:
-
- ```js
- srv.on('READ', 'MyEntity.drafts', (req, next) => {
- assert.equal(req.target.name, 'MyEntity.drafts')
- return next()
- })
- ```
-
- ::: info Special case: "Editing Status: All"
- In the special case of the Fiori Elements filter "Editing Status: All", two separate `READ` events are triggered for either the active or draft entity.
- The individual results are then combined behind the scenes.
- :::
-
-- Draft-related properties (with the exception of `IsActiveEntity`) are only computed for the target entity, not for expanded sub entities since this is not required by Fiori Elements.
-- Manual filtering on draft-related properties is not allowed, only certain draft scenarios are supported.
-
-### Programmatic Invocation of Draft Actions
+## Programmatic APIs
You can programmatically invoke draft actions with the following APIs:
diff --git a/package-lock.json b/package-lock.json
index a2a4b5a1b1..b77653585b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,7 +19,7 @@
"adm-zip": "^0.5.10",
"cspell": "^9.0.0",
"eslint": "^9.0.0",
- "eslint-plugin-vue": "^9.11.0",
+ "eslint-plugin-vue": "^10.0.0",
"fflate": "^0.8.2",
"gray-matter": "^4.0.3",
"markdownlint-cli": ">=0.35.0",
@@ -29,16 +29,16 @@
}
},
"node_modules/@algolia/abtesting": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz",
- "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.4.0.tgz",
+ "integrity": "sha512-N0blWT/C0KOZ/OJ9GXBX66odJZlrYjMj3M+01y8ob1mjBFnBaBo7gOCyHBDQy60+H4pJXp3pSGlJOqJIueBH+A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0",
- "@algolia/requester-browser-xhr": "5.35.0",
- "@algolia/requester-fetch": "5.35.0",
- "@algolia/requester-node-http": "5.35.0"
+ "@algolia/client-common": "5.38.0",
+ "@algolia/requester-browser-xhr": "5.38.0",
+ "@algolia/requester-fetch": "5.38.0",
+ "@algolia/requester-node-http": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
@@ -94,41 +94,41 @@
}
},
"node_modules/@algolia/client-abtesting": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz",
- "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.38.0.tgz",
+ "integrity": "sha512-15d6zv8vtj2l9pnnp/EH7Rhq3/snCCHRz56NnX6xIUPrbJl5gCsIYXAz8C2IEkwOpoDb0r5G6ArY2gKdVMNezw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0",
- "@algolia/requester-browser-xhr": "5.35.0",
- "@algolia/requester-fetch": "5.35.0",
- "@algolia/requester-node-http": "5.35.0"
+ "@algolia/client-common": "5.38.0",
+ "@algolia/requester-browser-xhr": "5.38.0",
+ "@algolia/requester-fetch": "5.38.0",
+ "@algolia/requester-node-http": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/@algolia/client-analytics": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz",
- "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.38.0.tgz",
+ "integrity": "sha512-jJIbYAhYvTG3+gEAP5Q5Dp6PFJfUR+atz5rsqm5KjAKK+faLFdHJbM2IbOo0xdyGd+SH259MzfQKLJ9mZZ27dQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0",
- "@algolia/requester-browser-xhr": "5.35.0",
- "@algolia/requester-fetch": "5.35.0",
- "@algolia/requester-node-http": "5.35.0"
+ "@algolia/client-common": "5.38.0",
+ "@algolia/requester-browser-xhr": "5.38.0",
+ "@algolia/requester-fetch": "5.38.0",
+ "@algolia/requester-node-http": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/@algolia/client-common": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz",
- "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.38.0.tgz",
+ "integrity": "sha512-aMCXzVPGJTeQnVU3Sdf30TfMN2+QyWcjfPTCCHyqVVgjPipb6RnK40aISGoO+rlYjh9LunDsNVFLwv+JEIF8bQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -136,151 +136,152 @@
}
},
"node_modules/@algolia/client-insights": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz",
- "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.38.0.tgz",
+ "integrity": "sha512-4c3FbpMiJX+VcaAj0rYaQdTLS/CkrdOn4hW+5y1plPov7KC7iSHai/VBbirmHuAfW1hVPCIh1w/4erKKTKuo+Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0",
- "@algolia/requester-browser-xhr": "5.35.0",
- "@algolia/requester-fetch": "5.35.0",
- "@algolia/requester-node-http": "5.35.0"
+ "@algolia/client-common": "5.38.0",
+ "@algolia/requester-browser-xhr": "5.38.0",
+ "@algolia/requester-fetch": "5.38.0",
+ "@algolia/requester-node-http": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/@algolia/client-personalization": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz",
- "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.38.0.tgz",
+ "integrity": "sha512-FzLs6c8TBL4FSgNfnH2NL7O33ktecGiaKO4ZFG51QYORUzD5d6YwB9UBteaIYu/sgFoEdY57diYU4vyBH8R6iA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0",
- "@algolia/requester-browser-xhr": "5.35.0",
- "@algolia/requester-fetch": "5.35.0",
- "@algolia/requester-node-http": "5.35.0"
+ "@algolia/client-common": "5.38.0",
+ "@algolia/requester-browser-xhr": "5.38.0",
+ "@algolia/requester-fetch": "5.38.0",
+ "@algolia/requester-node-http": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/@algolia/client-query-suggestions": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz",
- "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.38.0.tgz",
+ "integrity": "sha512-7apiahlgZLvOqrh0+hAYAp/UWjqz6AfSJrCwnsoQNzgIT09dLSPIKREelkuQeUrKy38vHWWpSQE3M0zWSp/YrA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0",
- "@algolia/requester-browser-xhr": "5.35.0",
- "@algolia/requester-fetch": "5.35.0",
- "@algolia/requester-node-http": "5.35.0"
+ "@algolia/client-common": "5.38.0",
+ "@algolia/requester-browser-xhr": "5.38.0",
+ "@algolia/requester-fetch": "5.38.0",
+ "@algolia/requester-node-http": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/@algolia/client-search": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz",
- "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.38.0.tgz",
+ "integrity": "sha512-PTAFMJOpVtJweExEYYgdmSCC6n4V/R+ctDL3fRQy77ulZM/p+zMLIQC9c7HCQE1zqpauvVck3f2zYSejaUTtrw==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
- "@algolia/client-common": "5.35.0",
- "@algolia/requester-browser-xhr": "5.35.0",
- "@algolia/requester-fetch": "5.35.0",
- "@algolia/requester-node-http": "5.35.0"
+ "@algolia/client-common": "5.38.0",
+ "@algolia/requester-browser-xhr": "5.38.0",
+ "@algolia/requester-fetch": "5.38.0",
+ "@algolia/requester-node-http": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/@algolia/ingestion": {
- "version": "1.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz",
- "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==",
+ "version": "1.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.38.0.tgz",
+ "integrity": "sha512-qGSUGgceJHGyJLZ06bFLwVe2Tpf9KwabmoBjFvFscVmMmU5scKya6voCYd9bdX7V0Xy1qya9MGbmTm4zlLuveQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0",
- "@algolia/requester-browser-xhr": "5.35.0",
- "@algolia/requester-fetch": "5.35.0",
- "@algolia/requester-node-http": "5.35.0"
+ "@algolia/client-common": "5.38.0",
+ "@algolia/requester-browser-xhr": "5.38.0",
+ "@algolia/requester-fetch": "5.38.0",
+ "@algolia/requester-node-http": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/@algolia/monitoring": {
- "version": "1.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz",
- "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==",
+ "version": "1.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.38.0.tgz",
+ "integrity": "sha512-VnCtAUcHirvv/dDHg9jK1Z5oo4QOC5FKDxe40x8qloru2qDcjueT34jiAsB0gRos3VWf9v4iPSYTqMIFOcADpQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0",
- "@algolia/requester-browser-xhr": "5.35.0",
- "@algolia/requester-fetch": "5.35.0",
- "@algolia/requester-node-http": "5.35.0"
+ "@algolia/client-common": "5.38.0",
+ "@algolia/requester-browser-xhr": "5.38.0",
+ "@algolia/requester-fetch": "5.38.0",
+ "@algolia/requester-node-http": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/@algolia/recommend": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz",
- "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.38.0.tgz",
+ "integrity": "sha512-fqgeU9GqxQorFUeGP4et1MyY28ccf9PCeciHwDPSbPYYiTqBItHdUIiytsNpjC5Dnc0RWtuXWCltLwSw9wN/bQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0",
- "@algolia/requester-browser-xhr": "5.35.0",
- "@algolia/requester-fetch": "5.35.0",
- "@algolia/requester-node-http": "5.35.0"
+ "@algolia/client-common": "5.38.0",
+ "@algolia/requester-browser-xhr": "5.38.0",
+ "@algolia/requester-fetch": "5.38.0",
+ "@algolia/requester-node-http": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/@algolia/requester-browser-xhr": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz",
- "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.38.0.tgz",
+ "integrity": "sha512-nAUKbv4YQIXbpPi02AQvSPisD5FDDbT8XeYSh9HFoYP0Z3IpBLLDg7R4ahPvzd7gGsVKgEbXzRPWESXSji5yIg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0"
+ "@algolia/client-common": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/@algolia/requester-fetch": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz",
- "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.38.0.tgz",
+ "integrity": "sha512-bkuAHaadC6OxJd3SVyQQnU1oJ9G/zdCqua7fwr1tJDrA/v7KzeS5np4/m6BuRUpTgVgFZHSewGnMcgj9DLBoaQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0"
+ "@algolia/client-common": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/@algolia/requester-node-http": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz",
- "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.38.0.tgz",
+ "integrity": "sha512-yHDKZTnMPR3/4bY0CVC1/uRnnbAaJ+pctRuX7G/HflBkKOrnUBDEGtQQHzEfMz2FHZ/tbCL+Q9r6mvwTSGp8nw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@algolia/client-common": "5.35.0"
+ "@algolia/client-common": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
@@ -307,13 +308,13 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.28.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz",
- "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==",
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
+ "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.28.2"
+ "@babel/types": "^7.28.4"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -323,9 +324,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.28.2",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz",
- "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
+ "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -337,9 +338,9 @@
}
},
"node_modules/@cap-js/cds-typer": {
- "version": "0.37.0",
- "resolved": "https://registry.npmjs.org/@cap-js/cds-typer/-/cds-typer-0.37.0.tgz",
- "integrity": "sha512-fvzKenHq9GUhpr51lw6u2AttTlTTubm+5teR8cJAoCAsA12B7QnMPEJ7ftarBiygS3bNdJzmfMrczdkpX9btcA==",
+ "version": "0.38.0",
+ "resolved": "https://registry.npmjs.org/@cap-js/cds-typer/-/cds-typer-0.38.0.tgz",
+ "integrity": "sha512-X/AAF3A02pNjxDQOpf+om0S+L1MWyFanz9/aQYwYvjUaaU/Tkx26ruziZ2MDbwVrAJ5iA6bSFYs6LP5/+oMdNQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -351,12 +352,13 @@
}
},
"node_modules/@cap-js/cds-types": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@cap-js/cds-types/-/cds-types-0.14.0.tgz",
- "integrity": "sha512-wscDWFRAsrjFz0cF5moaJAhIOi7SVKyUYqZ7UeOW1SaJRbhYed9wDIFVGpB2h2jME/rqX1pPGhGvQQcqwFMRxw==",
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@cap-js/cds-types/-/cds-types-0.15.0.tgz",
+ "integrity": "sha512-Bi0uQnzpCzBw2KHzFuMzobt0mvMG3as3bfVvRJAc8ooRuoVMyr3Y0iRVjmmoyOeE2ezG6EiF+Xp22QpJ7J+z+Q==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
+ "peer": true,
"peerDependencies": {
"@sap/cds": ">=9.0.0",
"@sap/cds-dk": "^9",
@@ -558,7 +560,8 @@
"resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.18.tgz",
"integrity": "sha512-EF77RqROHL+4LhMGW5NTeKqfUd/e4OOv6EDFQ/UQQiFyWuqkEKyEz0NDILxOFxWUEVdjT2GQ2cC7t12B6pESwg==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@cspell/dict-dart": {
"version": "2.3.1",
@@ -603,23 +606,23 @@
"license": "MIT"
},
"node_modules/@cspell/dict-en_us": {
- "version": "4.4.18",
- "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.18.tgz",
- "integrity": "sha512-6Le961Q0AIfVp3nKuSJJD/9NfnTYA1N/MLAaeWKCABEvhzhopeyGrykwejd0SA4m64WBUNEfSlsgselYWoDSjQ==",
+ "version": "4.4.19",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-en_us/-/dict-en_us-4.4.19.tgz",
+ "integrity": "sha512-JYYgzhGqSGuIMNY1cTlmq3zrNpehrExMHqLmLnSM2jEGFeHydlL+KLBwBYxMy4e73w+p1+o/rmAiGsMj9g3MCw==",
"dev": true,
"license": "MIT"
},
"node_modules/@cspell/dict-en-common-misspellings": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.5.tgz",
- "integrity": "sha512-hlRDSjul7wGTDXeLBADoyTGIZjWWZn6/SP+pt0lG3PRtqF0MWH/QEDgUkS+Yev7ZhHCHVLvwBZtDxOd1uw06Tw==",
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-en-common-misspellings/-/dict-en-common-misspellings-2.1.6.tgz",
+ "integrity": "sha512-xV9yryOqZizbSqxRS7kSVRrxVEyWHUqwdY56IuT7eAWGyTCJNmitXzXa4p+AnEbhL+AB2WLynGVSbNoUC3ceFA==",
"dev": true,
"license": "CC BY-SA 4.0"
},
"node_modules/@cspell/dict-en-gb-mit": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.8.tgz",
- "integrity": "sha512-wrZDRl6TKd1wReepGDPuT1JNbnRjHLvtAVrozp0DUkFlcDgnrB+YSd/Ne4aKnkXl5qpyVQ2GG7a4Z7INKCX+fw==",
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-en-gb-mit/-/dict-en-gb-mit-3.1.9.tgz",
+ "integrity": "sha512-1lSnphnHTOxnpNLpPLg1XXv8df3hs4oL0LJ6dkQ0IqNROl8Jzl6PD55BDTlKy4YOAA76dJlePB0wyrxB+VVKbg==",
"dev": true,
"license": "MIT"
},
@@ -698,14 +701,16 @@
"resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.12.tgz",
"integrity": "sha512-JFffQ1dDVEyJq6tCDWv0r/RqkdSnV43P2F/3jJ9rwLgdsOIXwQbXrz6QDlvQLVvNSnORH9KjDtenFTGDyzfCaA==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@cspell/dict-html-symbol-entities": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.4.tgz",
"integrity": "sha512-afea+0rGPDeOV9gdO06UW183Qg6wRhWVkgCFwiO3bDupAoyXRuvupbb5nUyqSTsLXIKL8u8uXQlJ9pkz07oVXw==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@cspell/dict-java": {
"version": "5.0.12",
@@ -791,9 +796,9 @@
"license": "MIT"
},
"node_modules/@cspell/dict-npm": {
- "version": "5.2.15",
- "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.15.tgz",
- "integrity": "sha512-kb9oX/N5FUlJYoqc5G+tIP/0SolteFMz2VhOVKG2qiXUS/1AybVTjUEo4gZ4uEveUhLzUDcfpZbn40EoUVBVrg==",
+ "version": "5.2.17",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-npm/-/dict-npm-5.2.17.tgz",
+ "integrity": "sha512-0yp7lBXtN3CtxBrpvTu/yAuPdOHR2ucKzPxdppc3VKO068waZNpKikn1NZCzBS3dIAFGVITzUPtuTXxt9cxnSg==",
"dev": true,
"license": "MIT"
},
@@ -864,9 +869,9 @@
"license": "MIT"
},
"node_modules/@cspell/dict-software-terms": {
- "version": "5.1.7",
- "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.7.tgz",
- "integrity": "sha512-CfNFQCVx8R/D8RfFdFTwSjDvXcSXY0tO+VN2N6TEbNTL1GCmqyzhwm4YI+ZbO3MUmMAMjwu9jZyoLk5BaJkXcg==",
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/@cspell/dict-software-terms/-/dict-software-terms-5.1.8.tgz",
+ "integrity": "sha512-iwCHLP11OmVHEX2MzE8EPxpPw7BelvldxWe5cJ3xXIDL8TjF2dBTs2noGcrqnZi15SLYIlO8897BIOa33WHHZA==",
"dev": true,
"license": "MIT"
},
@@ -903,7 +908,8 @@
"resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz",
"integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@cspell/dict-vue": {
"version": "3.0.5",
@@ -1399,9 +1405,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
- "version": "4.8.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.8.0.tgz",
- "integrity": "sha512-MJQFqrZgcW0UNYLGOuQpey/oTN59vyWwplvCGZztn1cKz9agZPPYpJB7h2OMmuu7VLqkvEjN8feFZJmxNF9D+Q==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1480,19 +1486,22 @@
}
},
"node_modules/@eslint/config-helpers": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz",
- "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==",
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz",
+ "integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==",
"dev": true,
"license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.16.0"
+ },
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/@eslint/core": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
- "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz",
+ "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1551,11 +1560,12 @@
}
},
"node_modules/@eslint/js": {
- "version": "9.35.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.35.0.tgz",
- "integrity": "sha512-30iXE9whjlILfWobBkNerJo+TXYsgVM5ERQwMcMKCHckHflCmf7wXDAHlARoWnh0s1U72WqlbeyE7iAcCzuCPw==",
+ "version": "9.37.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz",
+ "integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -1574,13 +1584,13 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
- "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz",
+ "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@eslint/core": "^0.15.2",
+ "@eslint/core": "^0.16.0",
"levn": "^0.4.1"
},
"engines": {
@@ -1625,33 +1635,19 @@
}
},
"node_modules/@humanfs/node": {
- "version": "0.16.6",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
- "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@humanfs/core": "^0.19.1",
- "@humanwhocodes/retry": "^0.3.0"
+ "@humanwhocodes/retry": "^0.4.0"
},
"engines": {
"node": ">=18.18.0"
}
},
- "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
- "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
"node_modules/@humanwhocodes/module-importer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -1681,9 +1677,9 @@
}
},
"node_modules/@iconify-json/simple-icons": {
- "version": "1.2.48",
- "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.48.tgz",
- "integrity": "sha512-EACOtZMoPJtERiAbX1De0asrrCtlwI27+03c9OJlYWsly9w1O5vcD8rTzh+kDPjo+K8FOVnq2Qy+h/CzljSKDA==",
+ "version": "1.2.53",
+ "resolved": "https://registry.npmjs.org/@iconify-json/simple-icons/-/simple-icons-1.2.53.tgz",
+ "integrity": "sha512-8GEW5mshsPAZpVAJmkBG/niR2qn8t4U03Wmz6aSD9R4VMZKTECqbOxH3z4inA0JfZOoTvP4qoK9T2VXAx2Xg5g==",
"dev": true,
"license": "CC0-1.0",
"dependencies": {
@@ -2094,9 +2090,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.3.tgz",
- "integrity": "sha512-UmTdvXnLlqQNOCJnyksjPs1G4GqXNGW1LrzCe8+8QoaLhhDeTXYBgJ3k6x61WIhlHX2U+VzEJ55TtIjR/HTySA==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.2.tgz",
+ "integrity": "sha512-o3pcKzJgSGt4d74lSZ+OCnHwkKBeAbFDmbEm5gg70eA8VkyCuC/zV9TwBnmw6VjDlRdF4Pshfb+WE9E6XY1PoQ==",
"cpu": [
"arm"
],
@@ -2108,9 +2104,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.3.tgz",
- "integrity": "sha512-8NoxqLpXm7VyeI0ocidh335D6OKT0UJ6fHdnIxf3+6oOerZZc+O7r+UhvROji6OspyPm+rrIdb1gTXtVIqn+Sg==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.2.tgz",
+ "integrity": "sha512-cqFSWO5tX2vhC9hJTK8WAiPIm4Q8q/cU8j2HQA0L3E1uXvBYbOZMhE2oFL8n2pKB5sOCHY6bBuHaRwG7TkfJyw==",
"cpu": [
"arm64"
],
@@ -2122,9 +2118,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.3.tgz",
- "integrity": "sha512-csnNavqZVs1+7/hUKtgjMECsNG2cdB8F7XBHP6FfQjqhjF8rzMzb3SLyy/1BG7YSfQ+bG75Ph7DyedbUqwq1rA==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.2.tgz",
+ "integrity": "sha512-vngduywkkv8Fkh3wIZf5nFPXzWsNsVu1kvtLETWxTFf/5opZmflgVSeLgdHR56RQh71xhPhWoOkEBvbehwTlVA==",
"cpu": [
"arm64"
],
@@ -2136,9 +2132,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.3.tgz",
- "integrity": "sha512-r2MXNjbuYabSIX5yQqnT8SGSQ26XQc8fmp6UhlYJd95PZJkQD1u82fWP7HqvGUf33IsOC6qsiV+vcuD4SDP6iw==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.2.tgz",
+ "integrity": "sha512-h11KikYrUCYTrDj6h939hhMNlqU2fo/X4NB0OZcys3fya49o1hmFaczAiJWVAFgrM1NCP6RrO7lQKeVYSKBPSQ==",
"cpu": [
"x64"
],
@@ -2150,9 +2146,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.3.tgz",
- "integrity": "sha512-uluObTmgPJDuJh9xqxyr7MV61Imq+0IvVsAlWyvxAaBSNzCcmZlhfYcRhCdMaCsy46ccZa7vtDDripgs9Jkqsw==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.2.tgz",
+ "integrity": "sha512-/eg4CI61ZUkLXxMHyVlmlGrSQZ34xqWlZNW43IAU4RmdzWEx0mQJ2mN/Cx4IHLVZFL6UBGAh+/GXhgvGb+nVxw==",
"cpu": [
"arm64"
],
@@ -2164,9 +2160,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.3.tgz",
- "integrity": "sha512-AVJXEq9RVHQnejdbFvh1eWEoobohUYN3nqJIPI4mNTMpsyYN01VvcAClxflyk2HIxvLpRcRggpX1m9hkXkpC/A==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.2.tgz",
+ "integrity": "sha512-QOWgFH5X9+p+S1NAfOqc0z8qEpJIoUHf7OWjNUGOeW18Mx22lAUOiA9b6r2/vpzLdfxi/f+VWsYjUOMCcYh0Ng==",
"cpu": [
"x64"
],
@@ -2178,9 +2174,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.3.tgz",
- "integrity": "sha512-byyflM+huiwHlKi7VHLAYTKr67X199+V+mt1iRgJenAI594vcmGGddWlu6eHujmcdl6TqSNnvqaXJqZdnEWRGA==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.2.tgz",
+ "integrity": "sha512-kDWSPafToDd8LcBYd1t5jw7bD5Ojcu12S3uT372e5HKPzQt532vW+rGFFOaiR0opxePyUkHrwz8iWYEyH1IIQA==",
"cpu": [
"arm"
],
@@ -2192,9 +2188,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.3.tgz",
- "integrity": "sha512-aLm3NMIjr4Y9LklrH5cu7yybBqoVCdr4Nvnm8WB7PKCn34fMCGypVNpGK0JQWdPAzR/FnoEoFtlRqZbBBLhVoQ==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.2.tgz",
+ "integrity": "sha512-gKm7Mk9wCv6/rkzwCiUC4KnevYhlf8ztBrDRT9g/u//1fZLapSRc+eDZj2Eu2wpJ+0RzUKgtNijnVIB4ZxyL+w==",
"cpu": [
"arm"
],
@@ -2206,9 +2202,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.3.tgz",
- "integrity": "sha512-VtilE6eznJRDIoFOzaagQodUksTEfLIsvXymS+UdJiSXrPW7Ai+WG4uapAc3F7Hgs791TwdGh4xyOzbuzIZrnw==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.2.tgz",
+ "integrity": "sha512-66lA8vnj5mB/rtDNwPgrrKUOtCLVQypkyDa2gMfOefXK6rcZAxKLO9Fy3GkW8VkPnENv9hBkNOFfGLf6rNKGUg==",
"cpu": [
"arm64"
],
@@ -2220,9 +2216,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.3.tgz",
- "integrity": "sha512-dG3JuS6+cRAL0GQ925Vppafi0qwZnkHdPeuZIxIPXqkCLP02l7ka+OCyBoDEv8S+nKHxfjvjW4OZ7hTdHkx8/w==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.2.tgz",
+ "integrity": "sha512-s+OPucLNdJHvuZHuIz2WwncJ+SfWHFEmlC5nKMUgAelUeBUnlB4wt7rXWiyG4Zn07uY2Dd+SGyVa9oyLkVGOjA==",
"cpu": [
"arm64"
],
@@ -2233,10 +2229,10 @@
"linux"
]
},
- "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.3.tgz",
- "integrity": "sha512-iU8DxnxEKJptf8Vcx4XvAUdpkZfaz0KWfRrnIRrOndL0SvzEte+MTM7nDH4A2Now4FvTZ01yFAgj6TX/mZl8hQ==",
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.2.tgz",
+ "integrity": "sha512-8wTRM3+gVMDLLDdaT6tKmOE3lJyRy9NpJUS/ZRWmLCmOPIJhVyXwjBo+XbrrwtV33Em1/eCTd5TuGJm4+DmYjw==",
"cpu": [
"loong64"
],
@@ -2248,9 +2244,9 @@
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.3.tgz",
- "integrity": "sha512-VrQZp9tkk0yozJoQvQcqlWiqaPnLM6uY1qPYXvukKePb0fqaiQtOdMJSxNFUZFsGw5oA5vvVokjHrx8a9Qsz2A==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.2.tgz",
+ "integrity": "sha512-6yqEfgJ1anIeuP2P/zhtfBlDpXUb80t8DpbYwXQ3bQd95JMvUaqiX+fKqYqUwZXqdJDd8xdilNtsHM2N0cFm6A==",
"cpu": [
"ppc64"
],
@@ -2262,9 +2258,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.3.tgz",
- "integrity": "sha512-uf2eucWSUb+M7b0poZ/08LsbcRgaDYL8NCGjUeFMwCWFwOuFcZ8D9ayPl25P3pl+D2FH45EbHdfyUesQ2Lt9wA==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.2.tgz",
+ "integrity": "sha512-sshYUiYVSEI2B6dp4jMncwxbrUqRdNApF2c3bhtLAU0qA8Lrri0p0NauOsTWh3yCCCDyBOjESHMExonp7Nzc0w==",
"cpu": [
"riscv64"
],
@@ -2276,9 +2272,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.3.tgz",
- "integrity": "sha512-7tnUcDvN8DHm/9ra+/nF7lLzYHDeODKKKrh6JmZejbh1FnCNZS8zMkZY5J4sEipy2OW1d1Ncc4gNHUd0DLqkSg==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.2.tgz",
+ "integrity": "sha512-duBLgd+3pqC4MMwBrKkFxaZerUxZcYApQVC5SdbF5/e/589GwVvlRUnyqMFbM8iUSb1BaoX/3fRL7hB9m2Pj8Q==",
"cpu": [
"riscv64"
],
@@ -2290,9 +2286,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.3.tgz",
- "integrity": "sha512-MUpAOallJim8CsJK+4Lc9tQzlfPbHxWDrGXZm2z6biaadNpvh3a5ewcdat478W+tXDoUiHwErX/dOql7ETcLqg==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.2.tgz",
+ "integrity": "sha512-tzhYJJidDUVGMgVyE+PmxENPHlvvqm1KILjjZhB8/xHYqAGeizh3GBGf9u6WdJpZrz1aCpIIHG0LgJgH9rVjHQ==",
"cpu": [
"s390x"
],
@@ -2304,9 +2300,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.3.tgz",
- "integrity": "sha512-F42IgZI4JicE2vM2PWCe0N5mR5vR0gIdORPqhGQ32/u1S1v3kLtbZ0C/mi9FFk7C5T0PgdeyWEPajPjaUpyoKg==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.2.tgz",
+ "integrity": "sha512-opH8GSUuVcCSSyHHcl5hELrmnk4waZoVpgn/4FDao9iyE4WpQhyWJ5ryl5M3ocp4qkRuHfyXnGqg8M9oKCEKRA==",
"cpu": [
"x64"
],
@@ -2318,9 +2314,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.3.tgz",
- "integrity": "sha512-oLc+JrwwvbimJUInzx56Q3ujL3Kkhxehg7O1gWAYzm8hImCd5ld1F2Gry5YDjR21MNb5WCKhC9hXgU7rRlyegQ==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.2.tgz",
+ "integrity": "sha512-LSeBHnGli1pPKVJ79ZVJgeZWWZXkEe/5o8kcn23M8eMKCUANejchJbF/JqzM4RRjOJfNRhKJk8FuqL1GKjF5oQ==",
"cpu": [
"x64"
],
@@ -2331,10 +2327,24 @@
"linux"
]
},
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.2.tgz",
+ "integrity": "sha512-uPj7MQ6/s+/GOpolavm6BPo+6CbhbKYyZHUDvZ/SmJM7pfDBgdGisFX3bY/CBDMg2ZO4utfhlApkSfZ92yXw7Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.3.tgz",
- "integrity": "sha512-lOrQ+BVRstruD1fkWg9yjmumhowR0oLAAzavB7yFSaGltY8klttmZtCLvOXCmGE9mLIn8IBV/IFrQOWz5xbFPg==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.2.tgz",
+ "integrity": "sha512-Z9MUCrSgIaUeeHAiNkm3cQyst2UhzjPraR3gYYfOjAuZI7tcFRTOD+4cHLPoS/3qinchth+V56vtqz1Tv+6KPA==",
"cpu": [
"arm64"
],
@@ -2346,9 +2356,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.3.tgz",
- "integrity": "sha512-vvrVKPRS4GduGR7VMH8EylCBqsDcw6U+/0nPDuIjXQRbHJc6xOBj+frx8ksfZAh6+Fptw5wHrN7etlMmQnPQVg==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.2.tgz",
+ "integrity": "sha512-+GnYBmpjldD3XQd+HMejo+0gJGwYIOfFeoBQv32xF/RUIvccUz20/V6Otdv+57NE70D5pa8W/jVGDoGq0oON4A==",
"cpu": [
"ia32"
],
@@ -2359,10 +2369,24 @@
"win32"
]
},
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.2.tgz",
+ "integrity": "sha512-ApXFKluSB6kDQkAqZOKXBjiaqdF1BlKi+/eqnYe9Ee7U2K3pUDKsIyr8EYm/QDHTJIM+4X+lI0gJc3TTRhd+dA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.3.tgz",
- "integrity": "sha512-fi3cPxCnu3ZeM3EwKZPgXbWoGzm2XHgB/WShKI81uj8wG0+laobmqy5wbgEwzstlbLu4MyO8C19FyhhWseYKNQ==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.2.tgz",
+ "integrity": "sha512-ARz+Bs8kY6FtitYM96PqPEVvPXqEZmPZsSkXvyX19YzDqkCaIlhCieLLMI5hxO9SRZ2XtCtm8wxhy0iJ2jxNfw==",
"cpu": [
"x64"
],
@@ -2374,11 +2398,12 @@
]
},
"node_modules/@sap/cds": {
- "version": "9.3.1",
- "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-9.3.1.tgz",
- "integrity": "sha512-xA9EN29X8HKaz83Aod1e3Bs6LRvqcCVoaTvCtyOup5rMYDQumcoZ7UOKH6NIUTeO0zOtafUiMHucMG+dBnq5XQ==",
+ "version": "9.4.2",
+ "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-9.4.2.tgz",
+ "integrity": "sha512-+MtNRviAgyZnPkSkT9sZ52rKRrNcTSpjIL88HfPtS5VzWX17Niu9PRANba/dd8aF4lxSQEEqb85zqJkga6MwKA==",
"dev": true,
"license": "SEE LICENSE IN LICENSE",
+ "peer": true,
"dependencies": {
"@sap/cds-compiler": "^6.1",
"@sap/cds-fiori": "^2",
@@ -2406,9 +2431,9 @@
}
},
"node_modules/@sap/cds-compiler": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/@sap/cds-compiler/-/cds-compiler-6.2.2.tgz",
- "integrity": "sha512-LqRNfBsWnEJpXVJ6/v52VqAdelWoETLbECMPcy7BfoHE63DGBpKA/ZIgoH11t7vUm7GYQDcSfR7ryy02Q/fP7A==",
+ "version": "6.3.6",
+ "resolved": "https://registry.npmjs.org/@sap/cds-compiler/-/cds-compiler-6.3.6.tgz",
+ "integrity": "sha512-4fiABVwuwUiZh0QpdQGor7e5Ld2SBOABvBHg8oqM2JsEtAcmnvTfStewETpgEBW63u8jRltcSEA6s59JH+qWwQ==",
"dev": true,
"license": "SEE LICENSE IN LICENSE",
"bin": {
@@ -2432,13 +2457,13 @@
}
},
"node_modules/@shikijs/core": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.10.0.tgz",
- "integrity": "sha512-iF1pDengps5BLXnZDF9yJIb3a7K5WfgeocH1U8u9UYM+UGU6lkl2PLD7/npxL+dOFrsxzp4KjafhHx+/sggplw==",
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-3.13.0.tgz",
+ "integrity": "sha512-3P8rGsg2Eh2qIHekwuQjzWhKI4jV97PhvYjYUzGqjvJfqdQPz+nMlfWahU24GZAyW1FxFI1sYjyhfh5CoLmIUA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@shikijs/types": "3.10.0",
+ "@shikijs/types": "3.13.0",
"@shikijs/vscode-textmate": "^10.0.2",
"@types/hast": "^3.0.4",
"hast-util-to-html": "^9.0.5"
@@ -2569,14 +2594,14 @@
}
},
"node_modules/@shikijs/twoslash": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-3.10.0.tgz",
- "integrity": "sha512-V8x4ULLKIjUSKh4/lnYy1XMgsW/0q8QtvTfS4i0YUe9oMXQ5q2HSWqd3yeIpF7tfuoBpeopXQC8mScZjbPGgjw==",
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/twoslash/-/twoslash-3.13.0.tgz",
+ "integrity": "sha512-OmNKNoZ8Hevt4VKQHfJL+hrsrqLSnW/Nz7RMutuBqXBCIYZWk80HnF9pcXEwRmy9MN0MGRmZCW2rDDP8K7Bxkw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@shikijs/core": "3.10.0",
- "@shikijs/types": "3.10.0",
+ "@shikijs/core": "3.13.0",
+ "@shikijs/types": "3.13.0",
"twoslash": "^0.3.4"
},
"peerDependencies": {
@@ -2605,9 +2630,9 @@
"license": "MIT"
},
"node_modules/@shikijs/types": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.10.0.tgz",
- "integrity": "sha512-PAeyajDDhdzefMiSZn7ENCwVaACMnO53+p5pSrJpIQOJTSX+4Qn28Y5e7I6v9wkJNyepRFfbZmzmbbnzjxBMEA==",
+ "version": "3.13.0",
+ "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-3.13.0.tgz",
+ "integrity": "sha512-oM9P+NCFri/mmQ8LoFGVfVyemm5Hi27330zuOBp0annwJdKH1kOLndw3zCtAVDehPLg9fKqoEx3Ht/wNZxolfw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2694,6 +2719,7 @@
"integrity": "sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/body-parser": "*",
"@types/express-serve-static-core": "^4.17.33",
@@ -2795,13 +2821,13 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "24.3.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz",
- "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==",
+ "version": "24.5.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.5.2.tgz",
+ "integrity": "sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "undici-types": "~7.10.0"
+ "undici-types": "~7.12.0"
}
},
"node_modules/@types/qs": {
@@ -2856,16 +2882,17 @@
"license": "MIT"
},
"node_modules/@typescript-eslint/parser": {
- "version": "8.44.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.44.0.tgz",
- "integrity": "sha512-VGMpFQGUQWYT9LfnPcX8ouFojyrZ/2w3K5BucvxL/spdNehccKhB4jUyB1yBCXpr2XFm0jkECxgrpXBW2ipoAw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+ "integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
- "@typescript-eslint/scope-manager": "8.44.0",
- "@typescript-eslint/types": "8.44.0",
- "@typescript-eslint/typescript-estree": "8.44.0",
- "@typescript-eslint/visitor-keys": "8.44.0",
+ "@typescript-eslint/scope-manager": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/typescript-estree": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4"
},
"engines": {
@@ -2881,14 +2908,14 @@
}
},
"node_modules/@typescript-eslint/project-service": {
- "version": "8.44.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.44.0.tgz",
- "integrity": "sha512-ZeaGNraRsq10GuEohKTo4295Z/SuGcSq2LzfGlqiuEvfArzo/VRrT0ZaJsVPuKZ55lVbNk8U6FcL+ZMH8CoyVA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+ "integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.44.0",
- "@typescript-eslint/types": "^8.44.0",
+ "@typescript-eslint/tsconfig-utils": "^8.46.0",
+ "@typescript-eslint/types": "^8.46.0",
"debug": "^4.3.4"
},
"engines": {
@@ -2903,14 +2930,14 @@
}
},
"node_modules/@typescript-eslint/scope-manager": {
- "version": "8.44.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.44.0.tgz",
- "integrity": "sha512-87Jv3E+al8wpD+rIdVJm/ItDBe/Im09zXIjFoipOjr5gHUhJmTzfFLuTJ/nPTMc2Srsroy4IBXwcTCHyRR7KzA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+ "integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.44.0",
- "@typescript-eslint/visitor-keys": "8.44.0"
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2921,9 +2948,9 @@
}
},
"node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.44.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.44.0.tgz",
- "integrity": "sha512-x5Y0+AuEPqAInc6yd0n5DAcvtoQ/vyaGwuX5HE9n6qAefk1GaedqrLQF8kQGylLUb9pnZyLf+iEiL9fr8APDtQ==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+ "integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2938,9 +2965,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.44.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.44.0.tgz",
- "integrity": "sha512-ZSl2efn44VsYM0MfDQe68RKzBz75NPgLQXuGypmym6QVOWL5kegTZuZ02xRAT9T+onqvM6T8CdQk0OwYMB6ZvA==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+ "integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2952,16 +2979,16 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.44.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.44.0.tgz",
- "integrity": "sha512-lqNj6SgnGcQZwL4/SBJ3xdPEfcBuhCG8zdcwCPgYcmiPLgokiNDKlbPzCwEwu7m279J/lBYWtDYL+87OEfn8Jw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+ "integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/project-service": "8.44.0",
- "@typescript-eslint/tsconfig-utils": "8.44.0",
- "@typescript-eslint/types": "8.44.0",
- "@typescript-eslint/visitor-keys": "8.44.0",
+ "@typescript-eslint/project-service": "8.46.0",
+ "@typescript-eslint/tsconfig-utils": "8.46.0",
+ "@typescript-eslint/types": "8.46.0",
+ "@typescript-eslint/visitor-keys": "8.46.0",
"debug": "^4.3.4",
"fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
@@ -2981,13 +3008,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.44.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.44.0.tgz",
- "integrity": "sha512-zaz9u8EJ4GBmnehlrpoKvj/E3dNbuQ7q0ucyZImm3cLqJ8INTc970B1qEqDX/Rzq65r3TvVTN7kHWPBoyW7DWw==",
+ "version": "8.46.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+ "integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.44.0",
+ "@typescript-eslint/types": "8.46.0",
"eslint-visitor-keys": "^4.2.1"
},
"engines": {
@@ -3050,57 +3077,57 @@
"license": "MIT"
},
"node_modules/@vue/compiler-core": {
- "version": "3.5.18",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.18.tgz",
- "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==",
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.22.tgz",
+ "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.0",
- "@vue/shared": "3.5.18",
+ "@babel/parser": "^7.28.4",
+ "@vue/shared": "3.5.22",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-dom": {
- "version": "3.5.18",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz",
- "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==",
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz",
+ "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/compiler-core": "3.5.18",
- "@vue/shared": "3.5.18"
+ "@vue/compiler-core": "3.5.22",
+ "@vue/shared": "3.5.22"
}
},
"node_modules/@vue/compiler-sfc": {
- "version": "3.5.18",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz",
- "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==",
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz",
+ "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.28.0",
- "@vue/compiler-core": "3.5.18",
- "@vue/compiler-dom": "3.5.18",
- "@vue/compiler-ssr": "3.5.18",
- "@vue/shared": "3.5.18",
+ "@babel/parser": "^7.28.4",
+ "@vue/compiler-core": "3.5.22",
+ "@vue/compiler-dom": "3.5.22",
+ "@vue/compiler-ssr": "3.5.22",
+ "@vue/shared": "3.5.22",
"estree-walker": "^2.0.2",
- "magic-string": "^0.30.17",
+ "magic-string": "^0.30.19",
"postcss": "^8.5.6",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-ssr": {
- "version": "3.5.18",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz",
- "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==",
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz",
+ "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.18",
- "@vue/shared": "3.5.18"
+ "@vue/compiler-dom": "3.5.22",
+ "@vue/shared": "3.5.22"
}
},
"node_modules/@vue/compiler-vue2": {
@@ -3176,57 +3203,57 @@
}
},
"node_modules/@vue/reactivity": {
- "version": "3.5.18",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.18.tgz",
- "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==",
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.22.tgz",
+ "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/shared": "3.5.18"
+ "@vue/shared": "3.5.22"
}
},
"node_modules/@vue/runtime-core": {
- "version": "3.5.18",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.18.tgz",
- "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==",
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.22.tgz",
+ "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.18",
- "@vue/shared": "3.5.18"
+ "@vue/reactivity": "3.5.22",
+ "@vue/shared": "3.5.22"
}
},
"node_modules/@vue/runtime-dom": {
- "version": "3.5.18",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz",
- "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==",
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz",
+ "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.18",
- "@vue/runtime-core": "3.5.18",
- "@vue/shared": "3.5.18",
+ "@vue/reactivity": "3.5.22",
+ "@vue/runtime-core": "3.5.22",
+ "@vue/shared": "3.5.22",
"csstype": "^3.1.3"
}
},
"node_modules/@vue/server-renderer": {
- "version": "3.5.18",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.18.tgz",
- "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==",
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.22.tgz",
+ "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vue/compiler-ssr": "3.5.18",
- "@vue/shared": "3.5.18"
+ "@vue/compiler-ssr": "3.5.22",
+ "@vue/shared": "3.5.22"
},
"peerDependencies": {
- "vue": "3.5.18"
+ "vue": "3.5.22"
}
},
"node_modules/@vue/shared": {
- "version": "3.5.18",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.18.tgz",
- "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==",
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.22.tgz",
+ "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w==",
"dev": true,
"license": "MIT"
},
@@ -3342,7 +3369,6 @@
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
@@ -3357,6 +3383,7 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -3402,26 +3429,27 @@
}
},
"node_modules/algoliasearch": {
- "version": "5.35.0",
- "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz",
- "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==",
+ "version": "5.38.0",
+ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.38.0.tgz",
+ "integrity": "sha512-8VJKIzheeI9cjuVJhU1hYEVetOTe7LvA+CujAI7yqvYsPtZfVEvv1pg9AeFNtHBg/ZoSLGU5LPijhcY5l3Ea9g==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
- "@algolia/abtesting": "1.1.0",
- "@algolia/client-abtesting": "5.35.0",
- "@algolia/client-analytics": "5.35.0",
- "@algolia/client-common": "5.35.0",
- "@algolia/client-insights": "5.35.0",
- "@algolia/client-personalization": "5.35.0",
- "@algolia/client-query-suggestions": "5.35.0",
- "@algolia/client-search": "5.35.0",
- "@algolia/ingestion": "1.35.0",
- "@algolia/monitoring": "1.35.0",
- "@algolia/recommend": "5.35.0",
- "@algolia/requester-browser-xhr": "5.35.0",
- "@algolia/requester-fetch": "5.35.0",
- "@algolia/requester-node-http": "5.35.0"
+ "@algolia/abtesting": "1.4.0",
+ "@algolia/client-abtesting": "5.38.0",
+ "@algolia/client-analytics": "5.38.0",
+ "@algolia/client-common": "5.38.0",
+ "@algolia/client-insights": "5.38.0",
+ "@algolia/client-personalization": "5.38.0",
+ "@algolia/client-query-suggestions": "5.38.0",
+ "@algolia/client-search": "5.38.0",
+ "@algolia/ingestion": "1.38.0",
+ "@algolia/monitoring": "1.38.0",
+ "@algolia/recommend": "5.38.0",
+ "@algolia/requester-browser-xhr": "5.38.0",
+ "@algolia/requester-fetch": "5.38.0",
+ "@algolia/requester-node-http": "5.38.0"
},
"engines": {
"node": ">= 14.0.0"
@@ -3435,9 +3463,9 @@
"license": "MIT"
},
"node_modules/ansi-regex": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz",
- "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==",
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3448,9 +3476,9 @@
}
},
"node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3472,8 +3500,7 @@
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/array-timsort": {
"version": "1.0.3",
@@ -3490,9 +3517,9 @@
"license": "MIT"
},
"node_modules/birpc": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz",
- "integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.6.1.tgz",
+ "integrity": "sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==",
"dev": true,
"license": "MIT",
"funding": {
@@ -3505,7 +3532,6 @@
"integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"bytes": "3.1.2",
"content-type": "~1.0.5",
@@ -3531,7 +3557,6 @@
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -3541,8 +3566,7 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/boolbase": {
"version": "1.0.0",
@@ -3580,7 +3604,6 @@
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.8"
}
@@ -3591,7 +3614,6 @@
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
@@ -3606,7 +3628,6 @@
"integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"get-intrinsic": "^1.3.0"
@@ -3640,9 +3661,9 @@
}
},
"node_modules/chalk": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.0.tgz",
- "integrity": "sha512-46QrSQFyVSEyYAgQ22hQ+zDa60YHA4fBstHmtSApj1Y5vKtG27fWowW03jCk5KcbXEWPZUIR894aARCA/G1kfQ==",
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3653,9 +3674,9 @@
}
},
"node_modules/chalk-template": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.0.tgz",
- "integrity": "sha512-T2VJbcDuZQ0Tb2EWwSotMPJjgpy1/tGee1BTpUNsGZ/qgNjV2t7Mvu+d4600U564nbLesN1x2dPL+xii174Ekg==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-1.1.2.tgz",
+ "integrity": "sha512-2bxTP2yUH7AJj/VAXfcA+4IcWGdQ87HwBANLt5XxGTeomo8yG0y95N1um9i5StvhT/Bl0/2cARA5v1PpPXUxUA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3777,9 +3798,9 @@
}
},
"node_modules/commander": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz",
- "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==",
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.1.tgz",
+ "integrity": "sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3816,7 +3837,6 @@
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"safe-buffer": "5.2.1"
},
@@ -3830,7 +3850,6 @@
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -3841,7 +3860,6 @@
"integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -3851,8 +3869,7 @@
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/copy-anything": {
"version": "3.0.5",
@@ -4103,9 +4120,9 @@
"license": "MIT"
},
"node_modules/debug": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz",
- "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4157,7 +4174,6 @@
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.8"
}
@@ -4178,7 +4194,6 @@
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
@@ -4218,7 +4233,6 @@
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
@@ -4240,8 +4254,7 @@
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/emoji-regex": {
"version": "9.2.2",
@@ -4263,7 +4276,6 @@
"integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.8"
}
@@ -4300,7 +4312,6 @@
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.4"
}
@@ -4311,7 +4322,6 @@
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.4"
}
@@ -4322,7 +4332,6 @@
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"es-errors": "^1.3.0"
},
@@ -4374,8 +4383,7 @@
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/escape-string-regexp": {
"version": "4.0.0",
@@ -4391,20 +4399,21 @@
}
},
"node_modules/eslint": {
- "version": "9.35.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.35.0.tgz",
- "integrity": "sha512-QePbBFMJFjgmlE+cXAlbHZbHpdFVS2E/6vzCy7aKlebddvl1vadiC4JFV5u/wqTkNUwEV8WrQi257jf5f06hrg==",
+ "version": "9.37.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz",
+ "integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.21.0",
- "@eslint/config-helpers": "^0.3.1",
- "@eslint/core": "^0.15.2",
+ "@eslint/config-helpers": "^0.4.0",
+ "@eslint/core": "^0.16.0",
"@eslint/eslintrc": "^3.3.1",
- "@eslint/js": "9.35.0",
- "@eslint/plugin-kit": "^0.3.5",
+ "@eslint/js": "9.37.0",
+ "@eslint/plugin-kit": "^0.4.0",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
@@ -4452,42 +4461,35 @@
}
},
"node_modules/eslint-plugin-vue": {
- "version": "9.33.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz",
- "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==",
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.5.0.tgz",
+ "integrity": "sha512-7BZHsG3kC2vei8F2W8hnfDi9RK+cv5eKPMvzBdrl8Vuc0hR5odGQRli8VVzUkrmUHkxFEm4Iio1r5HOKslO0Aw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.4.0",
- "globals": "^13.24.0",
"natural-compare": "^1.4.0",
"nth-check": "^2.1.1",
"postcss-selector-parser": "^6.0.15",
"semver": "^7.6.3",
- "vue-eslint-parser": "^9.4.3",
"xml-name-validator": "^4.0.0"
},
"engines": {
- "node": "^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"peerDependencies": {
- "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
- }
- },
- "node_modules/eslint-plugin-vue/node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
+ "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0",
+ "@typescript-eslint/parser": "^7.0.0 || ^8.0.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "vue-eslint-parser": "^10.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependenciesMeta": {
+ "@stylistic/eslint-plugin": {
+ "optional": true
+ },
+ "@typescript-eslint/parser": {
+ "optional": true
+ }
}
},
"node_modules/eslint-scope": {
@@ -4668,7 +4670,6 @@
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -4679,7 +4680,6 @@
"integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
@@ -4727,7 +4727,6 @@
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -4737,8 +4736,7 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/extend-shallow": {
"version": "2.0.1",
@@ -4761,9 +4759,9 @@
"license": "MIT"
},
"node_modules/fast-equals": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz",
- "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==",
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.3.0.tgz",
+ "integrity": "sha512-xwP+dG/in/nJelMOUEQBiIYeOoHKihWPB2sNZ8ZeDbZFoGb1OwTGMggGRgg6CRitNx7kmHgtIz2dOHDQ8Ap7Bw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -4881,7 +4879,6 @@
"integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~2.0.0",
@@ -4901,7 +4898,6 @@
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -4911,8 +4907,7 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/find-up": {
"version": "5.0.0",
@@ -4978,6 +4973,7 @@
"integrity": "sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"tabbable": "^6.2.0"
}
@@ -5005,7 +5001,6 @@
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -5016,7 +5011,6 @@
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -5042,7 +5036,6 @@
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"license": "MIT",
- "peer": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -5063,7 +5056,6 @@
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
@@ -5089,7 +5081,6 @@
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
@@ -5186,7 +5177,6 @@
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.4"
},
@@ -5260,7 +5250,6 @@
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.4"
},
@@ -5274,7 +5263,6 @@
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"function-bind": "^1.1.2"
},
@@ -5354,7 +5342,6 @@
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
@@ -5372,7 +5359,6 @@
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
@@ -5463,8 +5449,7 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true,
- "license": "ISC",
- "peer": true
+ "license": "ISC"
},
"node_modules/ini": {
"version": "4.1.1",
@@ -5482,7 +5467,6 @@
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.10"
}
@@ -5762,13 +5746,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -5788,9 +5765,9 @@
}
},
"node_modules/lru-cache": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz",
- "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==",
+ "version": "11.2.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.2.tgz",
+ "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==",
"dev": true,
"license": "ISC",
"engines": {
@@ -5798,13 +5775,13 @@
}
},
"node_modules/magic-string": {
- "version": "0.30.17",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
- "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
+ "version": "0.30.19",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.19.tgz",
+ "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0"
+ "@jridgewell/sourcemap-codec": "^1.5.5"
}
},
"node_modules/mark.js": {
@@ -5983,7 +5960,6 @@
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.4"
}
@@ -6236,7 +6212,6 @@
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -6247,7 +6222,6 @@
"integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
@@ -6268,7 +6242,6 @@
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -6865,7 +6838,6 @@
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"dev": true,
"license": "MIT",
- "peer": true,
"bin": {
"mime": "cli.js"
},
@@ -6879,7 +6851,6 @@
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -6890,7 +6861,6 @@
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"mime-db": "1.52.0"
},
@@ -6935,9 +6905,9 @@
}
},
"node_modules/minisearch": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.1.2.tgz",
- "integrity": "sha512-R1Pd9eF+MD5JYDDSPAp/q1ougKglm14uEkPMvQ/05RGmx6G9wvmLTrTI/Q5iPNJLYqNdsDQ7qTGIcNWR+FrHmA==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-7.2.0.tgz",
+ "integrity": "sha512-dqT2XBYUOZOiC5t2HRnwADjhNS2cecp9u+TJRiJ1Qp/f5qjkeT5APcGPjHw+bz89Ms8Jp+cG4AlE+QZ/QnDglg==",
"dev": true,
"license": "MIT"
},
@@ -6994,7 +6964,6 @@
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -7026,7 +6995,6 @@
"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.4"
},
@@ -7040,7 +7008,6 @@
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"ee-first": "1.1.1"
},
@@ -7163,7 +7130,6 @@
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.8"
}
@@ -7217,8 +7183,7 @@
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
"integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/perfect-debounce": {
"version": "1.0.0",
@@ -7291,9 +7256,9 @@
}
},
"node_modules/preact": {
- "version": "10.27.1",
- "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.1.tgz",
- "integrity": "sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==",
+ "version": "10.27.2",
+ "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz",
+ "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==",
"dev": true,
"license": "MIT",
"funding": {
@@ -7328,7 +7293,6 @@
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
@@ -7363,7 +7327,6 @@
"integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true,
"license": "BSD-3-Clause",
- "peer": true,
"dependencies": {
"side-channel": "^1.0.6"
},
@@ -7401,7 +7364,6 @@
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -7412,7 +7374,6 @@
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
@@ -7503,9 +7464,9 @@
"license": "MIT"
},
"node_modules/rollup": {
- "version": "4.46.3",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.46.3.tgz",
- "integrity": "sha512-RZn2XTjXb8t5g13f5YclGoilU/kwT696DIkY3sywjdZidNSi3+vseaQov7D7BZXVJCPv3pDWUN69C78GGbXsKw==",
+ "version": "4.52.2",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.2.tgz",
+ "integrity": "sha512-I25/2QgoROE1vYV+NQ1En9T9UFB9Cmfm2CJ83zZOlaDpvz29wGQSZXWKw7MiNXau7wYgB/T9fVIdIuEQ+KbiiA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7519,26 +7480,28 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.46.3",
- "@rollup/rollup-android-arm64": "4.46.3",
- "@rollup/rollup-darwin-arm64": "4.46.3",
- "@rollup/rollup-darwin-x64": "4.46.3",
- "@rollup/rollup-freebsd-arm64": "4.46.3",
- "@rollup/rollup-freebsd-x64": "4.46.3",
- "@rollup/rollup-linux-arm-gnueabihf": "4.46.3",
- "@rollup/rollup-linux-arm-musleabihf": "4.46.3",
- "@rollup/rollup-linux-arm64-gnu": "4.46.3",
- "@rollup/rollup-linux-arm64-musl": "4.46.3",
- "@rollup/rollup-linux-loongarch64-gnu": "4.46.3",
- "@rollup/rollup-linux-ppc64-gnu": "4.46.3",
- "@rollup/rollup-linux-riscv64-gnu": "4.46.3",
- "@rollup/rollup-linux-riscv64-musl": "4.46.3",
- "@rollup/rollup-linux-s390x-gnu": "4.46.3",
- "@rollup/rollup-linux-x64-gnu": "4.46.3",
- "@rollup/rollup-linux-x64-musl": "4.46.3",
- "@rollup/rollup-win32-arm64-msvc": "4.46.3",
- "@rollup/rollup-win32-ia32-msvc": "4.46.3",
- "@rollup/rollup-win32-x64-msvc": "4.46.3",
+ "@rollup/rollup-android-arm-eabi": "4.52.2",
+ "@rollup/rollup-android-arm64": "4.52.2",
+ "@rollup/rollup-darwin-arm64": "4.52.2",
+ "@rollup/rollup-darwin-x64": "4.52.2",
+ "@rollup/rollup-freebsd-arm64": "4.52.2",
+ "@rollup/rollup-freebsd-x64": "4.52.2",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.52.2",
+ "@rollup/rollup-linux-arm-musleabihf": "4.52.2",
+ "@rollup/rollup-linux-arm64-gnu": "4.52.2",
+ "@rollup/rollup-linux-arm64-musl": "4.52.2",
+ "@rollup/rollup-linux-loong64-gnu": "4.52.2",
+ "@rollup/rollup-linux-ppc64-gnu": "4.52.2",
+ "@rollup/rollup-linux-riscv64-gnu": "4.52.2",
+ "@rollup/rollup-linux-riscv64-musl": "4.52.2",
+ "@rollup/rollup-linux-s390x-gnu": "4.52.2",
+ "@rollup/rollup-linux-x64-gnu": "4.52.2",
+ "@rollup/rollup-linux-x64-musl": "4.52.2",
+ "@rollup/rollup-openharmony-arm64": "4.52.2",
+ "@rollup/rollup-win32-arm64-msvc": "4.52.2",
+ "@rollup/rollup-win32-ia32-msvc": "4.52.2",
+ "@rollup/rollup-win32-x64-gnu": "4.52.2",
+ "@rollup/rollup-win32-x64-msvc": "4.52.2",
"fsevents": "~2.3.2"
}
},
@@ -7601,23 +7564,22 @@
"url": "https://feross.org/support"
}
],
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/sass": {
- "version": "1.92.1",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz",
- "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==",
+ "version": "1.93.2",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.93.2.tgz",
+ "integrity": "sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"chokidar": "^4.0.0",
"immutable": "^5.0.2",
@@ -7674,7 +7636,6 @@
"integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"debug": "2.6.9",
"depd": "2.0.0",
@@ -7700,7 +7661,6 @@
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -7710,8 +7670,7 @@
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true,
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/send/node_modules/encodeurl": {
"version": "1.0.2",
@@ -7719,7 +7678,6 @@
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.8"
}
@@ -7730,7 +7688,6 @@
"integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
@@ -7746,8 +7703,7 @@
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
"integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
"dev": true,
- "license": "ISC",
- "peer": true
+ "license": "ISC"
},
"node_modules/shebang-command": {
"version": "2.0.0",
@@ -7821,7 +7777,6 @@
"integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"es-errors": "^1.3.0",
"object-inspect": "^1.13.3",
@@ -7842,7 +7797,6 @@
"integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"es-errors": "^1.3.0",
"object-inspect": "^1.13.3"
@@ -7860,7 +7814,6 @@
"integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
@@ -7880,7 +7833,6 @@
"integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"call-bound": "^1.0.2",
"es-errors": "^1.3.0",
@@ -7965,7 +7917,6 @@
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.8"
}
@@ -8050,9 +8001,9 @@
}
},
"node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -8146,14 +8097,14 @@
"license": "MIT"
},
"node_modules/tinyglobby": {
- "version": "0.2.14",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
- "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "fdir": "^6.4.4",
- "picomatch": "^4.0.2"
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
},
"engines": {
"node": ">=12.0.0"
@@ -8181,7 +8132,6 @@
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=0.6"
}
@@ -8262,26 +8212,12 @@
"node": ">= 0.8.0"
}
},
- "node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
@@ -8313,9 +8249,9 @@
"license": "MIT"
},
"node_modules/undici-types": {
- "version": "7.10.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz",
- "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==",
+ "version": "7.12.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.12.0.tgz",
+ "integrity": "sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==",
"dev": true,
"license": "MIT"
},
@@ -8398,7 +8334,6 @@
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.8"
}
@@ -8426,7 +8361,6 @@
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.4.0"
}
@@ -8437,7 +8371,6 @@
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">= 0.8"
}
@@ -8473,11 +8406,12 @@
}
},
"node_modules/vite": {
- "version": "5.4.19",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz",
- "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==",
+ "version": "5.4.20",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.20.tgz",
+ "integrity": "sha512-j3lYzGC3P+B5Yfy/pfKNgVEg4+UtcIJcVRt2cDjIOmhLourAqPqf8P7acgxeiSgUB7E3p2P8/3gNIgDLpwzs4g==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
"esbuild": "^0.21.3",
"postcss": "^8.4.43",
@@ -8615,17 +8549,18 @@
"license": "MIT"
},
"node_modules/vue": {
- "version": "3.5.18",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.18.tgz",
- "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==",
+ "version": "3.5.22",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.22.tgz",
+ "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
- "@vue/compiler-dom": "3.5.18",
- "@vue/compiler-sfc": "3.5.18",
- "@vue/runtime-dom": "3.5.18",
- "@vue/server-renderer": "3.5.18",
- "@vue/shared": "3.5.18"
+ "@vue/compiler-dom": "3.5.22",
+ "@vue/compiler-sfc": "3.5.22",
+ "@vue/runtime-dom": "3.5.22",
+ "@vue/server-renderer": "3.5.22",
+ "@vue/shared": "3.5.22"
},
"peerDependencies": {
"typescript": "*"
@@ -8637,76 +8572,28 @@
}
},
"node_modules/vue-eslint-parser": {
- "version": "9.4.3",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
- "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz",
+ "integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==",
"dev": true,
"license": "MIT",
+ "peer": true,
"dependencies": {
- "debug": "^4.3.4",
- "eslint-scope": "^7.1.1",
- "eslint-visitor-keys": "^3.3.0",
- "espree": "^9.3.1",
- "esquery": "^1.4.0",
- "lodash": "^4.17.21",
- "semver": "^7.3.6"
+ "debug": "^4.4.0",
+ "eslint-scope": "^8.2.0",
+ "eslint-visitor-keys": "^4.2.0",
+ "espree": "^10.3.0",
+ "esquery": "^1.6.0",
+ "semver": "^7.6.3"
},
"engines": {
- "node": "^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://github.com/sponsors/mysticatea"
},
"peerDependencies": {
- "eslint": ">=6.0.0"
- }
- },
- "node_modules/vue-eslint-parser/node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/vue-eslint-parser/node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "eslint": "^8.57.0 || ^9.0.0"
}
},
"node_modules/vue-resize": {
diff --git a/package.json b/package.json
index ae15ebaf82..74ade9ad7b 100644
--- a/package.json
+++ b/package.json
@@ -27,7 +27,7 @@
"adm-zip": "^0.5.10",
"cspell": "^9.0.0",
"eslint": "^9.0.0",
- "eslint-plugin-vue": "^9.11.0",
+ "eslint-plugin-vue": "^10.0.0",
"fflate": "^0.8.2",
"gray-matter": "^4.0.3",
"markdownlint-cli": ">=0.35.0",
diff --git a/plugins/index.md b/plugins/index.md
index 887cadbb6d..d5eb5a76c9 100644
--- a/plugins/index.md
+++ b/plugins/index.md
@@ -392,7 +392,7 @@ Available for:
[{style="height:3em; display:inline; margin:0 0.2em;"}](https://github.com/cap-java/cds-feature-event-hub#readme)
-## SAP Integration Suite, Advanced Event Mesh {#advanced-event-mesh}
+## SAP Integration Suite, Advanced Event Mesh {#advanced-event-mesh}
[SAP Integration Suite, advanced event mesh](https://www.sap.com/products/technology-platform/integration-suite/advanced-event-mesh.html) allows you to, amongst others, integrate non-SAP systems into your event-driven architecture.
diff --git a/tools/assets/help/cds-typer.out.md b/tools/assets/help/cds-typer.out.md
index 594fcf474f..319d059c51 100644
--- a/tools/assets/help/cds-typer.out.md
+++ b/tools/assets/help/cds-typer.out.md
@@ -75,6 +75,12 @@ OPTIONS
Root directory to write the generated files to.
+ --outputDTsFiles
+ --output_d_ts_files: <true | false>
+ (default: false)
+
+ (experimental) If set to true, emits .d.ts files for each generated .js file. If set to false (default), emits .ts files instead. Note: skipLibCheck must be set to true in your tsconfig for this option to work properly.
+
--propertiesOptional
--properties_optional: <true | false>
(default: true)
diff --git a/tools/assets/help/cds-version-md.out.md b/tools/assets/help/cds-version-md.out.md
index b90494755b..7e55547b30 100644
--- a/tools/assets/help/cds-version-md.out.md
+++ b/tools/assets/help/cds-version-md.out.md
@@ -6,13 +6,13 @@
| ---------------------- | --------------------------------------- |
| @sap/cds | 9.3.1 |
| @sap/cds-dk | -- missing -- |
-| @sap/cds-compiler | 6.3.4 |
+| @sap/cds-compiler | 6.3.6 |
| @sap/cds-dk (global) | 9.3.2 |
| @sap/cds-fiori | 2.0.1 |
| @sap/cds-mtxs | 3.3.1 |
| @cap-js/asyncapi | 1.0.3 |
-| @cap-js/db-service | 2.4.0 |
+| @cap-js/db-service | 2.5.1 |
| @cap-js/openapi | 1.2.3 |
-| @cap-js/sqlite | 2.0.2 |
-| Node.js | v22.19.0 |
+| @cap-js/sqlite | 2.0.3 |
+| Node.js | v22.20.0 |
diff --git a/tools/assets/help/cds-version.out.md b/tools/assets/help/cds-version.out.md
index c5140e813e..4672eb584b 100644
--- a/tools/assets/help/cds-version.out.md
+++ b/tools/assets/help/cds-version.out.md
@@ -4,13 +4,13 @@
@sap/cds: 9.3.1
@sap/cds-dk: undefined
-@sap/cds-compiler: 6.3.4
+@sap/cds-compiler: 6.3.6
@sap/cds-dk (global): 9.3.2
@sap/cds-fiori: 2.0.1
@sap/cds-mtxs: 3.3.1
@cap-js/asyncapi: 1.0.3
-@cap-js/db-service: 2.4.0
+@cap-js/db-service: 2.5.1
@cap-js/openapi: 1.2.3
-@cap-js/sqlite: 2.0.2
-Node.js: v22.19.0
+@cap-js/sqlite: 2.0.3
+Node.js: v22.20.0
diff --git a/tools/cds-lint/components/PlaygroundBadge.vue b/tools/cds-lint/components/PlaygroundBadge.vue
index 2ccee52a95..d0ea56b639 100644
--- a/tools/cds-lint/components/PlaygroundBadge.vue
+++ b/tools/cds-lint/components/PlaygroundBadge.vue
@@ -11,7 +11,7 @@ interface Props {
withDefaults(defineProps(), { nolink: false })
import { compress, prettyStringify } from './eslint-online-playground/utils';
// @ts-ignore
-import { data } from '../examples/examples.data.ts';
+import { data } from '../rules/examples.data.ts';
const configFileName = "eslint.config.js";
const packageJsonFileName = "package.json";
@@ -29,7 +29,7 @@ export default [
const defaultPackageJson = JSON.parse(data['package.json']);
-const is_object = x => typeof x === 'object' && x !== null && !Array.isArray(x)
+const is_object = (x:any) => typeof x === 'object' && x !== null && !Array.isArray(x)
function merge (o:any,...xs:any) {
let v:any; for (let x of xs) for (let k in x)
if (k === '__proto__' || k === 'constructor') continue //> avoid prototype pollution
diff --git a/tools/cds-lint/examples/no-deep-sap-cds-import/incorrect/srv/admin-service.js b/tools/cds-lint/examples/no-deep-sap-cds-import/incorrect/srv/admin-service.js
deleted file mode 100644
index 13658befaf..0000000000
--- a/tools/cds-lint/examples/no-deep-sap-cds-import/incorrect/srv/admin-service.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const cdsService = require('@sap/cds/service') // [!code error]
-
-module.exports = class AdminService extends cdsService.ApplicationService {
- // …
-}
\ No newline at end of file
diff --git a/tools/cds-lint/examples/no-shared-handler-variable/correct/srv/admin-service.js b/tools/cds-lint/examples/no-shared-handler-variable/correct/srv/admin-service.js
deleted file mode 100644
index 9fed76fc34..0000000000
--- a/tools/cds-lint/examples/no-shared-handler-variable/correct/srv/admin-service.js
+++ /dev/null
@@ -1,21 +0,0 @@
-const cds = require('@sap/cds')
-
-module.exports = class AdminService extends cds.ApplicationService { async init() {
- this.after('READ', 'Books', async () => {
- // local variable only, no state shared between handlers
- const books = await cds.run(SELECT.from('Books')) // [!code highlight]
- return books
- })
-
- this.on('CREATE', 'Books', newBookHandler)
- await super.init()
- }
-}
-
-/** @type {import('@sap/cds').CRUDEventHandler.On} */
-async function newBookHandler (req) {
- const { name } = req.data
- // local variable only, no state shared between handlers
- const newBook = await cds.run(INSERT.into('Books').entries({ name })) // [!code highlight]
- return newBook
-}
\ No newline at end of file
diff --git a/tools/cds-lint/examples/no-shared-handler-variable/incorrect/srv/admin-service.js b/tools/cds-lint/examples/no-shared-handler-variable/incorrect/srv/admin-service.js
deleted file mode 100644
index 827ab536ff..0000000000
--- a/tools/cds-lint/examples/no-shared-handler-variable/incorrect/srv/admin-service.js
+++ /dev/null
@@ -1,24 +0,0 @@
-const cds = require('@sap/cds')
-
-let lastCreatedBook
-let lastReadBooks
-
-module.exports = class AdminService extends cds.ApplicationService { async init() {
- this.after('READ', 'Books', async () => {
- // variable from surrounding scope, state is shared between handler calls
- lastReadBooks = await cds.run(SELECT.from('Books')) // [!code error]
- return lastReadBooks
- })
-
- this.on('CREATE', 'Books', newBookHandler)
- await super.init()
- }
-}
-
-/** @type {import('@sap/cds').CRUDEventHandler.On} */
-async function newBookHandler (req) {
- const { name } = req.data
- // variable from surrounding scope, state is shared between handler calls
- lastCreatedBook = await cds.run(INSERT.into('Books').entries({ name })) // [!code error]
- return lastCreatedBook
-}
\ No newline at end of file
diff --git a/tools/cds-lint/index.md b/tools/cds-lint/index.md
index cdec3e8b24..412085fc6c 100644
--- a/tools/cds-lint/index.md
+++ b/tools/cds-lint/index.md
@@ -58,7 +58,7 @@ To turn on lint checking in your VS Code Editor simply download the [ESLint exte
CDS Lint seamlessly integrates with it. For _SAP Business Application Studio_ this comes preinstalled.
Now you can see lint reports also in your editor. You can see all rules [marked as **Editor default** here](./rules/). Any other (project-based) rules are not turned on by
-default but can be turned on via the `show` rule option. For example, if we want to show the [`valid-csv-header`](./rules/valid-csv-header) rule reports in the Editor, we would add the following to our ESLint
+default but can be turned on via the `show` rule option. For example, if we want to show the [`valid-csv-header`](./rules/valid-csv-header/) rule reports in the Editor, we would add the following to our ESLint
`rules` configuration:
```json
diff --git a/tools/cds-lint/rules/_menu.md b/tools/cds-lint/rules/_menu.md
index e38c79a4aa..7bc1a347f9 100644
--- a/tools/cds-lint/rules/_menu.md
+++ b/tools/cds-lint/rules/_menu.md
@@ -1,24 +1,24 @@
-# [assoc2many-ambiguous-key](assoc2many-ambiguous-key)
-# [auth-no-empty-restrictions](auth-no-empty-restrictions)
-# [auth-restrict-grant-service](auth-restrict-grant-service)
-# [auth-use-requires](auth-use-requires)
-# [auth-valid-restrict-grant](auth-valid-restrict-grant)
-# [auth-valid-restrict-keys](auth-valid-restrict-keys)
-# [auth-valid-restrict-to](auth-valid-restrict-to)
-# [auth-valid-restrict-where](auth-valid-restrict-where)
-# [case-sensitive-well-known-events](case-sensitive-well-known-events)
-# [extension-restrictions](extension-restrictions)
-# [latest-cds-version](latest-cds-version)
-# [no-cross-service-import](no-cross-service-import)
-# [no-db-keywords](no-db-keywords)
-# [no-deep-sap-cds-import](no-deep-sap-cds-import)
-# [no-dollar-prefixed-names](no-dollar-prefixed-names)
-# [no-java-keywords](no-java-keywords)
-# [no-join-on-draft](no-join-on-draft)
-# [no-shared-handler-variable](no-shared-handler-variable)
-# [sql-cast-suggestion](sql-cast-suggestion)
-# [sql-null-comparison](sql-null-comparison)
-# [start-elements-lowercase](start-elements-lowercase)
-# [start-entities-uppercase](start-entities-uppercase)
-# [use-cql-select-template-strings](use-cql-select-template-strings)
-# [valid-csv-header](valid-csv-header)
\ No newline at end of file
+# [assoc2many-ambiguous-key](assoc2many-ambiguous-key/)
+# [auth-no-empty-restrictions](auth-no-empty-restrictions/)
+# [auth-restrict-grant-service](auth-restrict-grant-service/)
+# [auth-use-requires](auth-use-requires/)
+# [auth-valid-restrict-grant](auth-valid-restrict-grant/)
+# [auth-valid-restrict-keys](auth-valid-restrict-keys/)
+# [auth-valid-restrict-to](auth-valid-restrict-to/)
+# [auth-valid-restrict-where](auth-valid-restrict-where/)
+# [case-sensitive-well-known-events](case-sensitive-well-known-events/)
+# [extension-restrictions](extension-restrictions/)
+# [latest-cds-version](latest-cds-version/)
+# [no-cross-service-import](no-cross-service-import/)
+# [no-db-keywords](no-db-keywords/)
+# [no-deep-sap-cds-import](no-deep-sap-cds-import/)
+# [no-dollar-prefixed-names](no-dollar-prefixed-names/)
+# [no-java-keywords](no-java-keywords/)
+# [no-join-on-draft](no-join-on-draft/)
+# [no-shared-handler-variable](no-shared-handler-variable/)
+# [sql-cast-suggestion](sql-cast-suggestion/)
+# [sql-null-comparison](sql-null-comparison/)
+# [start-elements-lowercase](start-elements-lowercase/)
+# [start-entities-uppercase](start-entities-uppercase/)
+# [use-cql-select-template-strings](use-cql-select-template-strings/)
+# [valid-csv-header](valid-csv-header/)
\ No newline at end of file
diff --git a/tools/cds-lint/rules/assoc2many-ambiguous-key.md b/tools/cds-lint/rules/assoc2many-ambiguous-key.md
deleted file mode 100644
index d53bd2abfb..0000000000
--- a/tools/cds-lint/rules/assoc2many-ambiguous-key.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-outline: [2,2]
-breadcrumbs:
- - CDS Lint
- - Rules Reference
-status: released
----
-
-
-
-# assoc2many-ambiguous-key
-
-## Rule Details
-
-In general an [association/composition to/of `MANY`](../../../cds/cdl#to-many-associations) that targets an entity without `ON` condition is not allowed (as it is an `n:1` relationship). Here, one should always specify an `ON` condition following the canonical expression pattern `. = $self`. The backlink can be any managed to-one association on the many side pointing back to the one side.
-
-## Examples
-
-#### ✅ Correct example
-
-In the following example, we define a unique association from `Authors` to `Books` with a well-defined `ON` condition and backlink, thus satisfying the rule's conditions:
-
-::: code-group
-<<< ../examples/assoc2many-ambiguous-key/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
-:::
-
-
-#### ❌ Incorrect example
-
-If we extend this example by creating a view `AuthorView` with a key `ID` and the element `bookIDs` without an `ON` condition, the rule is triggered since the key is no longer unique and `bookIDs` leads to multiple entries:
-
-::: code-group
-<<< ../examples/assoc2many-ambiguous-key/incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
-:::
-
-
-## Version
-This rule was introduced in `@sap/eslint-plugin-cds 1.0.1`.
diff --git a/tools/cds-lint/examples/assoc2many-ambiguous-key/correct/db/schema.cds b/tools/cds-lint/rules/assoc2many-ambiguous-key/correct/db/schema.cds
similarity index 100%
rename from tools/cds-lint/examples/assoc2many-ambiguous-key/correct/db/schema.cds
rename to tools/cds-lint/rules/assoc2many-ambiguous-key/correct/db/schema.cds
diff --git a/tools/cds-lint/examples/assoc2many-ambiguous-key/incorrect/db/schema.cds b/tools/cds-lint/rules/assoc2many-ambiguous-key/incorrect/db/schema.cds
similarity index 100%
rename from tools/cds-lint/examples/assoc2many-ambiguous-key/incorrect/db/schema.cds
rename to tools/cds-lint/rules/assoc2many-ambiguous-key/incorrect/db/schema.cds
diff --git a/tools/cds-lint/rules/assoc2many-ambiguous-key/index.md b/tools/cds-lint/rules/assoc2many-ambiguous-key/index.md
new file mode 100644
index 0000000000..e9bec53744
--- /dev/null
+++ b/tools/cds-lint/rules/assoc2many-ambiguous-key/index.md
@@ -0,0 +1,50 @@
+---
+outline: [2,2]
+breadcrumbs:
+ - CDS Lint
+ - Rules Reference
+status: released
+---
+
+
+
+# assoc2many-ambiguous-key
+
+## Rule Details
+
+An [association/composition to/of `MANY`](../../../../cds/cdl#to-many-associations) that targets an entity without an `ON` condition is not allowed because it is an `n:1` relationship. Always specify an `ON` condition following the canonical expression pattern `. = $self`. The backlink can be any managed to-one association on the many side pointing back to the one side.
+
+## Examples
+
+#### ✅ Correct example
+
+In the following example, we define a unique association from `Authors` to `Books` with a well-defined `ON` condition and backlink, thus satisfying the rule's conditions:
+
+::: code-group
+<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
+:::
+
+
+#### ❌ Incorrect example
+
+If you extend this example by creating a view `AuthorView` with a key `ID` and the element `bookIDs` without an `ON` condition, the rule is triggered because the key is no longer unique and `bookIDs` leads to multiple entries:
+
+::: code-group
+<<< incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
+:::
+
+
+## Version
+This rule was introduced in `@sap/eslint-plugin-cds 1.0.1`.
diff --git a/tools/cds-lint/examples/auth-no-empty-restrictions/correct/db/schema.cds b/tools/cds-lint/rules/auth-no-empty-restrictions/correct/db/schema.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-no-empty-restrictions/correct/db/schema.cds
rename to tools/cds-lint/rules/auth-no-empty-restrictions/correct/db/schema.cds
diff --git a/tools/cds-lint/examples/auth-no-empty-restrictions/correct/srv/admin-service.cds b/tools/cds-lint/rules/auth-no-empty-restrictions/correct/srv/admin-service.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-no-empty-restrictions/correct/srv/admin-service.cds
rename to tools/cds-lint/rules/auth-no-empty-restrictions/correct/srv/admin-service.cds
diff --git a/tools/cds-lint/examples/auth-no-empty-restrictions/incorrect/db/schema.cds b/tools/cds-lint/rules/auth-no-empty-restrictions/incorrect/db/schema.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-no-empty-restrictions/incorrect/db/schema.cds
rename to tools/cds-lint/rules/auth-no-empty-restrictions/incorrect/db/schema.cds
diff --git a/tools/cds-lint/examples/auth-no-empty-restrictions/incorrect/srv/admin-service.cds b/tools/cds-lint/rules/auth-no-empty-restrictions/incorrect/srv/admin-service.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-no-empty-restrictions/incorrect/srv/admin-service.cds
rename to tools/cds-lint/rules/auth-no-empty-restrictions/incorrect/srv/admin-service.cds
diff --git a/tools/cds-lint/rules/auth-no-empty-restrictions.md b/tools/cds-lint/rules/auth-no-empty-restrictions/index.md
similarity index 50%
rename from tools/cds-lint/rules/auth-no-empty-restrictions.md
rename to tools/cds-lint/rules/auth-no-empty-restrictions/index.md
index baabfb2361..56c4787a66 100644
--- a/tools/cds-lint/rules/auth-no-empty-restrictions.md
+++ b/tools/cds-lint/rules/auth-no-empty-restrictions/index.md
@@ -7,14 +7,14 @@ status: released
---
# auth-no-empty-restrictions
## Rule Details
-The [`@requires` annotation](../../../guides/security/authorization#requires) is a convenience shortcut for `@restrict`. You can use it to control which rule a user needs to have in order to access a given resource. Leaving this field empty is dangerous as it leads to unrestricted access to that service which is a security risk.
+The [`@requires` annotation](../../../../guides/security/authorization#requires) is a convenience shortcut for `@restrict`. You can use it to control which rule a user needs to access a given resource. Leaving this field empty is dangerous because it leads to unrestricted access to that service, which is a security risk.
## Examples
@@ -23,7 +23,7 @@ The [`@requires` annotation](../../../guides/security/authorization#requires) is
In the following example, the `AdminService` is correctly setup with `@requires` given the `admin` role:
::: code-group
-<<< ../examples/auth-no-empty-restrictions/correct/srv/admin-service.cds#snippet{cds:line-numbers} [srv/admin-service.cds]
+<<< correct/srv/admin-service.cds#snippet{cds:line-numbers} [srv/admin-service.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
-
-
-# auth-restrict-grant-service
-
-## Rule Details
-
-Restrictions can be defined on different types of CDS resources, but there are some limitations with regard to supported privileges (see [limitations](../../../guides/security/authorization#supported-combinations-with-cds-resources)).
-
-Unsupported privilege properties are ignored by the runtime. Especially, for bound or unbound actions, the `grant` property is implicitly removed (assuming `grant: '*'` instead). The same is true for functions. This rule ensures that `@restrict.grant` on service level and for bound/unbound actions and functions is limited to `grant: '*'`.
-
-## Examples
-
-#### ✅ Correct example
-
-Let's consider the following example with the `CatalogService` where the function `getViewsCount()` is restricted to the *Admin* role, granting all CDS events:
-
-::: code-group
-<<< ../examples/auth-restrict-grant-service/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
-:::
-
-
-#### ❌ Incorrect example
-
-If we were to slightly modify the above example and use `grant: ['WRITE']` in the privilege of the function, the rule would be
-triggered to inform us that the value of `grant` is limited to `'*'`:
-
-::: code-group
-<<< ../examples/auth-restrict-grant-service/incorrect/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
-:::
-
-
-## Version
-This rule was introduced in `@sap/eslint-plugin-cds 2.6.4`.
diff --git a/tools/cds-lint/examples/auth-restrict-grant-service/correct/db/schema.cds b/tools/cds-lint/rules/auth-restrict-grant-service/correct/db/schema.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-restrict-grant-service/correct/db/schema.cds
rename to tools/cds-lint/rules/auth-restrict-grant-service/correct/db/schema.cds
diff --git a/tools/cds-lint/examples/auth-restrict-grant-service/correct/srv/cat-service.cds b/tools/cds-lint/rules/auth-restrict-grant-service/correct/srv/cat-service.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-restrict-grant-service/correct/srv/cat-service.cds
rename to tools/cds-lint/rules/auth-restrict-grant-service/correct/srv/cat-service.cds
diff --git a/tools/cds-lint/examples/auth-restrict-grant-service/incorrect/db/schema.cds b/tools/cds-lint/rules/auth-restrict-grant-service/incorrect/db/schema.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-restrict-grant-service/incorrect/db/schema.cds
rename to tools/cds-lint/rules/auth-restrict-grant-service/incorrect/db/schema.cds
diff --git a/tools/cds-lint/examples/auth-restrict-grant-service/incorrect/srv/cat-service.cds b/tools/cds-lint/rules/auth-restrict-grant-service/incorrect/srv/cat-service.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-restrict-grant-service/incorrect/srv/cat-service.cds
rename to tools/cds-lint/rules/auth-restrict-grant-service/incorrect/srv/cat-service.cds
diff --git a/tools/cds-lint/rules/auth-restrict-grant-service/index.md b/tools/cds-lint/rules/auth-restrict-grant-service/index.md
new file mode 100644
index 0000000000..03461a5fd1
--- /dev/null
+++ b/tools/cds-lint/rules/auth-restrict-grant-service/index.md
@@ -0,0 +1,52 @@
+---
+outline: [2,2]
+breadcrumbs:
+ - CDS Lint
+ - Rules Reference
+status: released
+---
+
+
+
+# auth-restrict-grant-service
+
+## Rule Details
+
+Restrictions can be defined on different types of CDS resources, but there are some limitations regarding supported privileges (see [limitations](../../../../guides/security/authorization#supported-combinations-with-cds-resources)).
+
+Unsupported privilege properties are ignored by the runtime. For bound or unbound actions, the `grant` property is implicitly removed (assuming `grant: '*'` instead). The same is true for functions. This rule ensures that `@restrict.grant` on service level and for bound/unbound actions and functions is limited to `grant: '*'`.
+
+## Examples
+
+#### ✅ Correct example
+
+Let's consider the following example with the `CatalogService` where the function `getViewsCount()` is restricted to the *Admin* role, granting all CDS events:
+
+::: code-group
+<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
+:::
+
+
+#### ❌ Incorrect example
+
+If you modify the above example and use `grant: ['WRITE']` in the privilege of the function, the rule would be triggered to inform you that the value of `grant` is limited to `'*'`:
+
+::: code-group
+<<< incorrect/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
+:::
+
+
+## Version
+This rule was introduced in `@sap/eslint-plugin-cds 2.6.4`.
diff --git a/tools/cds-lint/examples/auth-use-requires/correct/db/schema.cds b/tools/cds-lint/rules/auth-use-requires/correct/db/schema.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-use-requires/correct/db/schema.cds
rename to tools/cds-lint/rules/auth-use-requires/correct/db/schema.cds
diff --git a/tools/cds-lint/examples/auth-use-requires/correct/srv/cat-service.cds b/tools/cds-lint/rules/auth-use-requires/correct/srv/cat-service.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-use-requires/correct/srv/cat-service.cds
rename to tools/cds-lint/rules/auth-use-requires/correct/srv/cat-service.cds
diff --git a/tools/cds-lint/examples/auth-use-requires/incorrect/db/schema.cds b/tools/cds-lint/rules/auth-use-requires/incorrect/db/schema.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-use-requires/incorrect/db/schema.cds
rename to tools/cds-lint/rules/auth-use-requires/incorrect/db/schema.cds
diff --git a/tools/cds-lint/examples/auth-use-requires/incorrect/srv/cat-service.cds b/tools/cds-lint/rules/auth-use-requires/incorrect/srv/cat-service.cds
similarity index 100%
rename from tools/cds-lint/examples/auth-use-requires/incorrect/srv/cat-service.cds
rename to tools/cds-lint/rules/auth-use-requires/incorrect/srv/cat-service.cds
diff --git a/tools/cds-lint/rules/auth-use-requires.md b/tools/cds-lint/rules/auth-use-requires/index.md
similarity index 61%
rename from tools/cds-lint/rules/auth-use-requires.md
rename to tools/cds-lint/rules/auth-use-requires/index.md
index 46fabdb843..ff2d818c16 100644
--- a/tools/cds-lint/rules/auth-use-requires.md
+++ b/tools/cds-lint/rules/auth-use-requires/index.md
@@ -7,14 +7,14 @@ status: released
---
# auth-use-requires
## Rule Details
-Some annotations such as `@requires` or `@readonly` are just convenience shortcuts for `@restrict`. In actions and services with unrestricted events, it is recommended to use `@requires` instead of `@restrict.to`, which this rule enforces.
+Some annotations such as `@requires` or `@readonly` are convenience shortcuts for `@restrict`. In actions and services with unrestricted events, it is recommended to use `@requires` instead of `@restrict.to`, which this rule enforces.
## Examples
@@ -23,7 +23,7 @@ Some annotations such as `@requires` or `@readonly` are just convenience shortcu
In the following example, the `CatalogService` action `addRating` correctly uses `@requires: 'Admin'` to indicate granting of unrestricted events to the `Admin` role:
::: code-group
-<<< ../examples/auth-use-requires/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
+<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# auth-valid-restrict-grant
## Rule Details
-The `grant` property of a `@restrict` privilege defines one or more events that the privilege applies. This rule checks for valid values of `@restrict.grant`, that is, all standard CDS events (such as `READ`, `CREATE`, `UPDATE`, and `DELETE`) on entities. It also suggests to use `*` only when listing events including `*` and to use `WRITE` only when using solely standard CDS events with write semantics (`CREATE`, `DELETE`, `UPDATE`, `UPSERT`).
+The `grant` property of a `@restrict` privilege defines one or more events that the privilege applies to. This rule checks for valid values of `@restrict.grant`, that is, all standard CDS events (such as `READ`, `CREATE`, `UPDATE`, and `DELETE`) on entities. It also suggests using `*` only when listing events including `*` and using `WRITE` only when using solely standard CDS events with write semantics (`CREATE`, `DELETE`, `UPDATE`, `UPSERT`).
## Examples
@@ -23,7 +23,7 @@ The `grant` property of a `@restrict` privilege defines one or more events that
In the following example, `CatalogService.ListOfBooks` is restricted to the `READ` event for the `Viewer` role, which is a valid value for `@restrict.grant`:
::: code-group
-<<< ../examples/auth-valid-restrict-grant/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
+<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# auth-valid-restrict-keys
## Rule Details
-To define authorizations on a fine-grained level, the `@restrict` annotation allows you to add all kinds of restrictions that are based on static user roles, the request operation, and instance filters. The building block of such a restriction is a single privilege. This rule checks that the privileges defined in `@restrict` have properly spelled `to`, `grant`, and `where` keys.
+To define authorizations on a fine-grained level, the `@restrict` annotation allows you to add all kinds of restrictions based on static user roles, the request operation, and instance filters. The building block of such a restriction is a single privilege. This rule checks that the privileges defined in `@restrict` have properly spelled `to`, `grant`, and `where` keys.
## Examples
@@ -23,7 +23,7 @@ To define authorizations on a fine-grained level, the `@restrict` annotation all
In the following example, the `@restrict` annotation on `CatalogService.ListOfBooks` has correctly spelled `to`, `grant`, and `where` keys in the defined privilege:
::: code-group
-<<< ../examples/auth-valid-restrict-keys/correct/srv/cat-service.cds#snippet{ts:line-numbers} [srv/cat-service.cds]
+<<< correct/srv/cat-service.cds#snippet{ts:line-numbers} [srv/cat-service.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# auth-valid-restrict-to
## Rule Details
-The `to` property of a `@restrict` privilege defines one or more [user roles](../../../guides/security/authorization#roles) or [pseudo roles](../../../guides/security/authorization#pseudo-roles) that the privilege applies to. This rule checks that the values of `@restrict.to` are valid, that is, roles cannot be missing, misspelled and that roles including `any` should be simplified to just `any`.
+The `to` property of a `@restrict` privilege defines one or more [user roles](../../../../guides/security/authorization#roles) or [pseudo roles](../../../../guides/security/authorization#pseudo-roles) that the privilege applies to. This rule checks that the values of `@restrict.to` are valid, that is, roles cannot be missing or misspelled and that roles including `any` should be simplified to just `any`.
## Examples
@@ -23,7 +23,7 @@ The `to` property of a `@restrict` privilege defines one or more [user roles](..
The following example shows a correct usage of the `@restrict.to` annotation, where the `to` property is set to the `Viewer` rule which is a valid value:
::: code-group
-<<< ../examples/auth-valid-restrict-to/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
+<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# auth-valid-restrict-where
## Rule Details
-The `where` property of a [`@restrict`](/guides/security/authorization#restrict-annotation) privilege defines a filter expression that restricts the access on an instance level (optional). This rule checks that the values of `@restrict.where` are valid, that is, the filter expression must be a valid expression that compiles without any errors.
+The `where` property of a [`@restrict`](/guides/security/authorization#restrict-annotation) privilege defines a filter expression that restricts access on an instance level (optional). This rule checks that the values of `@restrict.where` are valid, that is, the filter expression must be a valid expression that compiles without any errors.
## Examples
@@ -23,7 +23,7 @@ The `where` property of a [`@restrict`](/guides/security/authorization#restrict-
In the following example, the `@restrict` privilege is defined with a valid `where` property `CreatedBy = $user'`:
::: code-group
-<<< ../examples/auth-valid-restrict-where/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
+<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# case-sensitive-well-known-events
@@ -22,7 +22,7 @@ This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`.
The following example shows the correctly capitalized event name `READ`:
::: code-group
-<<< ../examples/case-sensitive-well-known-events/correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
+<<< correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# extension-restrictions
## Rule Details
-CAP provides intrinsic extensibility, which means all your entities and services are extensible by default.
-Your SaaS app becomes the base app for extensions by your customers, and your data model the base model. Normally,
-you'll want to restrict which services or entities your SaaS customers are allowed to extend and to what degree they may do so.
-This rule ensures that extensions do not violate any restrictions set by the extended SaaS app.
+CAP provides intrinsic extensibility, which means all your entities and services are extensible by default. Your SaaS app becomes the base app for extensions by your customers, and your data model becomes the base model. Normally, you want to restrict which services or entities your SaaS customers are allowed to extend and to what degree they may do so. This rule ensures that extensions do not violate any restrictions set by the extended SaaS app.
## Examples
#### ✅ Correct example
::: code-group
-<<< ../examples/extension-restrictions/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
+<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
:::
::: code-group
-<<< ../examples/extension-restrictions/incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
+<<< incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
:::
diff --git a/tools/cds-lint/rules/latest-cds-version.md b/tools/cds-lint/rules/latest-cds-version/index.md
similarity index 80%
rename from tools/cds-lint/rules/latest-cds-version.md
rename to tools/cds-lint/rules/latest-cds-version/index.md
index 6fa9623d2d..cbf6a775d6 100644
--- a/tools/cds-lint/rules/latest-cds-version.md
+++ b/tools/cds-lint/rules/latest-cds-version/index.md
@@ -7,15 +7,14 @@ status: released
---
# latest-cds-version
## Rule Details
-It's recommended to always use the latest version of `@sap/cds` to benefit from the latest features and bug fixes.
-This rule checks whether the latest `@sap/cds` version is being used and reports back in case a newer version is available.
+It is recommended to always use the latest version of `@sap/cds` to benefit from the latest features and bug fixes. This rule checks whether the latest `@sap/cds` version is being used and reports back in case a newer version is available.
## Examples
diff --git a/tools/cds-lint/examples/no-cross-service-import/correct/srv/AdminService.js b/tools/cds-lint/rules/no-cross-service-import/correct/srv/AdminService.js
similarity index 71%
rename from tools/cds-lint/examples/no-cross-service-import/correct/srv/AdminService.js
rename to tools/cds-lint/rules/no-cross-service-import/correct/srv/AdminService.js
index 85966e6628..64479b6623 100644
--- a/tools/cds-lint/examples/no-cross-service-import/correct/srv/AdminService.js
+++ b/tools/cds-lint/rules/no-cross-service-import/correct/srv/AdminService.js
@@ -1,6 +1,7 @@
const cds = require('@sap/cds')
const { Books } = require('#cds-models/sap/capire/bookshop/AdminService') // [!code highlight]
-module.exports = class AdminService extends cds.ApplicationService {
- // …
-}
\ No newline at end of file
+module.exports = class AdminService extends cds.ApplicationService { async init() {
+ this.after('READ', Books, async () => { })
+ // ...
+}}
diff --git a/tools/cds-lint/examples/no-cross-service-import/incorrect/srv/AdminService.js b/tools/cds-lint/rules/no-cross-service-import/incorrect/srv/AdminService.js
similarity index 57%
rename from tools/cds-lint/examples/no-cross-service-import/incorrect/srv/AdminService.js
rename to tools/cds-lint/rules/no-cross-service-import/incorrect/srv/AdminService.js
index f8cb922c75..18b38b12c0 100644
--- a/tools/cds-lint/examples/no-cross-service-import/incorrect/srv/AdminService.js
+++ b/tools/cds-lint/rules/no-cross-service-import/incorrect/srv/AdminService.js
@@ -1,6 +1,7 @@
const cds = require('@sap/cds')
-const { Books } = require('#cds-models/sap/capire/bookshop/CatalogService') // [!code error]
+const { Books } = require('#cds-models/sap/capire/bookshop/CatalogService') // [!code error] wrong service!
-module.exports = class AdminService extends cds.ApplicationService {
- // …
-}
\ No newline at end of file
+module.exports = class AdminService extends cds.ApplicationService { async init() {
+ this.after('READ', Books, async () => { })
+ // ...
+}}
diff --git a/tools/cds-lint/rules/no-cross-service-import.md b/tools/cds-lint/rules/no-cross-service-import/index.md
similarity index 77%
rename from tools/cds-lint/rules/no-cross-service-import.md
rename to tools/cds-lint/rules/no-cross-service-import/index.md
index 41e874b96e..65142360d6 100644
--- a/tools/cds-lint/rules/no-cross-service-import.md
+++ b/tools/cds-lint/rules/no-cross-service-import/index.md
@@ -3,7 +3,7 @@ status: released
---
# no-cross-service-import
@@ -21,7 +21,7 @@ This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`.
The imported entity belongs to `AdminService` and is used within the implementation of `AdminService` itself. This is the recommended approach:
::: code-group
-<<< ../examples/no-cross-service-import/correct/srv/AdminService.js#snippet{js:line-numbers} [srv/AdminService.js]
+<<< correct/srv/AdminService.js#snippet{js:line-numbers} [srv/AdminService.js]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# no-db-keywords
## Rule Details
-The CDS compiler and CAP runtimes provide smart quoting for reserved words in SQLite so that they can still be used in most situations.
-But in general reserved words cannot be used as identifiers and this rule warns you if you use any of the [reserved SQL keywords](https://www.sqlite.org/lang_keywords.html).
+The CDS compiler and CAP runtimes provide smart quoting for reserved words in SQLite so they can still be used in most situations. But in general reserved words cannot be used as identifiers and this rule warns you if you use any of the [reserved SQL keywords](https://www.sqlite.org/lang_keywords.html).
## Examples
@@ -24,7 +23,7 @@ But in general reserved words cannot be used as identifiers and this rule warns
In the following example, none of the reserved SQL keywords are used as identifiers, so the rule doesn't raise any warnings:
::: code-group
-<<< ../examples/no-db-keywords/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
+<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
:::
::: code-group
-<<< ../examples/no-db-keywords/incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
+<<< incorrect/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# no-deep-sap-cds-import
@@ -23,7 +23,7 @@ This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`.
The following example imports `@sap/cds`:
::: code-group
-<<< ../examples/no-deep-sap-cds-import/correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
+<<< correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# no-dollar-prefixed-names
@@ -23,7 +23,7 @@ Names must not start with $ to avoid possible shadowing of reserved variables.
In the following example, all elements names are well defined and do not start with `$`:
::: code-group
-<<< ../examples/no-dollar-prefixed-names/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
+<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# no-java-keywords
## Rule Details
-The CAP Java code generation bases its class and method names on CDS entities.
-If reserved Java keywords are used as CDS identifiers, the code generation or compilation may fail.
-This rule helps identify such identifiers early on and suggest to use the `@cds.java.name` annotation.
+The CAP Java code generation bases its class and method names on CDS entities. If reserved Java keywords are used as CDS identifiers, the code generation or compilation may fail. This rule helps identify such identifiers early on and suggests using the `@cds.java.name` annotation.
## Examples
@@ -25,7 +23,7 @@ This rule helps identify such identifiers early on and suggest to use the `@cds.
In the following example, use of the reserved Java keyword as identifiers is fixed via the `@cds.java.name` annotation, so the rule doesn't raise any warnings:
::: code-group
-<<< ../examples/no-java-keywords/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
+<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# no-join-on-draft
@@ -23,7 +23,7 @@ Draft-enabled entities shall not be used in views that make use of `JOIN`. This
In the following example, no draft-enabled entities are used in the service `CatalogService`:
::: code-group
-<<< ../examples/no-join-on-draft/correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
+<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [srv/cat-service.cds]
:::
{
+ // local variable only, no state shared between handlers
+ const books = await cds.run(SELECT.from('Books')) // [!code highlight]
+ return books
+ })
+
+ this.on('CREATE', 'Books', newBookHandler)
+ await super.init()
+}}
+
+/** @type {import('@sap/cds').CRUDEventHandler.On} */
+async function newBookHandler (req) {
+ const { name } = req.data
+ // local variable only, no state shared between handlers
+ const newBook = await cds.run(INSERT.into('Books').entries({ name })) // [!code highlight]
+ return newBook
+}
\ No newline at end of file
diff --git a/tools/cds-lint/rules/no-shared-handler-variable/incorrect/srv/admin-service.js b/tools/cds-lint/rules/no-shared-handler-variable/incorrect/srv/admin-service.js
new file mode 100644
index 0000000000..c6055d5155
--- /dev/null
+++ b/tools/cds-lint/rules/no-shared-handler-variable/incorrect/srv/admin-service.js
@@ -0,0 +1,23 @@
+const cds = require('@sap/cds')
+
+let lastCreatedBook
+let lastReadBooks
+
+module.exports = class AdminService extends cds.ApplicationService { async init() {
+ this.after('READ', 'Books', async () => {
+ // variable from surrounding scope, state is shared between handler calls
+ lastReadBooks = await cds.run(SELECT.from('Books')) // [!code error]
+ return lastReadBooks
+ })
+
+ this.on('CREATE', 'Books', newBookHandler)
+ await super.init()
+}}
+
+/** @type {import('@sap/cds').CRUDEventHandler.On} */
+async function newBookHandler (req) {
+ const { name } = req.data
+ // variable from surrounding scope, state is shared between handler calls
+ lastCreatedBook = await cds.run(INSERT.into('Books').entries({ name })) // [!code error]
+ return lastCreatedBook
+}
\ No newline at end of file
diff --git a/tools/cds-lint/rules/no-shared-handler-variable.md b/tools/cds-lint/rules/no-shared-handler-variable/index.md
similarity index 87%
rename from tools/cds-lint/rules/no-shared-handler-variable.md
rename to tools/cds-lint/rules/no-shared-handler-variable/index.md
index e034969ee4..c974d5e9f0 100644
--- a/tools/cds-lint/rules/no-shared-handler-variable.md
+++ b/tools/cds-lint/rules/no-shared-handler-variable/index.md
@@ -3,7 +3,7 @@ status: released
---
# no-shared-handler-variable
@@ -17,10 +17,37 @@ Any function annotated with
- `@type {import('@sap/cds').CRUDEventHandler.Before}`,
- `@type {import('@sap/cds').CRUDEventHandler.On}`,
-- or `@type {import('@sap/cds').CRUDEventHandler.After}`
+- `@type {import('@sap/cds').CRUDEventHandler.After}`
will also be checked by this rule.
+## Examples
+
+### ✅ Correct example
+
+In the following example, only locally defined variables are used within handler implementation:
+
+::: code-group
+<<< correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
+:::
+
+
+### ❌ Incorrect example
+
+In the following example, the variables `newBook` and `readBooks` are declared in scopes surrounding the handler function, making their value available to subsequent calls of that handler. While this may seem advantageous, it can cause issues in a multitenant scenario, where the handler function can be invoked by multiple tenants.
+
+::: code-group
+<<< incorrect/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
+:::
+
## Caveats
The following code styles are not checked by this rule as of today:
@@ -58,31 +85,3 @@ cds.services['AdminService'].on('READ', 'Books', () => {})
#### Version
This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`.
-
-## Examples
-
-### ✅ Correct example
-
-In the following example, only locally defined variables are used within handler implementation:
-
-::: code-group
-<<< ../examples/no-shared-handler-variable/correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
-:::
-
-
-### ❌ Incorrect example
-
-In the following example, the variables `newBook` and `readBooks` are declared in scopes surrounding the handler function, making their value available to subsequent calls of that handler. While this may seem advantageous, it can cause issues in a multitenant scenario, where the handler function can be invoked by multiple tenants.
-
-::: code-group
-<<< ../examples/no-shared-handler-variable/incorrect/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
-:::
-
diff --git a/tools/cds-lint/examples/package.json b/tools/cds-lint/rules/package.json
similarity index 100%
rename from tools/cds-lint/examples/package.json
rename to tools/cds-lint/rules/package.json
diff --git a/tools/cds-lint/examples/sql-cast-suggestion/correct/db/schema.cds b/tools/cds-lint/rules/sql-cast-suggestion/correct/db/schema.cds
similarity index 100%
rename from tools/cds-lint/examples/sql-cast-suggestion/correct/db/schema.cds
rename to tools/cds-lint/rules/sql-cast-suggestion/correct/db/schema.cds
diff --git a/tools/cds-lint/examples/sql-cast-suggestion/incorrect/db/schema.cds b/tools/cds-lint/rules/sql-cast-suggestion/incorrect/db/schema.cds
similarity index 100%
rename from tools/cds-lint/examples/sql-cast-suggestion/incorrect/db/schema.cds
rename to tools/cds-lint/rules/sql-cast-suggestion/incorrect/db/schema.cds
diff --git a/tools/cds-lint/rules/sql-cast-suggestion.md b/tools/cds-lint/rules/sql-cast-suggestion/index.md
similarity index 59%
rename from tools/cds-lint/rules/sql-cast-suggestion.md
rename to tools/cds-lint/rules/sql-cast-suggestion/index.md
index b3a44b70af..5d2cd20efa 100644
--- a/tools/cds-lint/rules/sql-cast-suggestion.md
+++ b/tools/cds-lint/rules/sql-cast-suggestion/index.md
@@ -7,14 +7,14 @@ status: released
---
# sql-cast-suggestion
## Rule Details
-With compiler v2, appending a type declaration to a column expression in a view's query doesn't generate a cast in SQL anymore, as that created conflicts with various database-specific behaviors. This rule ensures that such casts are added explicitly by suggesting possible missing SQL casts.
+With compiler v2, appending a type declaration to a column expression in a view's query doesn't generate a cast in SQL anymore because that created conflicts with various database-specific behaviors. This rule ensures that such casts are added explicitly by suggesting possible missing SQL casts.
## Examples
@@ -23,7 +23,7 @@ With compiler v2, appending a type declaration to a column expression in a view'
In the following example, the entity `ListOfBooks` contains explicit casts for elements `name2` and `name3`, so the rule will not be triggered for these elements:
::: code-group
-<<< ../examples/sql-cast-suggestion/correct/db/schema.cds#snippet{ts:line-numbers} [db/schema.cds]
+<<< correct/db/schema.cds#snippet{ts:line-numbers} [db/schema.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# sql-null-comparison
@@ -15,8 +15,7 @@ status: released
## Rule Details
-Comparing values against `null` in views is a common pitfall in SQL.
-This rules helps find places where incorrect SQL comparisons are used and proposes to use `IS NULL` or `IS NOT NULL` instead.
+Comparing values against `null` in views is a common pitfall in SQL. This rule helps find places where incorrect SQL comparisons are used and proposes using `IS NULL` or `IS NOT NULL` instead.
## Examples
@@ -25,7 +24,7 @@ This rules helps find places where incorrect SQL comparisons are used and propos
In the following example, the rule is satisfied because `null` comparison is valid:
::: code-group
-<<< ../examples/sql-null-comparison/correct/srv/cat-service.cds#snippet{cds:line-numbers} [db/schema.cds]
+<<< correct/srv/cat-service.cds#snippet{cds:line-numbers} [db/schema.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# start-elements-lowercase
## Rule Details
-According to our [naming conventions](../../../guides/domain-modeling#naming-conventions), to easily distinguish entity names from element names we recommend starting elements with a *lowercase* letter, which this rule ensures.
+According to our [naming conventions](../../../../guides/domain-modeling#naming-conventions), to easily distinguish entity names from element names we recommend starting elements with a *lowercase* letter, which this rule ensures.
## Examples
@@ -23,7 +23,7 @@ According to our [naming conventions](../../../guides/domain-modeling#naming-con
In the following example, the rule is satisfied because the element name `title` starts with a lowercase letter:
::: code-group
-<<< ../examples/start-elements-lowercase/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
+<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# start-entities-uppercase
@@ -15,7 +15,7 @@ status: released
## Rule Details
-According to our [naming conventions](../../../guides/domain-modeling#naming-conventions), to easily distinguish entity names from element names we recommend starting entity names with *capital* letters, which this rule ensures.
+According to our [naming conventions](../../../../guides/domain-modeling#naming-conventions), to easily distinguish entity names from element names we recommend starting entity names with *capital* letters, which this rule ensures.
## Examples
@@ -24,7 +24,7 @@ According to our [naming conventions](../../../guides/domain-modeling#naming-con
In the following example, the rule is satisfied because the entity name `Books` starts with a capital letter:
::: code-group
-<<< ../examples/start-entities-uppercase/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
+<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# use-cql-select-template-strings
## Rule Details
-Discourages use of SELECT(\`...\`), which allows [SQL injection attacks](../../../node.js/cds-ql#avoiding-sql-injection), in favor of SELECT \`...\`.
+Discourages use of SELECT(\`...\`), which allows [SQL injection attacks](../../../../node.js/cds-ql#avoiding-sql-injection), in favor of SELECT \`...\`.
#### Version
This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`.
@@ -22,7 +22,7 @@ This rule was introduced in `@sap/eslint-plugin-cds 4.0.2`.
In the following example, the `where` clause is a proper tagged template literal, so that the `req.data.name` expression can be validated before the SELECT is executed:
::: code-group
-<<< ../examples/use-cql-select-template-strings/correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
+<<< correct/srv/admin-service.js#snippet{js:line-numbers} [srv/admin-service.js]
:::
- import PlaygroundBadge from '../components/PlaygroundBadge.vue'
+ import PlaygroundBadge from '../../components/PlaygroundBadge.vue'
# valid-csv-header
@@ -21,7 +21,7 @@ To provide your database with initial data, you can use CSV files. Their filenam
Let's consider the following model definition:
::: code-group
-<<< ../examples/valid-csv-header/correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
+<<< correct/db/schema.cds#snippet{cds:line-numbers} [db/schema.cds]
:::
#### ✅ Correct example
@@ -29,7 +29,7 @@ Let's consider the following model definition:
The following example shows a correct CSV file header that matches the column names of the entity definition:
::: code-group
-<<< ../examples/valid-csv-header/correct/db/data/sap.capire.bookshop-Books.csv#snippet{csv:line-numbers} [db/data/sap.capire.bookshop-Books.csv]
+<<< correct/db/data/sap.capire.bookshop-Books.csv#snippet{csv:line-numbers} [db/data/sap.capire.bookshop-Books.csv]
:::