i18nTexts) {
- String content =
- htmlCache.computeIfAbsent(
- filePath,
- path -> {
- try (InputStream is = getClass().getClassLoader().getResourceAsStream(path)) {
- if (is != null) {
- return new String(is.readAllBytes(), StandardCharsets.UTF_8);
- } else {
- logger.error("HTML file not found: {}", path);
- return null;
- }
- } catch (Exception e) {
- logger.error("Failed to load HTML file: {}", path, e);
- return null;
- }
- });
-
- if (content == null) {
- return null;
- }
-
- // Resolve {i18n>KEY} placeholders in the HTML content
- String resolvedHtml = resolveI18n(content, i18nTexts);
-
- // Minify HTML: remove comments and unnecessary whitespace
- String compactHtml =
- resolvedHtml
- .replaceAll("(?s)", "")
- .replaceAll(">\\s+<", "><")
- .replaceAll("\\s{2,}", " ")
- .trim();
-
- logger.debug(
- "Loaded HTML file: {} (original: {} bytes, resolved+compacted: {} bytes)",
- filePath,
- content.length(),
- compactHtml.length());
- return compactHtml;
- }
}
diff --git a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/EntityNotificationHandler.java b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/EntityNotificationHandler.java
index ebab548..1035844 100644
--- a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/EntityNotificationHandler.java
+++ b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/EntityNotificationHandler.java
@@ -6,6 +6,7 @@
import com.sap.cds.CdsData;
import com.sap.cds.Result;
import com.sap.cds.Struct;
+import com.sap.cds.notifications.assemblers.NotificationAssembler;
import com.sap.cds.ql.CQL;
import com.sap.cds.ql.cqn.CqnContainmentTest;
import com.sap.cds.ql.cqn.CqnElementRef;
@@ -172,7 +173,7 @@ private void processNotificationEntry(
// Optional: explicit parameter mapping (entity field → notification property)
Map, ?> properties = notification.get("parameters") instanceof Map, ?> m ? m : null;
- logger.info(
+ logger.debug(
"Entity notification triggered: type='{}', event='{}', entity='{}'",
notificationType,
currentEvent,
@@ -279,7 +280,7 @@ private CdsData buildEventData(
*
* The event is looked up in the CDS model to determine its owning service, then emitted on
* that service. Downstream {@code @On} handlers ({@link ProductionHandler} or {@link
- * LocalHandler}) pick up the event and delegate to {@link NotificationBuilder}, which iterates
+ * LocalHandler}) pick up the event and delegate to {@link NotificationAssembler}, which iterates
* the list and builds one ANS notification per entry.
*/
private void emitBatchNotification(
@@ -307,7 +308,7 @@ private void emitBatchNotification(
EventContext notificationCtx = EventContext.create(notificationType, null);
notificationCtx.put("data", batchData);
service.emit(notificationCtx);
- logger.info(
+ logger.debug(
"Emitted {} notification(s) for event '{}' on service '{}'",
batchData.size(),
notificationType,
@@ -400,12 +401,12 @@ public CqnPredicate containment(
CqnValue value,
CqnValue term,
boolean caseInsensitive) {
- return NotificationBuilder.evaluateContainment(
+ return NotificationAssembler.evaluateContainment(
position, value, term, caseInsensitive, context.getServiceCatalog());
}
});
- Result result = NotificationBuilder.executeDummySelect(resolved, context.getServiceCatalog());
+ Result result = NotificationAssembler.executeDummySelect(resolved, context.getServiceCatalog());
boolean conditionMet =
result
diff --git a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/LocalHandler.java b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/LocalHandler.java
index 47a8f2f..f0bd228 100644
--- a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/LocalHandler.java
+++ b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/LocalHandler.java
@@ -6,6 +6,8 @@
import cds.gen.notificationproviderservice.NotificationProperties;
import cds.gen.notificationproviderservice.Notifications;
import cds.gen.notificationproviderservice.Recipients;
+
+import com.sap.cds.notifications.assemblers.NotificationAssembler;
import com.sap.cds.services.EventContext;
import com.sap.cds.services.cds.ApplicationService;
import com.sap.cds.services.handler.EventHandler;
@@ -20,15 +22,15 @@
public class LocalHandler implements EventHandler {
private static final Logger logger = LoggerFactory.getLogger(LocalHandler.class);
- private final NotificationBuilder notificationBuilder;
+ private final NotificationAssembler notificationBuilder;
public LocalHandler(CdsRuntime runtime) {
- this.notificationBuilder = new NotificationBuilder(runtime);
+ this.notificationBuilder = new NotificationAssembler(runtime);
}
@On(event = "*")
public void postNotifications(EventContext context) {
- List results =
+ List results =
notificationBuilder.buildNotifications(context);
if (results.isEmpty()) {
return;
diff --git a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/LocalNotificationTemplateAutoProvisionerHandler.java b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/LocalNotificationTemplateAutoProvisionerHandler.java
new file mode 100644
index 0000000..58f656e
--- /dev/null
+++ b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/LocalNotificationTemplateAutoProvisionerHandler.java
@@ -0,0 +1,113 @@
+/*
+ * © 2026 SAP SE or an SAP affiliate company and cds-feature-notifications contributors.
+ */
+package com.sap.cds.notifications.handlers;
+
+import cds.gen.notificationtemplateproviderservice.NotificationTemplates;
+import cds.gen.notificationtemplateproviderservice.Translations;
+
+import com.sap.cds.notifications.assemblers.NotificationTemplateAssembler;
+import com.sap.cds.services.application.ApplicationLifecycleService;
+import com.sap.cds.services.handler.EventHandler;
+import com.sap.cds.services.handler.annotations.On;
+import com.sap.cds.services.handler.annotations.ServiceName;
+import com.sap.cds.services.runtime.CdsRuntime;
+import java.util.List;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Local-mode handler for standalone NotificationTemplate provisioning. Logs template details to
+ * console instead of sending to ANS.
+ */
+@ServiceName(ApplicationLifecycleService.DEFAULT_NAME)
+public class LocalNotificationTemplateAutoProvisionerHandler implements EventHandler {
+
+ private static final Logger logger =
+ LoggerFactory.getLogger(LocalNotificationTemplateAutoProvisionerHandler.class);
+
+ private final NotificationTemplateAssembler notificationTemplateBuilder;
+
+ public LocalNotificationTemplateAutoProvisionerHandler(CdsRuntime runtime) {
+ this.notificationTemplateBuilder = new NotificationTemplateAssembler(runtime);
+ }
+
+ @On(event = ApplicationLifecycleService.EVENT_APPLICATION_PREPARED)
+ public void onApplicationPrepared() {
+ logger.info(
+ "Auto-provisioning standalone NotificationTemplates from CDS annotations"
+ + " (LOCAL MODE - Logging Only)...");
+ try {
+ provisionNotificationTemplates();
+ logger.info("Standalone NotificationTemplate auto-provisioning completed (LOCAL MODE)");
+ } catch (Exception e) {
+ logger.error("Standalone NotificationTemplate auto-provisioning failed", e);
+ }
+ }
+
+ private void provisionNotificationTemplates() {
+ List templates =
+ notificationTemplateBuilder.buildAllNotificationTemplates();
+
+ if (templates.isEmpty()) {
+ logger.info("No standalone NotificationTemplates found in CDS model (LOCAL MODE)");
+ return;
+ }
+
+ for (NotificationTemplates template : templates) {
+ logTemplate(template);
+ }
+ }
+
+ private void logTemplate(NotificationTemplates template) {
+ logger.info("===============================================================");
+ logger.info("Standalone NotificationTemplate (Local Mode - Not Sent to ANS)");
+ logger.info(
+ """
+ Key: {}
+ Visibility: {}
+ Translations: {}""",
+ template.getKey(),
+ template.getVisibility(),
+ template.getTranslations() != null ? template.getTranslations().size() : 0);
+
+ if (template.getTranslations() != null) {
+ for (Translations translation : template.getTranslations()) {
+ logger.info(
+ """
+ - Language: {}
+ Syntax: {}
+ Title: {}
+ Preview: {}
+ Body: {}
+ Description: {}""",
+ translation.getLanguage(),
+ translation.getSyntax(),
+ translation.getTitle(),
+ translation.getPreview(),
+ translation.getBody(),
+ translation.getDescription());
+
+ if (translation.getEmail() != null) {
+ logger.info(
+ """
+ Email Subject: {}
+ Email BodyHtml: {}
+ Email BodyText: {}""",
+ translation.getEmail().getSubject(),
+ translation.getEmail().getBodyHtml() != null
+ ? translation
+ .getEmail()
+ .getBodyHtml()
+ .substring(0, Math.min(100, translation.getEmail().getBodyHtml().length()))
+ + "..."
+ : "null",
+ translation.getEmail().getBodyText());
+ }
+ }
+ }
+
+ logger.info("===============================================================");
+ logger.info("Standalone template '{}' logged (LOCAL MODE - not sent to ANS)", template.getKey());
+ }
+}
diff --git a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/LocalNotificationTypeAutoProvisionerHandler.java b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/LocalNotificationTypeAutoProvisionerHandler.java
index b22d4ae..3ab91f8 100644
--- a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/LocalNotificationTypeAutoProvisionerHandler.java
+++ b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/LocalNotificationTypeAutoProvisionerHandler.java
@@ -6,6 +6,8 @@
import cds.gen.notificationtypeproviderservice.DeliveryChannels;
import cds.gen.notificationtypeproviderservice.NotificationTypes;
import cds.gen.notificationtypeproviderservice.Templates;
+
+import com.sap.cds.notifications.assemblers.NotificationTypeAssembler;
import com.sap.cds.services.application.ApplicationLifecycleService;
import com.sap.cds.services.handler.EventHandler;
import com.sap.cds.services.handler.annotations.On;
@@ -21,10 +23,10 @@ public class LocalNotificationTypeAutoProvisionerHandler implements EventHandler
private static final Logger logger =
LoggerFactory.getLogger(LocalNotificationTypeAutoProvisionerHandler.class);
- private final NotificationTypeBuilder notificationTypeBuilder;
+ private final NotificationTypeAssembler notificationTypeBuilder;
public LocalNotificationTypeAutoProvisionerHandler(CdsRuntime runtime) {
- this.notificationTypeBuilder = new NotificationTypeBuilder(runtime);
+ this.notificationTypeBuilder = new NotificationTypeAssembler(runtime);
}
@On(event = ApplicationLifecycleService.EVENT_APPLICATION_PREPARED)
diff --git a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/NotificationTemplateAutoProvisionerHandler.java b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/NotificationTemplateAutoProvisionerHandler.java
new file mode 100644
index 0000000..4ddc142
--- /dev/null
+++ b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/NotificationTemplateAutoProvisionerHandler.java
@@ -0,0 +1,168 @@
+/*
+ * © 2026 SAP SE or an SAP affiliate company and cds-feature-notifications contributors.
+ */
+package com.sap.cds.notifications.handlers;
+
+import cds.gen.notificationtemplateproviderservice.NotificationTemplateProviderService;
+import cds.gen.notificationtemplateproviderservice.NotificationTemplates;
+import cds.gen.notificationtemplateproviderservice.NotificationTemplates_;
+
+import com.sap.cds.notifications.assemblers.NotificationTemplateAssembler;
+import com.sap.cds.ql.Insert;
+import com.sap.cds.ql.Select;
+import com.sap.cds.ql.Update;
+import com.sap.cds.services.application.ApplicationLifecycleService;
+import com.sap.cds.services.handler.EventHandler;
+import com.sap.cds.services.handler.annotations.On;
+import com.sap.cds.services.handler.annotations.ServiceName;
+import com.sap.cds.services.runtime.CdsRuntime;
+import java.util.*;
+import java.util.stream.Collectors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provisions standalone NotificationTemplates to ANS during application startup. Runs during the
+ * APPLICATION_PREPARED lifecycle event. Standalone templates are referenced by Notifications (via
+ * {@code NotificationTemplateKey}).
+ */
+@ServiceName(ApplicationLifecycleService.DEFAULT_NAME)
+public class NotificationTemplateAutoProvisionerHandler implements EventHandler {
+
+ private static final Logger logger =
+ LoggerFactory.getLogger(NotificationTemplateAutoProvisionerHandler.class);
+
+ private final NotificationTemplateAssembler notificationTemplateBuilder;
+ private final NotificationTemplateProviderService notificationTemplateProviderService;
+
+ public NotificationTemplateAutoProvisionerHandler(
+ CdsRuntime runtime,
+ NotificationTemplateProviderService notificationTemplateProviderService) {
+ this.notificationTemplateBuilder = new NotificationTemplateAssembler(runtime);
+ this.notificationTemplateProviderService = notificationTemplateProviderService;
+ }
+
+ @On(event = ApplicationLifecycleService.EVENT_APPLICATION_PREPARED)
+ public void onApplicationPrepared() {
+ logger.info("Auto-provisioning standalone NotificationTemplates from CDS annotations...");
+ try {
+ provisionNotificationTemplates();
+ logger.info("Standalone NotificationTemplate auto-provisioning completed");
+ } catch (IllegalStateException e) {
+ // Developer mistake (e.g. malformed template) — fail hard
+ throw e;
+ } catch (Exception e) {
+ // Transient error (network, ANS down) — log and continue
+ logger.error("Standalone NotificationTemplate auto-provisioning failed", e);
+ }
+ }
+
+ private void provisionNotificationTemplates() {
+ List templates =
+ notificationTemplateBuilder.buildAllNotificationTemplates();
+
+ if (templates.isEmpty()) {
+ logger.info("No standalone NotificationTemplates found in CDS model");
+ return;
+ }
+
+ // Fetch all existing templates from ANS to determine create vs update
+ Set existingTemplateKeys = fetchExistingTemplateKeys();
+ logger.debug("Found {} existing standalone templates in ANS", existingTemplateKeys.size());
+
+ for (NotificationTemplates template : templates) {
+ String key = template.getKey();
+
+ if (existingTemplateKeys.contains(key)) {
+ updateTemplate(template);
+ } else {
+ createTemplate(template);
+ }
+ }
+ }
+
+ /** Fetch all existing template keys from ANS. */
+ private Set fetchExistingTemplateKeys() {
+ try {
+ return notificationTemplateProviderService
+ .run(Select.from(NotificationTemplates_.class).columns(nt -> nt.Key()))
+ .streamOf(NotificationTemplates.class)
+ .map(NotificationTemplates::getKey)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ } catch (Exception e) {
+ logger.warn(
+ "Could not fetch existing standalone templates from ANS: {}", e.getMessage());
+ return Collections.emptySet();
+ }
+ }
+
+ private void createTemplate(NotificationTemplates template) {
+ try {
+ notificationTemplateProviderService.run(
+ Insert.into(NotificationTemplates_.CDS_NAME).entry(template));
+
+ logger.debug(
+ "Standalone NotificationTemplate '{}' created in ANS successfully", template.getKey());
+ } catch (Exception e) {
+ String errorMsg = e.getMessage() != null ? e.getMessage() : "";
+
+ if (errorMsg.contains("409")) {
+ // Race condition: template was created between our GET and INSERT
+ logger.debug(
+ "Standalone template '{}' was created concurrently (409). Attempting update...",
+ template.getKey());
+ updateTemplate(template);
+ return;
+ }
+
+ if (errorMsg.contains("400")) {
+ logger.error(
+ "ANS rejected standalone template '{}' with 400 Bad Request. "
+ + "Check that all required fields (Title in Translation) are set. Error: {}",
+ template.getKey(),
+ errorMsg);
+ throw new IllegalStateException(
+ String.format(
+ "ANS rejected standalone template '%s' with 400 Bad Request. "
+ + "Ensure @notification.template annotations are properly configured. Error: %s",
+ template.getKey(), errorMsg),
+ e);
+ }
+
+ logger.error(
+ "Failed to create standalone template '{}' in ANS", template.getKey(), e);
+ throw e;
+ }
+ }
+
+ private void updateTemplate(NotificationTemplates template) {
+ logger.debug("Updating standalone template '{}'", template.getKey());
+
+ try {
+ notificationTemplateProviderService.run(
+ Update.entity(NotificationTemplates_.CDS_NAME).data(template));
+
+ logger.debug(
+ "Standalone NotificationTemplate '{}' updated in ANS successfully", template.getKey());
+ } catch (Exception e) {
+ String errorMsg = e.getMessage() != null ? e.getMessage() : "";
+
+ if (errorMsg.contains("400")) {
+ logger.error(
+ "ANS rejected standalone template update '{}' with 400 Bad Request. Error: {}",
+ template.getKey(),
+ errorMsg);
+ throw new IllegalStateException(
+ String.format(
+ "ANS rejected standalone template update '%s' with 400 Bad Request. Error: %s",
+ template.getKey(), errorMsg),
+ e);
+ }
+
+ logger.error(
+ "Failed to update standalone template '{}' in ANS", template.getKey(), e);
+ throw e;
+ }
+ }
+}
diff --git a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/NotificationTypeAutoProvisionerHandler.java b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/NotificationTypeAutoProvisionerHandler.java
index f672748..84c82ed 100644
--- a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/NotificationTypeAutoProvisionerHandler.java
+++ b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/NotificationTypeAutoProvisionerHandler.java
@@ -6,6 +6,8 @@
import cds.gen.notificationtypeproviderservice.NotificationTypeProviderService;
import cds.gen.notificationtypeproviderservice.NotificationTypes;
import cds.gen.notificationtypeproviderservice.NotificationTypes_;
+
+import com.sap.cds.notifications.assemblers.NotificationTypeAssembler;
import com.sap.cds.ql.Insert;
import com.sap.cds.ql.Select;
import com.sap.cds.ql.Update;
@@ -25,12 +27,12 @@ public class NotificationTypeAutoProvisionerHandler implements EventHandler {
private static final Logger logger =
LoggerFactory.getLogger(NotificationTypeAutoProvisionerHandler.class);
- private final NotificationTypeBuilder notificationTypeBuilder;
+ private final NotificationTypeAssembler notificationTypeBuilder;
private final NotificationTypeProviderService notificationTypeProviderService;
public NotificationTypeAutoProvisionerHandler(
CdsRuntime runtime, NotificationTypeProviderService notificationTypeProviderService) {
- this.notificationTypeBuilder = new NotificationTypeBuilder(runtime);
+ this.notificationTypeBuilder = new NotificationTypeAssembler(runtime);
this.notificationTypeProviderService = notificationTypeProviderService;
}
@@ -55,7 +57,7 @@ private void provisionNotificationTypes() {
// Fetch ALL existing notification types from ANS in a single call
// to build a reliable Key → Id mapping.
Map existingTypeIds = fetchExistingNotificationTypeIds();
- logger.info("Found {} existing notification types in ANS", existingTypeIds.size());
+ logger.debug("Found {} existing notification types in ANS", existingTypeIds.size());
for (NotificationTypes notificationType : notificationTypes) {
String key = notificationType.getNotificationTypeKey();
@@ -99,7 +101,7 @@ private void createNotificationType(NotificationTypes notificationType) {
notificationTypeProviderService.run(
Insert.into(NotificationTypes_.CDS_NAME).entry(notificationType));
- logger.info(
+ logger.debug(
"NotificationType '{}' created in ANS successfully",
notificationType.getNotificationTypeKey());
} catch (Exception e) {
@@ -108,7 +110,7 @@ private void createNotificationType(NotificationTypes notificationType) {
if (errorMsg.contains("409")) {
// Race condition: type was created between our GET-all and this INSERT.
// Re-fetch this specific type's ID and update.
- logger.info(
+ logger.debug(
"NotificationType '{}' was created concurrently (409). Attempting update...",
notificationType.getNotificationTypeKey());
String id =
@@ -160,7 +162,7 @@ private void createNotificationType(NotificationTypes notificationType) {
private void updateNotificationType(
NotificationTypes notificationType, String notificationTypeId) {
notificationType.setNotificationTypeId(notificationTypeId);
- logger.info(
+ logger.debug(
"Updating NotificationType '{}' (id={})",
notificationType.getNotificationTypeKey(),
notificationTypeId);
@@ -169,7 +171,7 @@ private void updateNotificationType(
notificationTypeProviderService.run(
Update.entity(NotificationTypes_.CDS_NAME).data(notificationType));
- logger.info(
+ logger.debug(
"NotificationType '{}' updated in ANS successfully",
notificationType.getNotificationTypeKey());
} catch (Exception e) {
diff --git a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/ProductionHandler.java b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/ProductionHandler.java
index e75c6e3..10519bb 100644
--- a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/ProductionHandler.java
+++ b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/handlers/ProductionHandler.java
@@ -6,6 +6,8 @@
import cds.gen.notificationproviderservice.NotificationProviderService;
import cds.gen.notificationproviderservice.Notifications;
import cds.gen.notificationproviderservice.Notifications_;
+
+import com.sap.cds.notifications.assemblers.NotificationAssembler;
import com.sap.cds.ql.Insert;
import com.sap.cds.services.EventContext;
import com.sap.cds.services.cds.ApplicationService;
@@ -22,24 +24,24 @@ public class ProductionHandler implements EventHandler {
private static final Logger logger = LoggerFactory.getLogger(ProductionHandler.class);
private final NotificationProviderService notificationProviderService;
- private final NotificationBuilder notificationBuilder;
+ private final NotificationAssembler notificationBuilder;
public ProductionHandler(
NotificationProviderService notificationProviderService, CdsRuntime runtime) {
this.notificationProviderService = notificationProviderService;
- this.notificationBuilder = new NotificationBuilder(runtime);
+ this.notificationBuilder = new NotificationAssembler(runtime);
}
@On(event = "*")
public void postNotifications(EventContext context) {
- List results =
+ List results =
notificationBuilder.buildNotifications(context);
if (results.isEmpty()) {
return;
}
String eventName = results.get(0).eventName();
- logger.info("=== Processing {} notification(s) for event: {} ===", results.size(), eventName);
+ logger.debug("=== Processing {} notification(s) for event: {} ===", results.size(), eventName);
int successCount = 0;
Exception firstError = null;
@@ -66,7 +68,7 @@ public void postNotifications(EventContext context) {
}
}
- logger.info(
+ logger.debug(
"Sent {}/{} notification(s) for event: {}", successCount, results.size(), eventName);
if (firstError != null) {
diff --git a/cds-feature-notifications/src/main/java/com/sap/cds/notifications/helpers/I18nHelper.java b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/helpers/I18nHelper.java
new file mode 100644
index 0000000..ab707a7
--- /dev/null
+++ b/cds-feature-notifications/src/main/java/com/sap/cds/notifications/helpers/I18nHelper.java
@@ -0,0 +1,144 @@
+/*
+ * © 2026 SAP SE or an SAP affiliate company and cds-feature-notifications contributors.
+ */
+package com.sap.cds.notifications.helpers;
+
+import com.sap.cds.adapter.edmx.EdmxI18nProvider;
+import com.sap.cds.reflect.CdsEvent;
+import com.sap.cds.services.runtime.CdsRuntime;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Shared helper for i18n resolution, locale discovery, and HTML template loading. Used by both
+ * NotificationTypeBuilder and NotificationTemplateBuilder to avoid code duplication.
+ */
+public class I18nHelper {
+
+ private static final Logger logger = LoggerFactory.getLogger(I18nHelper.class);
+
+ private final CdsRuntime runtime;
+ private EdmxI18nProvider i18nProvider;
+ private final Map htmlCache = new HashMap<>();
+
+ public I18nHelper(CdsRuntime runtime) {
+ this.runtime = runtime;
+ }
+
+ private EdmxI18nProvider getProvider() {
+ if (i18nProvider == null) {
+ i18nProvider = runtime.getProvider(EdmxI18nProvider.class);
+ }
+ return i18nProvider;
+ }
+
+ /**
+ * Discover available locales from the EdmxI18nProvider. This dynamically detects which languages
+ * have i18n translations defined in the application's _i18n/ properties files, rather than
+ * relying on a hardcoded list. Always includes English as a fallback.
+ *
+ * @since cds-services 4.9.0
+ */
+ public Set getAvailableLocales() {
+ EdmxI18nProvider provider = getProvider();
+ if (provider != null) {
+ Set locales = provider.getLocales();
+ if (!locales.isEmpty()) {
+ return locales;
+ }
+ }
+ logger.warn("EdmxI18nProvider.getLocales() returned no locales, falling back to English only");
+ return Set.of(Locale.ENGLISH);
+ }
+
+ /**
+ * Get i18n texts for a given locale from the EdmxI18nProvider. The provider reads from
+ * edmx/_i18n/i18n.json which is generated by the CDS compiler from _i18n/i18n*.properties files
+ * located next to the .cds source files.
+ */
+ public Map getI18nTexts(Locale locale) {
+ EdmxI18nProvider provider = getProvider();
+ if (provider != null) {
+ return provider.getTexts(locale);
+ }
+ logger.warn("EdmxI18nProvider not available, i18n resolution will not work");
+ return Collections.emptyMap();
+ }
+
+ /** Extract i18n key from annotation value like {i18n>KEY} and resolve using EdmxI18nProvider. */
+ public String resolveAnnotationValue(
+ CdsEvent event, String annotationPath, Map i18nTexts) {
+ String annotationValue =
+ event.findAnnotation(annotationPath).map(a -> (String) a.getValue()).orElse(null);
+
+ if (annotationValue == null) {
+ return null;
+ }
+
+ return resolveI18n(annotationValue, i18nTexts);
+ }
+
+ /**
+ * Resolve all {i18n>KEY} patterns in a string using the i18n texts map. Supports both
+ * single-placeholder values (e.g. "{i18n>TITLE}") and multi-placeholder values (e.g.
+ * "{i18n>GREETING}, {i18n>BODY}").
+ */
+ public String resolveI18n(String value, Map i18nTexts) {
+ if (value == null || !value.contains("{i18n>")) {
+ return value;
+ }
+
+ for (Map.Entry entry : i18nTexts.entrySet()) {
+ value = value.replace("{i18n>" + entry.getKey() + "}", entry.getValue());
+ }
+ return value;
+ }
+
+ /**
+ * Load HTML content from classpath resource and resolve {i18n>KEY} placeholders. HTML content is
+ * cached after first load since only i18n values change per language.
+ */
+ public String loadHtmlFromClasspath(String filePath, Map i18nTexts) {
+ String content =
+ htmlCache.computeIfAbsent(
+ filePath,
+ path -> {
+ try (InputStream is = getClass().getClassLoader().getResourceAsStream(path)) {
+ if (is != null) {
+ return new String(is.readAllBytes(), StandardCharsets.UTF_8);
+ } else {
+ logger.error("HTML file not found: {}", path);
+ return null;
+ }
+ } catch (Exception e) {
+ logger.error("Failed to load HTML file: {}", path, e);
+ return null;
+ }
+ });
+
+ if (content == null) {
+ return null;
+ }
+
+ // Resolve {i18n>KEY} placeholders in the HTML content
+ String resolvedHtml = resolveI18n(content, i18nTexts);
+
+ // Minify HTML: remove comments and unnecessary whitespace
+ String compactHtml =
+ resolvedHtml
+ .replaceAll("(?s)", "")
+ .replaceAll(">\\s+<", "><")
+ .replaceAll("\\s{2,}", " ")
+ .trim();
+
+ logger.debug(
+ "Loaded HTML file: {} (original: {} bytes, resolved+compacted: {} bytes)",
+ filePath,
+ content.length(),
+ compactHtml.length());
+ return compactHtml;
+ }
+}
diff --git a/cds-feature-notifications/src/main/resources/application.yaml b/cds-feature-notifications/src/main/resources/application.yaml
index 7ed0f30..fac6cb3 100644
--- a/cds-feature-notifications/src/main/resources/application.yaml
+++ b/cds-feature-notifications/src/main/resources/application.yaml
@@ -4,14 +4,3 @@ spring:
config:
activate:
on-profile: default
-#cds:
-# remote:
-# services:
-# '[NotificationProviderService]':
-# destination:
-# name: NotificationProviderService
-# type: odata-v2
-# '[NotificationTypeProviderService]':
-# destination:
-# name: NotificationTypeProviderService
-# type: odata-v2
diff --git a/cds-feature-notifications/src/main/resources/cds/com.sap.cds/cds-feature-notifications/NotificationTemplateProviderService.cds b/cds-feature-notifications/src/main/resources/cds/com.sap.cds/cds-feature-notifications/NotificationTemplateProviderService.cds
new file mode 100644
index 0000000..28e6b14
--- /dev/null
+++ b/cds-feature-notifications/src/main/resources/cds/com.sap.cds/cds-feature-notifications/NotificationTemplateProviderService.cds
@@ -0,0 +1,50 @@
+/* checksum : cac3625183c69a17811b517c0646c808 */
+@cds.external : true
+@m.IsDefaultEntityContainer : 'true'
+service NotificationTemplateProviderService {
+ @cds.external : true
+ @cds.persistence.skip : true
+ entity NotificationTemplates {
+ key ![Key] : String not null;
+ CreatedAt : Integer64;
+ UpdatedAt : Integer64;
+ PropertiesSchema : String;
+ OwnerId : String;
+ Visibility : String;
+ BasedOn : String;
+ SanitizeEmails : Boolean;
+ Translations : Association to many Translations { };
+ Tags : Association to many Tags { };
+ };
+
+ @cds.external : true
+ @cds.persistence.skip : true
+ entity Translations {
+ key Language : String not null;
+ Syntax : String;
+ Title : String;
+ Body : String;
+ Preview : String;
+ Email : Email;
+ Description : String;
+ DisplayName : String;
+ Source : String;
+ Event : String;
+ };
+
+ @cds.external : true
+ @cds.persistence.skip : true
+ entity Tags {
+ key ![Key] : String not null;
+ Value : String;
+ };
+
+ @cds.external : true
+ type Email {
+ Subject : String;
+ BodyText : String;
+ BodyHtml : String;
+ SenderName : String;
+ };
+};
+
diff --git a/cds-feature-notifications/src/main/resources/cds/com.sap.cds/cds-feature-notifications/index.cds b/cds-feature-notifications/src/main/resources/cds/com.sap.cds/cds-feature-notifications/index.cds
index 458f1c4..9c3a8cf 100644
--- a/cds-feature-notifications/src/main/resources/cds/com.sap.cds/cds-feature-notifications/index.cds
+++ b/cds-feature-notifications/src/main/resources/cds/com.sap.cds/cds-feature-notifications/index.cds
@@ -1,2 +1,3 @@
using from './NotificationProviderService.cds';
-using from './NotificationTypeProviderService.cds';
\ No newline at end of file
+using from './NotificationTypeProviderService.cds';
+using from './NotificationTemplateProviderService.cds';
\ No newline at end of file
diff --git a/cds-feature-notifications/src/test/java/com/sap/cds/EmptyTest.java b/cds-feature-notifications/src/test/java/com/sap/cds/EmptyTest.java
deleted file mode 100644
index ee0f85c..0000000
--- a/cds-feature-notifications/src/test/java/com/sap/cds/EmptyTest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * © 2026 SAP SE or an SAP affiliate company and cds-feature-notifications contributors.
- */
-package com.sap.cds;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-
-import org.junit.jupiter.api.Test;
-
-/** Unit test for App. */
-class EmptyTest {
-
- @Test
- void testAppMain() {
- assertTrue(true);
- }
-}
diff --git a/cds-feature-notifications/src/test/java/com/sap/cds/notifications/handlers/NotificationBuilderTest.java b/cds-feature-notifications/src/test/java/com/sap/cds/notifications/builders/NotificationBuilderTest.java
similarity index 84%
rename from cds-feature-notifications/src/test/java/com/sap/cds/notifications/handlers/NotificationBuilderTest.java
rename to cds-feature-notifications/src/test/java/com/sap/cds/notifications/builders/NotificationBuilderTest.java
index 8165765..6faa89d 100644
--- a/cds-feature-notifications/src/test/java/com/sap/cds/notifications/handlers/NotificationBuilderTest.java
+++ b/cds-feature-notifications/src/test/java/com/sap/cds/notifications/builders/NotificationBuilderTest.java
@@ -1,11 +1,13 @@
/*
* © 2026 SAP SE or an SAP affiliate company and cds-feature-notifications contributors.
*/
-package com.sap.cds.notifications.handlers;
+package com.sap.cds.notifications.builders;
import static org.junit.jupiter.api.Assertions.*;
import cds.gen.notificationproviderservice.Recipients;
+
+import com.sap.cds.notifications.assemblers.NotificationAssembler;
import com.sap.cds.ql.CQL;
import com.sap.cds.ql.cqn.CqnComparisonPredicate;
import com.sap.cds.ql.cqn.CqnContainmentTest;
@@ -18,7 +20,7 @@
import org.junit.jupiter.params.provider.ValueSource;
/**
- * Unit tests for recipient auto-detection logic in {@link NotificationBuilder}. Covers isUUID,
+ * Unit tests for recipient auto-detection logic in {@link NotificationAssembler}. Covers isUUID,
* isEmail, and createRecipientFromId including edge cases (malformed, null, empty).
*/
class NotificationBuilderTest {
@@ -31,17 +33,17 @@ class IsUUIDTests {
@Test
void validLowercaseUUID() {
- assertTrue(NotificationBuilder.isUUID("550e8400-e29b-41d4-a716-446655440000"));
+ assertTrue(NotificationAssembler.isUUID("550e8400-e29b-41d4-a716-446655440000"));
}
@Test
void validUppercaseUUID() {
- assertTrue(NotificationBuilder.isUUID("550E8400-E29B-41D4-A716-446655440000"));
+ assertTrue(NotificationAssembler.isUUID("550E8400-E29B-41D4-A716-446655440000"));
}
@Test
void validRandomUUID() {
- assertTrue(NotificationBuilder.isUUID(java.util.UUID.randomUUID().toString()));
+ assertTrue(NotificationAssembler.isUUID(java.util.UUID.randomUUID().toString()));
}
@ParameterizedTest
@@ -55,12 +57,12 @@ void validRandomUUID() {
" "
})
void invalidStringsReturnFalse(String value) {
- assertFalse(NotificationBuilder.isUUID(value));
+ assertFalse(NotificationAssembler.isUUID(value));
}
@Test
void nullThrowsNullPointerException() {
- assertThrows(NullPointerException.class, () -> NotificationBuilder.isUUID(null));
+ assertThrows(NullPointerException.class, () -> NotificationAssembler.isUUID(null));
}
}
@@ -81,7 +83,7 @@ class IsEmailTests {
"user123@test-server.example.com"
})
void validEmailsReturnTrue(String email) {
- assertTrue(NotificationBuilder.isEmail(email), "Should accept valid email: " + email);
+ assertTrue(NotificationAssembler.isEmail(email), "Should accept valid email: " + email);
}
@ParameterizedTest
@@ -98,12 +100,12 @@ void validEmailsReturnTrue(String email) {
"550e8400-e29b-41d4-a716-446655440000"
})
void invalidEmailsReturnFalse(String value) {
- assertFalse(NotificationBuilder.isEmail(value), "Should reject invalid email: " + value);
+ assertFalse(NotificationAssembler.isEmail(value), "Should reject invalid email: " + value);
}
@Test
void nullThrowsNullPointerException() {
- assertThrows(NullPointerException.class, () -> NotificationBuilder.isEmail(null));
+ assertThrows(NullPointerException.class, () -> NotificationAssembler.isEmail(null));
}
}
@@ -116,7 +118,7 @@ class CreateRecipientFromIdTests {
@Test
void validUUID_mapsToGlobalUserId() {
String uuid = "550e8400-e29b-41d4-a716-446655440000";
- Recipients recipient = NotificationBuilder.createRecipientFromId(uuid);
+ Recipients recipient = NotificationAssembler.createRecipientFromId(uuid);
assertEquals(uuid, recipient.getGlobalUserId(), "UUID should be mapped to GlobalUserId");
assertNull(recipient.getRecipientId(), "UUID recipient should not have RecipientId");
@@ -125,7 +127,7 @@ void validUUID_mapsToGlobalUserId() {
@Test
void validEmail_mapsToRecipientId() {
String email = "ops-team@example.com";
- Recipients recipient = NotificationBuilder.createRecipientFromId(email);
+ Recipients recipient = NotificationAssembler.createRecipientFromId(email);
assertEquals(email, recipient.getRecipientId(), "Email should be mapped to RecipientId");
assertNull(recipient.getGlobalUserId(), "Email recipient should not have GlobalUserId");
@@ -137,7 +139,7 @@ void unsupportedFormat_throwsIllegalArgumentException(String value) {
IllegalArgumentException ex =
assertThrows(
IllegalArgumentException.class,
- () -> NotificationBuilder.createRecipientFromId(value));
+ () -> NotificationAssembler.createRecipientFromId(value));
assertTrue(
ex.getMessage().contains("Unsupported recipient format"),
"Exception message should mention unsupported format");
@@ -146,14 +148,14 @@ void unsupportedFormat_throwsIllegalArgumentException(String value) {
@Test
void emptyString_throwsIllegalArgumentException() {
assertThrows(
- IllegalArgumentException.class, () -> NotificationBuilder.createRecipientFromId(""));
+ IllegalArgumentException.class, () -> NotificationAssembler.createRecipientFromId(""));
}
@ParameterizedTest
@NullSource
void null_throwsNullPointerException(String value) {
assertThrows(
- NullPointerException.class, () -> NotificationBuilder.createRecipientFromId(value));
+ NullPointerException.class, () -> NotificationAssembler.createRecipientFromId(value));
}
}
@@ -182,7 +184,7 @@ private boolean isMatch(CqnPredicate predicate) {
@Test
void contains_caseSensitive_match() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.ANY,
CQL.val("Hello World"),
CQL.val("World"),
@@ -194,7 +196,7 @@ void contains_caseSensitive_match() {
@Test
void contains_caseSensitive_noMatch() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.ANY,
CQL.val("Hello World"),
CQL.val("world"),
@@ -208,7 +210,7 @@ void contains_caseSensitive_noMatch() {
@Test
void contains_caseInsensitive_match() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.ANY,
CQL.val("production-server"),
CQL.val("PRODUCTION"),
@@ -220,7 +222,7 @@ void contains_caseInsensitive_match() {
@Test
void contains_caseInsensitive_noMatch() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.ANY,
CQL.val("Hello World"),
CQL.val("missing"),
@@ -234,7 +236,7 @@ void contains_caseInsensitive_noMatch() {
@Test
void startsWith_caseSensitive_match() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.START,
CQL.val("CRITICAL-alert"),
CQL.val("CRITICAL"),
@@ -246,7 +248,7 @@ void startsWith_caseSensitive_match() {
@Test
void startsWith_caseSensitive_noMatch() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.START,
CQL.val("CRITICAL-alert"),
CQL.val("critical"),
@@ -260,7 +262,7 @@ void startsWith_caseSensitive_noMatch() {
@Test
void startsWith_caseInsensitive_match() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.START,
CQL.val("CRITICAL-alert"),
CQL.val("critical"),
@@ -272,7 +274,7 @@ void startsWith_caseInsensitive_match() {
@Test
void startsWith_caseInsensitive_noMatch() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.START,
CQL.val("Hello World"),
CQL.val("world"),
@@ -286,7 +288,7 @@ void startsWith_caseInsensitive_noMatch() {
@Test
void endsWith_caseSensitive_match() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.END,
CQL.val("server-PROD"),
CQL.val("-PROD"),
@@ -298,7 +300,7 @@ void endsWith_caseSensitive_match() {
@Test
void endsWith_caseSensitive_noMatch() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.END,
CQL.val("server-PROD"),
CQL.val("-prod"),
@@ -312,7 +314,7 @@ void endsWith_caseSensitive_noMatch() {
@Test
void endsWith_caseInsensitive_match() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.END,
CQL.val("server-PROD"),
CQL.val("-prod"),
@@ -324,7 +326,7 @@ void endsWith_caseInsensitive_match() {
@Test
void endsWith_caseInsensitive_noMatch() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.END,
CQL.val("server-PROD"),
CQL.val("-staging"),
@@ -338,7 +340,7 @@ void endsWith_caseInsensitive_noMatch() {
@Test
void emptyTerm_alwaysMatches() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.ANY, CQL.val("anything"), CQL.val(""), false, null);
assertTrue(isMatch(result));
}
@@ -346,7 +348,7 @@ void emptyTerm_alwaysMatches() {
@Test
void emptyValue_noMatch() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.ANY, CQL.val(""), CQL.val("something"), false, null);
assertFalse(isMatch(result));
}
@@ -354,7 +356,7 @@ void emptyValue_noMatch() {
@Test
void bothEmpty_matches() {
CqnPredicate result =
- NotificationBuilder.evaluateContainment(
+ NotificationAssembler.evaluateContainment(
CqnContainmentTest.Position.ANY, CQL.val(""), CQL.val(""), false, null);
assertTrue(isMatch(result));
}
diff --git a/cds-feature-notifications/src/test/java/com/sap/cds/notifications/helpers/I18nHelperTest.java b/cds-feature-notifications/src/test/java/com/sap/cds/notifications/helpers/I18nHelperTest.java
new file mode 100644
index 0000000..89bac1e
--- /dev/null
+++ b/cds-feature-notifications/src/test/java/com/sap/cds/notifications/helpers/I18nHelperTest.java
@@ -0,0 +1,121 @@
+/*
+ * © 2026 SAP SE or an SAP affiliate company and cds-feature-notifications contributors.
+ */
+package com.sap.cds.notifications.helpers;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import com.sap.cds.adapter.edmx.EdmxI18nProvider;
+import com.sap.cds.services.runtime.CdsRuntime;
+import java.util.Collections;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+class I18nHelperTest {
+
+ private I18nHelper i18nHelper;
+
+ @BeforeEach
+ void setUp() {
+ i18nHelper = new I18nHelper(mock(CdsRuntime.class));
+ }
+
+ @Nested
+ @DisplayName("resolveI18n")
+ class ResolveI18nTests {
+
+ @Test
+ void nullValue_returnsNull() {
+ assertNull(i18nHelper.resolveI18n(null, Map.of()));
+ }
+
+ @Test
+ void noPlaceholder_returnsOriginal() {
+ String input = "Book Order";
+ assertEquals(input, i18nHelper.resolveI18n(input, Map.of("SUBTITLE", "Book Order")));
+ }
+
+ @Test
+ void singlePlaceholder_resolved() {
+ assertEquals(
+ "Book Order",
+ i18nHelper.resolveI18n("{i18n>SUBTITLE}", Map.of("SUBTITLE", "Book Order")));
+ }
+
+ @Test
+ void unknownKey_notReplaced() {
+ String input = "{i18n>UNKNOWN_KEY}";
+ assertEquals(input, i18nHelper.resolveI18n(input, Map.of("SUBTITLE", "Book Order")));
+ }
+
+ @Test
+ void multiplePlaceholders_allResolved() {
+ String input = "{i18n>EMAIL_SUBJECT}: {i18n>SUBTITLE}";
+ assertEquals(
+ "Book Order: Book has been ordered",
+ i18nHelper.resolveI18n(
+ input,
+ Map.of(
+ "EMAIL_SUBJECT", "Book Order",
+ "SUBTITLE", "Book has been ordered")));
+ }
+ }
+
+ @Nested
+ @DisplayName("loadHtmlFromClasspath")
+ class LoadHtmlFromClasspathTests {
+
+ @Test
+ void fileNotFound_returnsNull() {
+ assertNull(i18nHelper.loadHtmlFromClasspath("non/existent/file.html", Map.of()));
+ }
+ }
+
+ @Nested
+ @DisplayName("getAvailableLocales")
+ class GetAvailableLocalesTests {
+
+ @Test
+ void nullProvider_fallsBackToEnglish() {
+ CdsRuntime runtime = mock(CdsRuntime.class);
+ when(runtime.getProvider(EdmxI18nProvider.class)).thenReturn(null);
+ I18nHelper helper = new I18nHelper(runtime);
+
+ Set locales = helper.getAvailableLocales();
+ assertEquals(Set.of(Locale.ENGLISH), locales);
+ }
+
+ @Test
+ void emptyLocalesFromProvider_fallsBackToEnglish() {
+ EdmxI18nProvider provider = mock(EdmxI18nProvider.class);
+ when(provider.getLocales()).thenReturn(Collections.emptySet());
+ CdsRuntime runtime = mock(CdsRuntime.class);
+ when(runtime.getProvider(EdmxI18nProvider.class)).thenReturn(provider);
+ I18nHelper helper = new I18nHelper(runtime);
+
+ Set locales = helper.getAvailableLocales();
+ assertEquals(Set.of(Locale.ENGLISH), locales);
+ }
+ }
+
+ @Nested
+ @DisplayName("getI18nTexts")
+ class GetI18nTextsTests {
+
+ @Test
+ void nullProvider_returnsEmptyMap() {
+ CdsRuntime runtime = mock(CdsRuntime.class);
+ when(runtime.getProvider(EdmxI18nProvider.class)).thenReturn(null);
+ I18nHelper helper = new I18nHelper(runtime);
+
+ assertTrue(helper.getI18nTexts(Locale.ENGLISH).isEmpty());
+ }
+ }
+}
diff --git a/cds-feature-notifications/srv/external/NotificationTemplateProviderService.cds b/cds-feature-notifications/srv/external/NotificationTemplateProviderService.cds
new file mode 100644
index 0000000..28e6b14
--- /dev/null
+++ b/cds-feature-notifications/srv/external/NotificationTemplateProviderService.cds
@@ -0,0 +1,50 @@
+/* checksum : cac3625183c69a17811b517c0646c808 */
+@cds.external : true
+@m.IsDefaultEntityContainer : 'true'
+service NotificationTemplateProviderService {
+ @cds.external : true
+ @cds.persistence.skip : true
+ entity NotificationTemplates {
+ key ![Key] : String not null;
+ CreatedAt : Integer64;
+ UpdatedAt : Integer64;
+ PropertiesSchema : String;
+ OwnerId : String;
+ Visibility : String;
+ BasedOn : String;
+ SanitizeEmails : Boolean;
+ Translations : Association to many Translations { };
+ Tags : Association to many Tags { };
+ };
+
+ @cds.external : true
+ @cds.persistence.skip : true
+ entity Translations {
+ key Language : String not null;
+ Syntax : String;
+ Title : String;
+ Body : String;
+ Preview : String;
+ Email : Email;
+ Description : String;
+ DisplayName : String;
+ Source : String;
+ Event : String;
+ };
+
+ @cds.external : true
+ @cds.persistence.skip : true
+ entity Tags {
+ key ![Key] : String not null;
+ Value : String;
+ };
+
+ @cds.external : true
+ type Email {
+ Subject : String;
+ BodyText : String;
+ BodyHtml : String;
+ SenderName : String;
+ };
+};
+
diff --git a/cds-feature-notifications/srv/external/NotificationTemplateProviderService.xml b/cds-feature-notifications/srv/external/NotificationTemplateProviderService.xml
new file mode 100644
index 0000000..d1a14fc
--- /dev/null
+++ b/cds-feature-notifications/srv/external/NotificationTemplateProviderService.xml
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index d7ff780..662cafe 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,9 +15,9 @@
}
},
"node_modules/@eslint-community/eslint-utils": {
- "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==",
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -33,6 +33,19 @@
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
}
},
+ "node_modules/@eslint-community/eslint-utils/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/@eslint-community/regexpp": {
"version": "4.12.2",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
@@ -44,15 +57,15 @@
}
},
"node_modules/@eslint/config-array": {
- "version": "0.21.1",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
- "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
+ "version": "0.21.2",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz",
+ "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
"@eslint/object-schema": "^2.1.7",
"debug": "^4.3.1",
- "minimatch": "^3.1.2"
+ "minimatch": "^3.1.5"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -71,7 +84,7 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@eslint/core": {
+ "node_modules/@eslint/config-helpers/node_modules/@eslint/core": {
"version": "0.17.0",
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
"integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
@@ -84,21 +97,34 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
+ "node_modules/@eslint/core": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
+ "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
"node_modules/@eslint/eslintrc": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
- "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz",
+ "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "ajv": "^6.12.4",
+ "ajv": "^6.14.0",
"debug": "^4.3.2",
"espree": "^10.0.1",
"globals": "^14.0.0",
"ignore": "^5.2.0",
"import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
+ "js-yaml": "^4.1.1",
+ "minimatch": "^3.1.5",
"strip-json-comments": "^3.1.1"
},
"engines": {
@@ -109,9 +135,9 @@
}
},
"node_modules/@eslint/js": {
- "version": "9.39.1",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz",
- "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==",
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz",
+ "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -132,43 +158,57 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
- "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz",
+ "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@eslint/core": "^0.17.0",
+ "@eslint/core": "^1.2.1",
"levn": "^0.4.1"
},
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
"node_modules/@humanfs/core": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
- "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
"dev": true,
"license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/types": "^0.15.0"
+ },
"engines": {
"node": ">=18.18.0"
}
},
"node_modules/@humanfs/node": {
- "version": "0.16.7",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
- "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@humanfs/core": "^0.19.1",
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
"@humanwhocodes/retry": "^0.4.0"
},
"engines": {
"node": ">=18.18.0"
}
},
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
"node_modules/@humanwhocodes/module-importer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -197,74 +237,23 @@
"url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@sap/cds": {
- "version": "9.4.4",
- "resolved": "https://registry.npmjs.org/@sap/cds/-/cds-9.4.4.tgz",
- "integrity": "sha512-JJCHeEJF4xzFyZSf2ToocvVE9dyHfNLTRXOauOxlmpfyaLg97G7Qp+L4bD132eB0onBG9bQj3eH8DzBm0hVvIw==",
- "dev": true,
- "license": "SEE LICENSE IN LICENSE",
- "peer": true,
- "dependencies": {
- "@sap/cds-compiler": "^6.3",
- "@sap/cds-fiori": "^2",
- "js-yaml": "^4.1.0"
- },
- "bin": {
- "cds-deploy": "bin/deploy.js",
- "cds-serve": "bin/serve.js"
- },
- "engines": {
- "node": ">=20"
- },
- "peerDependencies": {
- "@eslint/js": "^9",
- "express": "^4",
- "tar": "^7"
- },
- "peerDependenciesMeta": {
- "express": {
- "optional": true
- },
- "tar": {
- "optional": true
- }
- }
- },
- "node_modules/@sap/cds-compiler": {
- "version": "6.4.6",
- "resolved": "https://registry.npmjs.org/@sap/cds-compiler/-/cds-compiler-6.4.6.tgz",
- "integrity": "sha512-auAjRh9t0KKj4LiGAr/fxikZRIngx9YXVHTJWf0LeaGv0ZpYOi6iWbSnU1XRB2e6hsf+Ou1w5oTOHooC5sZfog==",
- "dev": true,
- "license": "SEE LICENSE IN LICENSE",
- "peer": true,
- "bin": {
- "cdsc": "bin/cdsc.js",
- "cdshi": "bin/cdshi.js",
- "cdsse": "bin/cdsse.js"
- },
- "engines": {
- "node": ">=20"
- }
- },
"node_modules/@sap/cds-dk": {
- "version": "9.4.2",
- "resolved": "https://registry.npmjs.org/@sap/cds-dk/-/cds-dk-9.4.2.tgz",
- "integrity": "sha512-umNz4D30a/Oh3cFQU1wK8rxoIOBQrBiUs/k6OfG2ibQaF/rGOXz8N8lGzkY7pC535RJbtJ31OwNjKAcLGrchVQ==",
+ "version": "9.9.1",
+ "resolved": "https://registry.npmjs.org/@sap/cds-dk/-/cds-dk-9.9.1.tgz",
+ "integrity": "sha512-cZoHI/ZhEVffmLo2k9Y/HMR5X+aGCpk60PwJJcZgoat8Kwk6dDl3mUDERhZORQUhp9FwOiyWmNujmNCV8YWWCg==",
"dev": true,
"hasShrinkwrap": true,
"license": "SEE LICENSE IN LICENSE",
"dependencies": {
"@cap-js/asyncapi": "^1.0.0",
"@cap-js/openapi": "^1.0.0",
- "@sap/cds": ">=8.3",
- "@sap/cds-mtxs": ">=2",
+ "@sap/cds": "^8.3 || ^9",
+ "@sap/cds-mtxs": "^2 || ^3",
"@sap/hdi-deploy": "^5",
- "axios": "^1",
- "express": "^4.17.3",
- "hdb": "^0",
+ "express": "^4.22.1 || ^5",
+ "hdb": "^2.0.0",
"livereload-js": "^4.0.1",
"mustache": "^4.0.1",
- "node-watch": ">=0.7",
"ws": "^8.4.2",
"xml-js": "^1.6.11",
"yaml": "^2"
@@ -288,8 +277,8 @@
}
},
"node_modules/@sap/cds-dk/node_modules/@cap-js/db-service": {
- "version": "2.5.1",
- "integrity": "sha512-dpz9lvOepcXOgE8uTs9abCotLcCt1odpwlrUT4AW2pnSrMB0EVMRbHKVIlufmrm8Kh/Y5c2d6ODald8eahsEDw==",
+ "version": "2.11.0",
+ "integrity": "sha512-sl33LcxZYAJgMCQZDw4lMGe4kWYq6685Xc6ze4qcoM+rd6aqiyVsSC6C7XH5yerXs7cVHhRC+Dgo8AsaapFzlQ==",
"dev": true,
"license": "Apache-2.0",
"optional": true,
@@ -297,12 +286,12 @@
"generic-pool": "^3.9.0"
},
"peerDependencies": {
- "@sap/cds": ">=9"
+ "@sap/cds": ">=9.8"
}
},
"node_modules/@sap/cds-dk/node_modules/@cap-js/openapi": {
- "version": "1.2.3",
- "integrity": "sha512-UnEUBrBIjMvYYJTtAmSrnWLKIjnaK9KcCS6pPoVBRgZrMaL0bl/aB3KMH4xzc6LWjtbxzlyI71XC7No4+SKerg==",
+ "version": "1.4.0",
+ "integrity": "sha512-/LRSwn4SDxAi3qKwl09zoOhEVGaPGlYOPz/0S3UBnaMJVvaLyPiKbbaOtOnrrgulUX5OXt+ujPIQznOsbTzuAw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -313,41 +302,55 @@
}
},
"node_modules/@sap/cds-dk/node_modules/@cap-js/sqlite": {
- "version": "2.0.3",
- "integrity": "sha512-Zm2JLpPuddFkeqM47TX7V7IC6x3WOfn5lTRbaiVOMvRQoshCNXTkjv083ssfiwF/jF/46/PSVox+fTElozg6XA==",
+ "version": "2.4.0",
+ "integrity": "sha512-Ao+AzIN6BWHNpLbGxAzF79OezFNHzDG2srwiBABs0FYxIxEGkc2hg6ETo79pTTt66gcWtx7pWh/N9xk2M6SFBQ==",
"dev": true,
"license": "Apache-2.0",
"optional": true,
"dependencies": {
- "@cap-js/db-service": "^2",
+ "@cap-js/db-service": "^2.11.0",
"better-sqlite3": "^12.0.0"
},
"peerDependencies": {
- "@sap/cds": ">=9"
+ "@sap/cds": ">=9.8",
+ "sql.js": "^1.13.0"
+ },
+ "peerDependenciesMeta": {
+ "sql.js": {
+ "optional": true
+ }
}
},
"node_modules/@sap/cds-dk/node_modules/@eslint/js": {
- "version": "9.38.0",
- "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==",
- "dev": true,
+ "version": "10.0.1",
+ "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
+ "extraneous": true,
"license": "MIT",
- "peer": true,
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "eslint": "^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
}
},
"node_modules/@sap/cds-dk/node_modules/@sap/cds": {
- "version": "9.4.4",
- "integrity": "sha512-JJCHeEJF4xzFyZSf2ToocvVE9dyHfNLTRXOauOxlmpfyaLg97G7Qp+L4bD132eB0onBG9bQj3eH8DzBm0hVvIw==",
+ "version": "9.9.1",
+ "integrity": "sha512-GqdsBsRkZThhpOyzj8ihf/jDmf/2zprZFgaun6ZymUw4/ahzjK/bbdd6eQ8txDuv88pnUl2HPFjvUVq3O/6hCA==",
"dev": true,
"license": "SEE LICENSE IN LICENSE",
"dependencies": {
- "@sap/cds-compiler": "^6.3",
+ "@sap/cds-compiler": "^6.4",
"@sap/cds-fiori": "^2",
- "js-yaml": "^4.1.0"
+ "express": "^4.22.1 || ^5",
+ "yaml": "^2"
},
"bin": {
"cds-deploy": "bin/deploy.js",
@@ -357,22 +360,18 @@
"node": ">=20"
},
"peerDependencies": {
- "@eslint/js": "^9",
- "express": "^4",
- "tar": "^7"
+ "@eslint/js": "^9 || ^10",
+ "tar": "^7.5.6"
},
"peerDependenciesMeta": {
- "express": {
- "optional": true
- },
"tar": {
"optional": true
}
}
},
"node_modules/@sap/cds-dk/node_modules/@sap/cds-compiler": {
- "version": "6.4.2",
- "integrity": "sha512-kjhq8GxzCLIfsM4aln9saxkifPC26MYuAqT82QB7RGZDVFM5Pw09Dp6TcKCSp65hut0YgHkvHlVGWMZWWBJNdA==",
+ "version": "6.9.1",
+ "integrity": "sha512-j5C61t1mPhMW3vpD3LIRVn40DMiIF2XahOPeJIPjRpUiGMbQPdVreqAhiRHg39GYhSK6etlr5/MIx3a2ljtqHg==",
"dev": true,
"license": "SEE LICENSE IN LICENSE",
"bin": {
@@ -385,18 +384,17 @@
}
},
"node_modules/@sap/cds-dk/node_modules/@sap/cds-fiori": {
- "version": "2.1.0",
- "integrity": "sha512-EoNtPT5aVurxwsqHQfW2FgnXA3Ysu9GvihR0jTQNUZ4pVlHHFkfFehH6G2DIHKyfTROWaahegJsMpiwpE8clkg==",
+ "version": "2.3.0",
+ "integrity": "sha512-6oWov+DSpFrSTgxXR0dZhak6aZ/IVRZvaHERMi0EgSTzIJdlvZlpw3Kf18ePMcTrRrtEXwD4RIjKt8pbs0g2Hg==",
"dev": true,
"license": "SEE LICENSE IN LICENSE",
"peerDependencies": {
- "@sap/cds": ">=8",
- "express": "^4"
+ "@sap/cds": ">=8"
}
},
"node_modules/@sap/cds-dk/node_modules/@sap/cds-mtxs": {
- "version": "3.4.2",
- "integrity": "sha512-bpKHKbehDSZpe9IoY1Vn2LQ5kgQns6RdlMsTOE9rw9zP//Yq5hFtl7SKFEM0A0/+WL3E+Rp/7Y2tc76erKYqdA==",
+ "version": "3.9.0",
+ "integrity": "sha512-U9H9NXQxlxSNwSD/6U59+Egn9LIE2SRdu8i5bZqEG2GB4xEU6csduy0kY4EWvi8XXD8onbFSgw4AA9SB4pN0Yg==",
"dev": true,
"license": "SEE LICENSE IN LICENSE",
"dependencies": {
@@ -407,7 +405,7 @@
"cds-mtx-migrate": "bin/cds-mtx-migrate.js"
},
"peerDependencies": {
- "@sap/cds": "^9"
+ "@sap/cds": ">=9"
}
},
"node_modules/@sap/cds-dk/node_modules/@sap/hdi": {
@@ -435,13 +433,13 @@
}
},
"node_modules/@sap/cds-dk/node_modules/@sap/hdi-deploy": {
- "version": "5.5.1",
- "integrity": "sha512-5r9SIkXX7cO+MwRFF32O566sMx6LP1mLin0eT9F+Adqy+0SrdwkWv4JslQzYetiWLuNsfqQljcao62alaxts8A==",
+ "version": "5.6.1",
+ "integrity": "sha512-+qQ7qwG8lko303L5yRj2dud/nDAVuVblV/mmzJT44oPbF0Nry18eD2LUS23hFeuxjRa7rYK5YKQ8ffGgWxVrYQ==",
"dev": true,
"license": "See LICENSE file",
"dependencies": {
"@sap/hdi": "^4.8.0",
- "@sap/xsenv": "^5.2.0",
+ "@sap/xsenv": "^6.0.0",
"async": "^3.2.6",
"dotenv": "^16.4.5",
"handlebars": "^4.7.8",
@@ -464,44 +462,32 @@
}
},
"node_modules/@sap/cds-dk/node_modules/@sap/xsenv": {
- "version": "5.6.1",
- "integrity": "sha512-4pDpsYLNJsLUBWtTSG+TJ8ul5iY0dWDyJgTy2H/WZGZww9CSPLP/39x+syDDTjkggsmZAlo9t7y9TiXMmtAunw==",
+ "version": "6.2.0",
+ "integrity": "sha512-8jrsX1OAM3YUqGU+4deggqvkxrBrHAPYEllBX0YJfWNffgxSZKHG75bRd/RV6hxPwulPL0DeHfd2eYJMeY5gdw==",
"dev": true,
"license": "SEE LICENSE IN LICENSE file",
"dependencies": {
- "debug": "4.4.0",
+ "debug": "4.4.3",
"node-cache": "^5.1.2",
"verror": "1.10.1"
},
"engines": {
- "node": "^18.0.0 || ^20.0.0 || ^22.0.0"
+ "node": "^20.0.0 || ^22.0.0 || ^24.0.0"
}
},
"node_modules/@sap/cds-dk/node_modules/accepts": {
- "version": "1.3.8",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "version": "2.0.0",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
"dev": true,
"license": "MIT",
"dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
},
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/@sap/cds-dk/node_modules/argparse": {
- "version": "2.0.1",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
- },
- "node_modules/@sap/cds-dk/node_modules/array-flatten": {
- "version": "1.1.1",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@sap/cds-dk/node_modules/assert-plus": {
"version": "1.0.0",
"integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
@@ -517,23 +503,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/@sap/cds-dk/node_modules/asynckit": {
- "version": "0.4.0",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@sap/cds-dk/node_modules/axios": {
- "version": "1.12.2",
- "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "follow-redirects": "^1.15.6",
- "form-data": "^4.0.4",
- "proxy-from-env": "^1.1.0"
- }
- },
"node_modules/@sap/cds-dk/node_modules/base64-js": {
"version": "1.5.1",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
@@ -556,8 +525,8 @@
"optional": true
},
"node_modules/@sap/cds-dk/node_modules/better-sqlite3": {
- "version": "12.4.1",
- "integrity": "sha512-3yVdyZhklTiNrtg+4WqHpJpFDd+WHTg2oM7UcR80GqL05AOV0xEJzc6qNvFYoEtE+hRp1n9MpN6/+4yhlGkDXQ==",
+ "version": "12.9.0",
+ "integrity": "sha512-wqUv4Gm3toFpHDQmaKD4QhZm3g1DjUBI0yzS4UBl6lElUmXFYdTQmmEDpAFa5o8FiFiymURypEnfVHzILKaxqQ==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -567,7 +536,7 @@
"prebuild-install": "^7.1.1"
},
"engines": {
- "node": "20.x || 22.x || 23.x || 24.x"
+ "node": "20.x || 22.x || 23.x || 24.x || 25.x"
}
},
"node_modules/@sap/cds-dk/node_modules/bindings": {
@@ -593,44 +562,29 @@
}
},
"node_modules/@sap/cds-dk/node_modules/body-parser": {
- "version": "1.20.3",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "version": "2.2.2",
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.3",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.7.0",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.1",
+ "raw-body": "^3.0.1",
+ "type-is": "^2.0.1"
},
"engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/@sap/cds-dk/node_modules/body-parser/node_modules/debug": {
- "version": "2.6.9",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/@sap/cds-dk/node_modules/body-parser/node_modules/ms": {
- "version": "2.0.0",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@sap/cds-dk/node_modules/braces": {
"version": "3.0.3",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
@@ -722,28 +676,17 @@
"node": ">=0.8"
}
},
- "node_modules/@sap/cds-dk/node_modules/combined-stream": {
- "version": "1.0.8",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/@sap/cds-dk/node_modules/content-disposition": {
- "version": "0.5.4",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "version": "1.1.0",
+ "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
"engines": {
- "node": ">= 0.6"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/@sap/cds-dk/node_modules/content-type": {
@@ -756,8 +699,8 @@
}
},
"node_modules/@sap/cds-dk/node_modules/cookie": {
- "version": "0.7.1",
- "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "version": "0.7.2",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
"dev": true,
"license": "MIT",
"engines": {
@@ -765,10 +708,13 @@
}
},
"node_modules/@sap/cds-dk/node_modules/cookie-signature": {
- "version": "1.0.6",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "version": "1.2.2",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.6.0"
+ }
},
"node_modules/@sap/cds-dk/node_modules/core-util-is": {
"version": "1.0.2",
@@ -777,8 +723,8 @@
"license": "MIT"
},
"node_modules/@sap/cds-dk/node_modules/debug": {
- "version": "4.4.0",
- "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "version": "4.4.3",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -819,15 +765,6 @@
"node": ">=4.0.0"
}
},
- "node_modules/@sap/cds-dk/node_modules/delayed-stream": {
- "version": "1.0.0",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.4.0"
- }
- },
"node_modules/@sap/cds-dk/node_modules/depd": {
"version": "2.0.0",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
@@ -837,16 +774,6 @@
"node": ">= 0.8"
}
},
- "node_modules/@sap/cds-dk/node_modules/destroy": {
- "version": "1.2.0",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
"node_modules/@sap/cds-dk/node_modules/detect-libc": {
"version": "2.1.2",
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
@@ -938,21 +865,6 @@
"node": ">= 0.4"
}
},
- "node_modules/@sap/cds-dk/node_modules/es-set-tostringtag": {
- "version": "2.1.0",
- "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.6",
- "has-tostringtag": "^1.0.2",
- "hasown": "^2.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/@sap/cds-dk/node_modules/escape-html": {
"version": "1.0.3",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
@@ -979,66 +891,48 @@
}
},
"node_modules/@sap/cds-dk/node_modules/express": {
- "version": "4.21.2",
- "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.3",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.7.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.3.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.3",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.12",
- "proxy-addr": "~2.0.7",
- "qs": "6.13.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.19.0",
- "serve-static": "1.16.2",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
+ "version": "5.2.1",
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.1",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/express"
}
},
- "node_modules/@sap/cds-dk/node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/@sap/cds-dk/node_modules/express/node_modules/ms": {
- "version": "2.0.0",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@sap/cds-dk/node_modules/extsprintf": {
"version": "1.4.1",
"integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==",
@@ -1068,72 +962,24 @@
}
},
"node_modules/@sap/cds-dk/node_modules/finalhandler": {
- "version": "1.3.1",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "version": "2.1.1",
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
},
"engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/@sap/cds-dk/node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/@sap/cds-dk/node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@sap/cds-dk/node_modules/follow-redirects": {
- "version": "1.15.11",
- "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/@sap/cds-dk/node_modules/form-data": {
- "version": "4.0.4",
- "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "es-set-tostringtag": "^2.1.0",
- "hasown": "^2.0.2",
- "mime-types": "^2.1.12"
+ "node": ">= 18.0.0"
},
- "engines": {
- "node": ">= 6"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/@sap/cds-dk/node_modules/forwarded": {
@@ -1146,12 +992,12 @@
}
},
"node_modules/@sap/cds-dk/node_modules/fresh": {
- "version": "0.5.2",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "version": "2.0.0",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.8"
}
},
"node_modules/@sap/cds-dk/node_modules/fs-constants": {
@@ -1237,8 +1083,8 @@
}
},
"node_modules/@sap/cds-dk/node_modules/handlebars": {
- "version": "4.7.8",
- "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
+ "version": "4.7.9",
+ "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1269,24 +1115,9 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/@sap/cds-dk/node_modules/has-tostringtag": {
- "version": "1.0.2",
- "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-symbols": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/@sap/cds-dk/node_modules/hasown": {
- "version": "2.0.2",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "version": "2.0.3",
+ "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -1297,43 +1128,70 @@
}
},
"node_modules/@sap/cds-dk/node_modules/hdb": {
- "version": "0.19.12",
- "integrity": "sha512-vv+cjmvr6fNH/s0Q2zOZc4sEjMpSC0KuacFn8dp3L38qM3RA2LLeX70wWhZLESpwvwUf1pQkRfUhZeooFSmv3A==",
+ "version": "2.27.1",
+ "integrity": "sha512-xYL/W+fq2TyGHyzm8muolQnw8tdh4+2NQ8mQP2FpLSuhfJ8l0jQNSUZoAXic7NfMEan1Jvf8V1L4blwkgTc6+A==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "iconv-lite": "^0.4.18"
+ "iconv-lite": "0.7.0"
},
"engines": {
- "node": ">= 0.12"
- }
- },
- "node_modules/@sap/cds-dk/node_modules/http-errors": {
- "version": "2.0.0",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
+ "node": ">= 18"
},
- "engines": {
- "node": ">= 0.8"
+ "optionalDependencies": {
+ "lz4-wasm-nodejs": "0.9.2"
}
},
- "node_modules/@sap/cds-dk/node_modules/iconv-lite": {
- "version": "0.4.24",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "node_modules/@sap/cds-dk/node_modules/hdb/node_modules/iconv-lite": {
+ "version": "0.7.0",
+ "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/@sap/cds-dk/node_modules/http-errors": {
+ "version": "2.0.1",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/@sap/cds-dk/node_modules/iconv-lite": {
+ "version": "0.7.2",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/@sap/cds-dk/node_modules/ieee754": {
@@ -1388,17 +1246,11 @@
"node": ">=0.12.0"
}
},
- "node_modules/@sap/cds-dk/node_modules/js-yaml": {
- "version": "4.1.0",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "node_modules/@sap/cds-dk/node_modules/is-promise": {
+ "version": "4.0.0",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
+ "license": "MIT"
},
"node_modules/@sap/cds-dk/node_modules/livereload-js": {
"version": "4.0.2",
@@ -1406,6 +1258,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@sap/cds-dk/node_modules/lz4-wasm-nodejs": {
+ "version": "0.9.2",
+ "integrity": "sha512-hSwgJPS98q/Oe/89Y1OxzeA/UdnASG8GvldRyKa7aZyoAFCC8VPRtViBSava7wWC66WocjUwBpWau2rEmyFPsw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
"node_modules/@sap/cds-dk/node_modules/math-intrinsics": {
"version": "1.1.0",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
@@ -1416,32 +1275,26 @@
}
},
"node_modules/@sap/cds-dk/node_modules/media-typer": {
- "version": "0.3.0",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "version": "1.1.0",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
"dev": true,
"license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.8"
}
},
"node_modules/@sap/cds-dk/node_modules/merge-descriptors": {
- "version": "1.0.3",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "version": "2.0.0",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
"dev": true,
"license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@sap/cds-dk/node_modules/methods": {
- "version": "1.1.2",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
"node_modules/@sap/cds-dk/node_modules/micromatch": {
"version": "4.0.8",
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
@@ -1456,8 +1309,8 @@
}
},
"node_modules/@sap/cds-dk/node_modules/micromatch/node_modules/picomatch": {
- "version": "2.3.1",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "version": "2.3.2",
+ "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1467,21 +1320,9 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/@sap/cds-dk/node_modules/mime": {
- "version": "1.6.0",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/@sap/cds-dk/node_modules/mime-db": {
- "version": "1.52.0",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "version": "1.54.0",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1489,15 +1330,19 @@
}
},
"node_modules/@sap/cds-dk/node_modules/mime-types": {
- "version": "2.1.35",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "version": "3.0.2",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
"dev": true,
"license": "MIT",
"dependencies": {
- "mime-db": "1.52.0"
+ "mime-db": "^1.54.0"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/@sap/cds-dk/node_modules/mimic-response": {
@@ -1552,8 +1397,8 @@
"optional": true
},
"node_modules/@sap/cds-dk/node_modules/negotiator": {
- "version": "0.6.3",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "version": "1.0.0",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -1567,8 +1412,8 @@
"license": "MIT"
},
"node_modules/@sap/cds-dk/node_modules/node-abi": {
- "version": "3.78.0",
- "integrity": "sha512-E2wEyrgX/CqvicaQYU3Ze1PFGjc4QYPGsjUrlYkqAE0WjHEZwgOsGMPMzkMse4LjJbDmaEuDX3CM036j5K2DSQ==",
+ "version": "3.92.0",
+ "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -1591,15 +1436,6 @@
"node": ">= 8.0.0"
}
},
- "node_modules/@sap/cds-dk/node_modules/node-watch": {
- "version": "0.7.4",
- "integrity": "sha512-RinNxoz4W1cep1b928fuFhvAQ5ag/+1UlMDV7rbyGthBIgsiEouS4kvRayvvboxii4m8eolKOIBo3OjDqbc+uQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
"node_modules/@sap/cds-dk/node_modules/object-inspect": {
"version": "1.13.4",
"integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
@@ -1629,7 +1465,6 @@
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"dev": true,
"license": "ISC",
- "optional": true,
"dependencies": {
"wrappy": "1"
}
@@ -1644,10 +1479,14 @@
}
},
"node_modules/@sap/cds-dk/node_modules/path-to-regexp": {
- "version": "0.1.12",
- "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
+ "version": "8.4.2",
+ "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
},
"node_modules/@sap/cds-dk/node_modules/pluralize": {
"version": "8.0.0",
@@ -1661,6 +1500,7 @@
"node_modules/@sap/cds-dk/node_modules/prebuild-install": {
"version": "7.1.3",
"integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
+ "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.",
"dev": true,
"license": "MIT",
"optional": true,
@@ -1698,15 +1538,9 @@
"node": ">= 0.10"
}
},
- "node_modules/@sap/cds-dk/node_modules/proxy-from-env": {
- "version": "1.1.0",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@sap/cds-dk/node_modules/pump": {
- "version": "3.0.3",
- "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "version": "3.0.4",
+ "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
"dev": true,
"license": "MIT",
"optional": true,
@@ -1716,12 +1550,12 @@
}
},
"node_modules/@sap/cds-dk/node_modules/qs": {
- "version": "6.13.0",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "version": "6.15.1",
+ "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
- "side-channel": "^1.0.6"
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">=0.6"
@@ -1740,18 +1574,18 @@
}
},
"node_modules/@sap/cds-dk/node_modules/raw-body": {
- "version": "2.5.2",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "version": "3.0.2",
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.7.0",
+ "unpipe": "~1.0.0"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">= 0.10"
}
},
"node_modules/@sap/cds-dk/node_modules/rc": {
@@ -1785,6 +1619,22 @@
"node": ">= 6"
}
},
+ "node_modules/@sap/cds-dk/node_modules/router": {
+ "version": "2.2.0",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
"node_modules/@sap/cds-dk/node_modules/safe-buffer": {
"version": "5.2.1",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
@@ -1803,7 +1653,8 @@
"url": "https://feross.org/support"
}
],
- "license": "MIT"
+ "license": "MIT",
+ "optional": true
},
"node_modules/@sap/cds-dk/node_modules/safer-buffer": {
"version": "2.1.2",
@@ -1812,14 +1663,17 @@
"license": "MIT"
},
"node_modules/@sap/cds-dk/node_modules/sax": {
- "version": "1.4.1",
- "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+ "version": "1.6.0",
+ "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==",
"dev": true,
- "license": "ISC"
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=11.0.0"
+ }
},
"node_modules/@sap/cds-dk/node_modules/semver": {
- "version": "7.7.3",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.7.4",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
"dev": true,
"license": "ISC",
"optional": true,
@@ -1831,66 +1685,48 @@
}
},
"node_modules/@sap/cds-dk/node_modules/send": {
- "version": "0.19.0",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "version": "1.2.1",
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
+ "debug": "^4.4.3",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.1",
+ "mime-types": "^3.0.2",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.2"
},
"engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/@sap/cds-dk/node_modules/send/node_modules/debug": {
- "version": "2.6.9",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/@sap/cds-dk/node_modules/send/node_modules/debug/node_modules/ms": {
- "version": "2.0.0",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@sap/cds-dk/node_modules/send/node_modules/encodeurl": {
- "version": "1.0.2",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8"
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/@sap/cds-dk/node_modules/serve-static": {
- "version": "1.16.2",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "version": "2.2.1",
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.19.0"
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/@sap/cds-dk/node_modules/setprototypeof": {
@@ -1919,13 +1755,13 @@
}
},
"node_modules/@sap/cds-dk/node_modules/side-channel-list": {
- "version": "1.0.0",
- "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "version": "1.0.1",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
- "object-inspect": "^1.13.3"
+ "object-inspect": "^1.13.4"
},
"engines": {
"node": ">= 0.4"
@@ -2028,8 +1864,8 @@
}
},
"node_modules/@sap/cds-dk/node_modules/statuses": {
- "version": "2.0.1",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "version": "2.0.2",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2121,13 +1957,14 @@
}
},
"node_modules/@sap/cds-dk/node_modules/type-is": {
- "version": "1.6.18",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "version": "2.0.1",
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
},
"engines": {
"node": ">= 0.6"
@@ -2162,15 +1999,6 @@
"license": "MIT",
"optional": true
},
- "node_modules/@sap/cds-dk/node_modules/utils-merge": {
- "version": "1.0.1",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4.0"
- }
- },
"node_modules/@sap/cds-dk/node_modules/vary": {
"version": "1.1.2",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
@@ -2204,12 +2032,11 @@
"version": "1.0.2",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
"dev": true,
- "license": "ISC",
- "optional": true
+ "license": "ISC"
},
"node_modules/@sap/cds-dk/node_modules/ws": {
- "version": "8.18.3",
- "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==",
+ "version": "8.20.0",
+ "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2241,8 +2068,8 @@
}
},
"node_modules/@sap/cds-dk/node_modules/yaml": {
- "version": "2.8.1",
- "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==",
+ "version": "2.8.4",
+ "integrity": "sha512-ml/JPOj9fOQK8RNnWojA67GbZ0ApXAUlN2UQclwv2eVgTgn7O9gg9o7paZWKMp4g0H3nTLtS9LVzhkpOFIKzog==",
"dev": true,
"license": "ISC",
"bin": {
@@ -2250,41 +2077,37 @@
},
"engines": {
"node": ">= 14.6"
- }
- },
- "node_modules/@sap/cds-fiori": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@sap/cds-fiori/-/cds-fiori-2.1.1.tgz",
- "integrity": "sha512-X+4v4LBAT8HIt0zr28/kJNS15nlNlcM97vAMW+agLrmK134nyBiMwUMcp8BMhxlG9B2PykrnAKH56D9O3tfoBg==",
- "dev": true,
- "license": "SEE LICENSE IN LICENSE",
- "peer": true,
- "peerDependencies": {
- "@sap/cds": ">=8",
- "express": "^4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/@sap/eslint-plugin-cds": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@sap/eslint-plugin-cds/-/eslint-plugin-cds-4.1.0.tgz",
- "integrity": "sha512-NuvDmF0devaiioU2/JsXYJ5eZZUEl9PZktT7McBoLVzykQmn31IFuDoy5DrfGwndFmZZvHCIex4BVmq+qymoSw==",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/@sap/eslint-plugin-cds/-/eslint-plugin-cds-4.2.3.tgz",
+ "integrity": "sha512-I9+PzDY4ODNPCIpS55IdlVgp4rVjEQDMS6xKN3xxPBcy5Y4GYgA1/6yBW5W/MZrwT01OiA9w+G+MN06IPzCufA==",
"dev": true,
"license": "See LICENSE file",
"dependencies": {
+ "@eslint/plugin-kit": "^0.7.0",
"semver": "^7.7.1"
},
"engines": {
"node": ">=20"
},
+ "optionalDependencies": {
+ "tree-sitter": "^0.21.1",
+ "tree-sitter-java": "^0.23.5"
+ },
"peerDependencies": {
"@sap/cds": ">=9",
- "eslint": "^9"
+ "eslint": "^9 || ^10"
}
},
"node_modules/@types/estree": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
- "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
"dev": true,
"license": "MIT"
},
@@ -2295,25 +2118,10 @@
"dev": true,
"license": "MIT"
},
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
"node_modules/acorn": {
- "version": "8.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true,
"license": "MIT",
"bin": {
@@ -2334,9 +2142,9 @@
}
},
"node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2373,14 +2181,6 @@
"dev": true,
"license": "Python-2.0"
},
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2388,55 +2188,10 @@
"dev": true,
"license": "MIT"
},
- "node_modules/body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/body-parser/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/body-parser/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
"node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz",
+ "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2444,50 +2199,6 @@
"concat-map": "0.0.1"
}
},
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/call-bind-apply-helpers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
- "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "es-errors": "^1.3.0",
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/call-bound": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
- "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.2",
- "get-intrinsic": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/callsites": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -2542,74 +2253,30 @@
"dev": true,
"license": "MIT"
},
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "safe-buffer": "5.2.1"
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">= 8"
}
},
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
"dev": true,
"license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie": {
- "version": "0.7.1",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
- "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
"engines": {
"node": ">=6.0"
},
@@ -2626,108 +2293,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/dunder-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
- "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "call-bind-apply-helpers": "^1.0.1",
- "es-errors": "^1.3.0",
- "gopd": "^1.2.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "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
- },
- "node_modules/encodeurl": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
- "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/es-define-property": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-errors": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-object-atoms": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
- "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "es-errors": "^1.3.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "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
- },
"node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -2742,25 +2307,25 @@
}
},
"node_modules/eslint": {
- "version": "9.39.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz",
- "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
+ "version": "9.39.4",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz",
+ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/eslint-utils": "^4.8.0",
"@eslint-community/regexpp": "^4.12.1",
- "@eslint/config-array": "^0.21.1",
+ "@eslint/config-array": "^0.21.2",
"@eslint/config-helpers": "^0.4.2",
"@eslint/core": "^0.17.0",
- "@eslint/eslintrc": "^3.3.1",
- "@eslint/js": "9.39.1",
+ "@eslint/eslintrc": "^3.3.5",
+ "@eslint/js": "9.39.4",
"@eslint/plugin-kit": "^0.4.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
"@types/estree": "^1.0.6",
- "ajv": "^6.12.4",
+ "ajv": "^6.14.0",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.6",
"debug": "^4.3.2",
@@ -2779,7 +2344,7 @@
"is-glob": "^4.0.0",
"json-stable-stringify-without-jsonify": "^1.0.1",
"lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
+ "minimatch": "^3.1.5",
"natural-compare": "^1.4.0",
"optionator": "^0.9.3"
},
@@ -2819,29 +2384,43 @@
}
},
"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==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/eslint/node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "node_modules/eslint/node_modules/@eslint/core": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
+ "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
"dev": true,
"license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/eslint/node_modules/@eslint/plugin-kit": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
+ "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.17.0",
+ "levn": "^0.4.1"
},
- "funding": {
- "url": "https://opencollective.com/eslint"
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
"node_modules/espree": {
@@ -2862,23 +2441,10 @@
"url": "https://opencollective.com/eslint"
}
},
- "node_modules/espree/node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
"node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -2921,84 +2487,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/express": {
- "version": "4.21.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
- "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.3",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.7.1",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.3.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.3",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.12",
- "proxy-addr": "~2.0.7",
- "qs": "6.13.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.19.0",
- "serve-static": "1.16.2",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
- "node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/express/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -3033,45 +2521,6 @@
"node": ">=16.0.0"
}
},
- "node_modules/finalhandler": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
- "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
"node_modules/find-up": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -3104,86 +2553,12 @@
}
},
"node_modules/flatted": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
- "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
"dev": true,
"license": "ISC"
},
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
- "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",
- "es-errors": "^1.3.0",
- "es-object-atoms": "^1.1.1",
- "function-bind": "^1.1.2",
- "get-proto": "^1.0.1",
- "gopd": "^1.2.0",
- "has-symbols": "^1.1.0",
- "hasown": "^2.0.2",
- "math-intrinsics": "^1.1.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
- "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "dunder-proto": "^1.0.1",
- "es-object-atoms": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
"node_modules/glob-parent": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
@@ -3210,90 +2585,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/gopd": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
}
},
- "node_modules/has-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
- "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
- "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
@@ -3331,25 +2632,6 @@
"node": ">=0.8.19"
}
},
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true,
- "license": "ISC",
- "peer": true
- },
- "node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -3381,9 +2663,9 @@
"license": "ISC"
},
"node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz",
+ "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3461,93 +2743,10 @@
"dev": true,
"license": "MIT"
},
- "node_modules/math-intrinsics": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
- "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/merge-descriptors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
- "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "bin": {
- "mime": "cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
"node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
"license": "ISC",
"dependencies": {
@@ -3571,43 +2770,28 @@
"dev": true,
"license": "MIT"
},
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "node_modules/node-addon-api": {
+ "version": "8.8.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.8.0.tgz",
+ "integrity": "sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA==",
"dev": true,
"license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.4",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
- "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
- "dev": true,
- "license": "MIT",
- "peer": true,
+ "optional": true,
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^18 || ^20 || >= 21"
}
},
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "node_modules/node-gyp-build": {
+ "version": "4.8.4",
+ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz",
+ "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==",
"dev": true,
"license": "MIT",
- "peer": true,
- "dependencies": {
- "ee-first": "1.1.1"
- },
- "engines": {
- "node": ">= 0.8"
+ "optional": true,
+ "bin": {
+ "node-gyp-build": "bin.js",
+ "node-gyp-build-optional": "optional.js",
+ "node-gyp-build-test": "build-test.js"
}
},
"node_modules/optionator": {
@@ -3673,17 +2857,6 @@
"node": ">=6"
}
},
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -3704,14 +2877,6 @@
"node": ">=8"
}
},
- "node_modules/path-to-regexp": {
- "version": "0.1.12",
- "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
- },
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -3722,21 +2887,6 @@
"node": ">= 0.8.0"
}
},
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "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"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -3747,51 +2897,6 @@
"node": ">=6"
}
},
- "node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
- "dev": true,
- "license": "BSD-3-Clause",
- "peer": true,
- "dependencies": {
- "side-channel": "^1.0.6"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/resolve-from": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -3802,40 +2907,10 @@
"node": ">=4"
}
},
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "peer": true
- },
- "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
- },
"node_modules/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz",
+ "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==",
"dev": true,
"license": "ISC",
"bin": {
@@ -3845,87 +2920,6 @@
"node": ">=10"
}
},
- "node_modules/send": {
- "version": "0.19.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
- "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/send/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/send/node_modules/debug/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "license": "MIT",
- "peer": true
- },
- "node_modules/send/node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/serve-static": {
- "version": "1.16.2",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
- "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "encodeurl": "~2.0.0",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.19.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true,
- "license": "ISC",
- "peer": true
- },
"node_modules/shebang-command": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -3949,97 +2943,6 @@
"node": ">=8"
}
},
- "node_modules/side-channel": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
- "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3",
- "side-channel-list": "^1.0.0",
- "side-channel-map": "^1.0.1",
- "side-channel-weakmap": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-list": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
- "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
- "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/side-channel-weakmap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
- "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "call-bound": "^1.0.2",
- "es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.5",
- "object-inspect": "^1.13.3",
- "side-channel-map": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/strip-json-comments": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -4066,54 +2969,51 @@
"node": ">=8"
}
},
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "node_modules/tree-sitter": {
+ "version": "0.21.1",
+ "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz",
+ "integrity": "sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==",
"dev": true,
+ "hasInstallScript": true,
"license": "MIT",
- "peer": true,
- "engines": {
- "node": ">=0.6"
+ "optional": true,
+ "dependencies": {
+ "node-addon-api": "^8.0.0",
+ "node-gyp-build": "^4.8.0"
}
},
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "node_modules/tree-sitter-java": {
+ "version": "0.23.5",
+ "resolved": "https://registry.npmjs.org/tree-sitter-java/-/tree-sitter-java-0.23.5.tgz",
+ "integrity": "sha512-Yju7oQ0Xx7GcUT01mUglPP+bYfvqjNCGdxqigTnew9nLGoII42PNVP3bHrYeMxswiCRM0yubWmN5qk+zsg0zMA==",
"dev": true,
+ "hasInstallScript": true,
"license": "MIT",
+ "optional": true,
"dependencies": {
- "prelude-ls": "^1.2.1"
+ "node-addon-api": "^8.2.2",
+ "node-gyp-build": "^4.8.2"
},
- "engines": {
- "node": ">= 0.8.0"
+ "peerDependencies": {
+ "tree-sitter": "^0.21.1"
+ },
+ "peerDependenciesMeta": {
+ "tree-sitter": {
+ "optional": true
+ }
}
},
- "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==",
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
+ "prelude-ls": "^1.2.1"
},
"engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.8"
+ "node": ">= 0.8.0"
}
},
"node_modules/uri-js": {
@@ -4126,28 +3026,6 @@
"punycode": "^2.1.0"
}
},
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
- "dev": true,
- "license": "MIT",
- "peer": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
diff --git a/sample-app/srv/notificationtypes-data.cds b/sample-app/srv/notificationtypes-data.cds
index c5bb3f0..09eeb88 100644
--- a/sample-app/srv/notificationtypes-data.cds
+++ b/sample-app/srv/notificationtypes-data.cds
@@ -139,6 +139,7 @@ service NotificationService {
@description : '{i18n>DESCRIPTION}'
@notification : {
+ customizable: true,
template: {
title : '{i18n>TEMPLATE_SENSITIVE}',
publicTitle : '{i18n>TEMPLATE_PUBLIC}',
diff --git a/sample-app/srv/pom.xml b/sample-app/srv/pom.xml
index e889460..24e3ef1 100644
--- a/sample-app/srv/pom.xml
+++ b/sample-app/srv/pom.xml
@@ -188,6 +188,8 @@
NotificationProviderService
NotificationTypeProviderService.**
NotificationTypeProviderService
+ NotificationTemplateProviderService.**
+ NotificationTemplateProviderService
diff --git a/sample-app/srv/src/test/java/customer/sample_app/handlers/mock/NotificationProviderServiceMockHandler.java b/sample-app/srv/src/test/java/customer/sample_app/handlers/mock/NotificationProviderServiceMockHandler.java
index 91ded2c..d95db31 100644
--- a/sample-app/srv/src/test/java/customer/sample_app/handlers/mock/NotificationProviderServiceMockHandler.java
+++ b/sample-app/srv/src/test/java/customer/sample_app/handlers/mock/NotificationProviderServiceMockHandler.java
@@ -35,7 +35,7 @@ public class NotificationProviderServiceMockHandler implements EventHandler {
@On(event = CqnService.EVENT_CREATE, entity = Notifications_.CDS_NAME)
public void interceptCreate(CdsCreateEventContext context) {
- logger.info("MockHandler intercepting CREATE - {} entries", context.getCqn().entries().size());
+ logger.debug("MockHandler intercepting CREATE - {} entries", context.getCqn().entries().size());
List