This is an automated email from the ASF dual-hosted git repository.

marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git

commit cb81ad8ae0315dc3f0cab18312b2e5e4993d22e0
Author: Marat Gubaidullin <[email protected]>
AuthorDate: Fri Feb 27 16:20:27 2026 -0500

    Front-end Utils for 4.18.0
---
 .../src/main/webui/src/karavan/util/CodeUtils.ts   |  4 +-
 .../src/main/webui/src/karavan/util/StringUtils.ts | 62 ++++++++++++++++++++++
 2 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/karavan-app/src/main/webui/src/karavan/util/CodeUtils.ts 
b/karavan-app/src/main/webui/src/karavan/util/CodeUtils.ts
index a2fecc8c..94cb2d90 100644
--- a/karavan-app/src/main/webui/src/karavan/util/CodeUtils.ts
+++ b/karavan-app/src/main/webui/src/karavan/util/CodeUtils.ts
@@ -19,10 +19,10 @@ import {APPLICATION_PROPERTIES, ProjectFile} from 
"@models/ProjectModels";
 import {BeanFactoryDefinition} from "@karavan-core/model/CamelDefinition";
 import {Integration, IntegrationFile, KameletTypes, MetadataLabels} from 
"@karavan-core/model/IntegrationDefinition";
 import {CamelDefinitionYaml} from "@karavan-core/api/CamelDefinitionYaml";
-import {CamelUi} from "@features/integration/designer/utils/CamelUi";
+import {CamelUi} from "@features/project/designer/utils/CamelUi";
 import {KameletApi} from "@karavan-core/api/KameletApi";
 import {CamelUtil} from "@karavan-core/api/CamelUtil";
-import {EventBus} from "@features/integration/designer/utils/EventBus";
+import {EventBus} from "@features/project/designer/utils/EventBus";
 import {ApplicationProperty} from "@karavan-core/model/MainConfigurationModel";
 import {MainConfigurationApi} from "@karavan-core/api/MainConfigurationApi";
 
diff --git a/karavan-app/src/main/webui/src/karavan/util/StringUtils.ts 
b/karavan-app/src/main/webui/src/karavan/util/StringUtils.ts
index 370d0d45..c6d521ec 100644
--- a/karavan-app/src/main/webui/src/karavan/util/StringUtils.ts
+++ b/karavan-app/src/main/webui/src/karavan/util/StringUtils.ts
@@ -276,4 +276,66 @@ export function extractTitleFromMarkdown(markdown: 
string): string | null {
 
     // If no title found
     return null;
+}
+
+export function convertAnyToString(value: any): string {
+    if (value === null) return "null";
+    if (value === undefined) return "undefined";
+
+    // If it's already a string, check if it might be JSON
+    if (typeof value === "string") {
+        const trimmed = value.trim();
+
+        // Try parsing directly (normal JSON string)
+        try {
+            const parsed = JSON.parse(trimmed);
+            return JSON.stringify(parsed, null, 2);
+        } catch {
+            // Try parsing escaped JSON string
+            try {
+                const unescaped = trimmed.replace(/\\"/g, '"');
+                const parsed = JSON.parse(unescaped);
+                return JSON.stringify(parsed, null, 2);
+            } catch {
+                // Not JSON, return as-is
+                return value;
+            }
+        }
+    }
+
+    // Handle objects and arrays
+    if (typeof value === "object") {
+        try {
+            return JSON.stringify(value, null, 2);
+        } catch {
+            // Circular reference or unserializable object
+            return Object.prototype.toString.call(value);
+        }
+    }
+
+    // Fallback for primitives (number, boolean, symbol, bigint, function)
+    try {
+        return String(value);
+    } catch {
+        return "[Unstringifiable value]";
+    }
+}
+
+const placeholderRegexp = /\{\{\s*([^}:]+?)\s*\}\}/g;
+export function replacePlaceholders(code: string, placeholders: Record<string, 
string>){
+    return code.replace(placeholderRegexp, (match, rawKey) => {
+        const key = rawKey.trim();
+        return key in placeholders ? placeholders[key] : match;
+    });
+}
+
+export function findPlaceholders(code: string): string[] {
+    const regex = placeholderRegexp;
+    const results: string[] = [];
+    let match: RegExpExecArray | null;
+
+    while ((match = regex.exec(code)) !== null) {
+        results.push(match[1].trim());
+    }
+    return [...new Set(results)];
 }
\ No newline at end of file

Reply via email to