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

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


The following commit(s) were added to refs/heads/main by this push:
     new f56b04b4e53b CAMEL-23530: Move DataWeave parser to camel-dataweave 
component and add auto-detection in DataSonnet
f56b04b4e53b is described below

commit f56b04b4e53b641e08fa879071ece515189074f5
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Aug 6 11:39:52 2026 +0200

    CAMEL-23530: Move DataWeave parser to camel-dataweave component and add 
auto-detection in DataSonnet
    
    Move the DataWeave AST parser/lexer/converter from camel-jbang-core into
    a new camel-dataweave component for broader reuse. The module is a
    pure-JDK JAR with zero runtime dependencies.
    
    Add camel-dataweave as a dependency of camel-datasonnet so .dwl files
    and inline %dw expressions are automatically transpiled to DataSonnet at
    route initialization time with zero configuration. Auto-detection works
    by file extension (.dwl) and by content header (%dw).
    
    Fix DataWeave auto-detection by moving detection to
    createExpression(String, Object[]) so .dwl extension check runs before
    the parent class loads the resource.
    
    Closes #25363
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
---
 bom/camel-bom/pom.xml                              |  5 ++
 catalog/camel-allcomponents/pom.xml                |  5 ++
 .../camel/catalog/docs/datasonnet-language.adoc    | 84 ++++++++++++++++++++--
 .../org/apache/camel/catalog/others.properties     |  1 +
 .../org/apache/camel/catalog/others/dataweave.json | 15 ++++
 components/camel-datasonnet/pom.xml                |  4 ++
 .../src/main/docs/datasonnet-language.adoc         | 84 ++++++++++++++++++++--
 .../language/datasonnet/DatasonnetLanguage.java    | 43 ++++++++++-
 .../datasonnet/DataWeaveAutoDetectTest.java        | 67 +++++++++++++++++
 .../src/test/resources/simpleMapping.dwl           |  7 ++
 components/camel-dataweave/pom.xml                 | 55 ++++++++++++++
 .../services/org/apache/camel/other.properties     |  7 ++
 .../src/generated/resources/dataweave.json         | 15 ++++
 .../camel/component/dataweave}/DataWeaveAst.java   |  2 +-
 .../component/dataweave}/DataWeaveConverter.java   | 20 +++---
 .../camel/component/dataweave}/DataWeaveLexer.java |  2 +-
 .../component/dataweave}/DataWeaveParser.java      | 16 ++---
 .../dataweave}/DataWeaveConverterTest.java         | 44 ++++++------
 .../component/dataweave}/DataWeaveLexerTest.java   |  6 +-
 .../component/dataweave}/DataWeaveParserTest.java  | 66 ++++++++---------
 .../test/resources/dataweave/collection-map.dwl    |  0
 .../src/test/resources/dataweave/event-message.dwl |  0
 .../src/test/resources/dataweave/null-handling.dwl |  0
 .../src/test/resources/dataweave/simple-rename.dwl |  0
 .../src/test/resources/dataweave/string-ops.dwl    |  0
 .../src/test/resources/dataweave/type-coercion.dwl |  0
 components/pom.xml                                 |  1 +
 .../modules/others/examples/json/dataweave.json    |  1 +
 dsl/camel-jbang/camel-jbang-core/pom.xml           |  4 ++
 .../jbang/core/commands/TransformDataWeave.java    |  2 +-
 parent/pom.xml                                     |  5 ++
 31 files changed, 466 insertions(+), 95 deletions(-)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index ea5383026c76..f6f06b4f00b6 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -707,6 +707,11 @@
         <artifactId>camel-datasonnet</artifactId>
         <version>4.22.0-SNAPSHOT</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>camel-dataweave</artifactId>
+        <version>4.22.0-SNAPSHOT</version>
+      </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
         <artifactId>camel-debezium-common</artifactId>
diff --git a/catalog/camel-allcomponents/pom.xml 
b/catalog/camel-allcomponents/pom.xml
index 9ff95f7750ff..0afdc8f168ad 100644
--- a/catalog/camel-allcomponents/pom.xml
+++ b/catalog/camel-allcomponents/pom.xml
@@ -597,6 +597,11 @@
             <artifactId>camel-datasonnet</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-dataweave</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-debezium-common</artifactId>
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/datasonnet-language.adoc
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/datasonnet-language.adoc
index 015fc5ca4f63..fb3060a35882 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/datasonnet-language.adoc
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/datasonnet-language.adoc
@@ -404,25 +404,95 @@ YAML::
 ====
 
 
-== Migrating from DataWeave
+== DataWeave Support
 
-If you have existing DataWeave (`.dwl`) scripts, Camel provides a transpiler 
to convert them to DataSonnet format via the Camel CLI CLI.
+Camel can execute DataWeave (`.dwl`) scripts directly by auto-detecting and 
transpiling them to DataSonnet at load time.
+No extra configuration is needed -- just reference a `.dwl` resource and Camel 
handles the conversion automatically.
 
-=== Converting an inline expression
+=== Auto-detection
 
-[source,bash]
+DataWeave scripts are detected in two ways:
+
+- **By file extension**: any resource ending in `.dwl` (e.g., 
`resource:classpath:transform.dwl`)
+- **By content**: inline expressions starting with the `%dw` header
+
+Once detected, the script is transpiled to DataSonnet and executed via the 
datasonnet-mapper runtime.
+The conversion happens once at route initialization, so there is no runtime 
overhead.
+
+=== Example
+
+Given a DataWeave file `transform.dwl` on the classpath:
+
+[source,dataweave]
 ----
-camel transform dataweave -e "payload.name ++ ' ' ++ payload.surname"
+%dw 2.0
+output application/json
+---
+{
+    orderId: payload.order_id,
+    customer: payload.customer.first_name ++ " " ++ payload.customer.last_name,
+    total: payload.items map ((item) -> item.price * item.qty)
+                         reduce ((item, acc = 0) -> acc + item)
+}
 ----
 
-=== Converting a file or directory
+You can use it directly in a route:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("direct:in")
+    .transform(datasonnet("resource:classpath:transform.dwl", String.class))
+    .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+    <from uri="direct:in"/>
+    <transform>
+        <datasonnet 
resultTypeName="java.lang.String">resource:classpath:transform.dwl</datasonnet>
+    </transform>
+    <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: direct:in
+      steps:
+        - transform:
+            expression:
+              datasonnet:
+                expression: "resource:classpath:transform.dwl"
+                resultType: java.lang.String
+        - to:
+            uri: mock:result
+----
+====
+
+=== CLI Transpiler
+
+You can also convert DataWeave scripts ahead of time using the Camel CLI:
 
 [source,bash]
 ----
+camel transform dataweave -e "payload.name ++ ' ' ++ payload.surname"
 camel transform dataweave --input my-transform.dwl --output my-transform.ds
 camel transform dataweave --input src/main/resources/dwl/ --output 
src/main/resources/ds/
 ----
 
+=== Supported Constructs
+
 The transpiler automatically maps DataWeave constructs to their DataSonnet 
equivalents, including:
 
 - `payload` to `body`, `vars` to `cml.variable()`, `attributes.headers` to 
`cml.header()`
@@ -431,7 +501,7 @@ The transpiler automatically maps DataWeave constructs to 
their DataSonnet equiv
 - String operations: `contains`, `startsWith`, `endsWith`, `splitBy`, 
`joinBy`, `replace`
 - Functions: `sizeOf`, `upper`, `lower`, `trim`, `now`, `uuid`, `abs`, 
`round`, `sqrt`
 
-Constructs that cannot be automatically converted (such as `match` 
expressions) are marked with `TODO` comments in the output for manual review.
+Constructs that cannot be automatically converted (such as `match` 
expressions) are emitted as `null` for manual review.
 
 == Dependencies
 
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
index e1c80fb21928..20197d007d61 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others.properties
@@ -7,6 +7,7 @@ cluster
 componentdsl
 console
 csimple-joor
+dataweave
 debug
 diagram
 dsl-modeline
diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/dataweave.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/dataweave.json
new file mode 100644
index 000000000000..9d86b56df2da
--- /dev/null
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/others/dataweave.json
@@ -0,0 +1,15 @@
+{
+  "other": {
+    "kind": "other",
+    "name": "dataweave",
+    "title": "DataWeave",
+    "description": "Camel DataWeave support",
+    "deprecated": false,
+    "firstVersion": "4.22.0",
+    "label": "transformation",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-dataweave",
+    "version": "4.22.0-SNAPSHOT"
+  }
+}
diff --git a/components/camel-datasonnet/pom.xml 
b/components/camel-datasonnet/pom.xml
index 3a9591c554f9..e7d941d09471 100644
--- a/components/camel-datasonnet/pom.xml
+++ b/components/camel-datasonnet/pom.xml
@@ -38,6 +38,10 @@
             <artifactId>scala-library</artifactId>
             <version>${scala-datasonnet-version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-dataweave</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-support</artifactId>
diff --git a/components/camel-datasonnet/src/main/docs/datasonnet-language.adoc 
b/components/camel-datasonnet/src/main/docs/datasonnet-language.adoc
index 015fc5ca4f63..fb3060a35882 100644
--- a/components/camel-datasonnet/src/main/docs/datasonnet-language.adoc
+++ b/components/camel-datasonnet/src/main/docs/datasonnet-language.adoc
@@ -404,25 +404,95 @@ YAML::
 ====
 
 
-== Migrating from DataWeave
+== DataWeave Support
 
-If you have existing DataWeave (`.dwl`) scripts, Camel provides a transpiler 
to convert them to DataSonnet format via the Camel CLI CLI.
+Camel can execute DataWeave (`.dwl`) scripts directly by auto-detecting and 
transpiling them to DataSonnet at load time.
+No extra configuration is needed -- just reference a `.dwl` resource and Camel 
handles the conversion automatically.
 
-=== Converting an inline expression
+=== Auto-detection
 
-[source,bash]
+DataWeave scripts are detected in two ways:
+
+- **By file extension**: any resource ending in `.dwl` (e.g., 
`resource:classpath:transform.dwl`)
+- **By content**: inline expressions starting with the `%dw` header
+
+Once detected, the script is transpiled to DataSonnet and executed via the 
datasonnet-mapper runtime.
+The conversion happens once at route initialization, so there is no runtime 
overhead.
+
+=== Example
+
+Given a DataWeave file `transform.dwl` on the classpath:
+
+[source,dataweave]
 ----
-camel transform dataweave -e "payload.name ++ ' ' ++ payload.surname"
+%dw 2.0
+output application/json
+---
+{
+    orderId: payload.order_id,
+    customer: payload.customer.first_name ++ " " ++ payload.customer.last_name,
+    total: payload.items map ((item) -> item.price * item.qty)
+                         reduce ((item, acc = 0) -> acc + item)
+}
 ----
 
-=== Converting a file or directory
+You can use it directly in a route:
+
+[tabs]
+====
+Java::
++
+[source,java]
+----
+from("direct:in")
+    .transform(datasonnet("resource:classpath:transform.dwl", String.class))
+    .to("mock:result");
+----
+
+XML::
++
+[source,xml]
+----
+<route>
+    <from uri="direct:in"/>
+    <transform>
+        <datasonnet 
resultTypeName="java.lang.String">resource:classpath:transform.dwl</datasonnet>
+    </transform>
+    <to uri="mock:result"/>
+</route>
+----
+
+YAML::
++
+[source,yaml]
+----
+- route:
+    from:
+      uri: direct:in
+      steps:
+        - transform:
+            expression:
+              datasonnet:
+                expression: "resource:classpath:transform.dwl"
+                resultType: java.lang.String
+        - to:
+            uri: mock:result
+----
+====
+
+=== CLI Transpiler
+
+You can also convert DataWeave scripts ahead of time using the Camel CLI:
 
 [source,bash]
 ----
+camel transform dataweave -e "payload.name ++ ' ' ++ payload.surname"
 camel transform dataweave --input my-transform.dwl --output my-transform.ds
 camel transform dataweave --input src/main/resources/dwl/ --output 
src/main/resources/ds/
 ----
 
+=== Supported Constructs
+
 The transpiler automatically maps DataWeave constructs to their DataSonnet 
equivalents, including:
 
 - `payload` to `body`, `vars` to `cml.variable()`, `attributes.headers` to 
`cml.header()`
@@ -431,7 +501,7 @@ The transpiler automatically maps DataWeave constructs to 
their DataSonnet equiv
 - String operations: `contains`, `startsWith`, `endsWith`, `splitBy`, 
`joinBy`, `replace`
 - Functions: `sizeOf`, `upper`, `lower`, `trim`, `now`, `uuid`, `abs`, 
`round`, `sqrt`
 
-Constructs that cannot be automatically converted (such as `match` 
expressions) are marked with `TODO` comments in the output for manual review.
+Constructs that cannot be automatically converted (such as `match` 
expressions) are emitted as `null` for manual review.
 
 == Dependencies
 
diff --git 
a/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
 
b/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
index 45a7266a2dd6..8d035d4a05cd 100644
--- 
a/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
+++ 
b/components/camel-datasonnet/src/main/java/org/apache/camel/language/datasonnet/DatasonnetLanguage.java
@@ -29,6 +29,7 @@ import io.github.classgraph.ClassGraph;
 import io.github.classgraph.ScanResult;
 import org.apache.camel.Expression;
 import org.apache.camel.Predicate;
+import org.apache.camel.component.dataweave.DataWeaveConverter;
 import org.apache.camel.spi.annotations.Language;
 import org.apache.camel.support.LRUCacheFactory;
 import org.apache.camel.support.SingleInputTypedLanguageSupport;
@@ -68,9 +69,21 @@ public class DatasonnetLanguage extends 
SingleInputTypedLanguageSupport {
     }
 
     @Override
-    public Expression createExpression(Expression source, String expression, 
Object[] properties) {
-        expression = loadResource(expression);
+    public Expression createExpression(String expression, Object[] properties) 
{
+        if (expression != null) {
+            boolean dwlResource = isDataWeaveResource(expression);
+            if (dwlResource) {
+                expression = loadResource(expression);
+            }
+            if (dwlResource || isDataWeaveContent(expression)) {
+                expression = convertDataWeave(expression);
+            }
+        }
+        return super.createExpression(expression, properties);
+    }
 
+    @Override
+    public Expression createExpression(Expression source, String expression, 
Object[] properties) {
         DatasonnetExpression answer = new DatasonnetExpression(expression);
         answer.setSource(source);
         answer.setResultType(property(Class.class, properties, 0, null));
@@ -100,6 +113,32 @@ public class DatasonnetLanguage extends 
SingleInputTypedLanguageSupport {
         return classpathImports;
     }
 
+    private static boolean isDataWeaveResource(String expression) {
+        return expression != null && expression.endsWith(".dwl");
+    }
+
+    private static boolean isDataWeaveContent(String expression) {
+        return expression != null && 
expression.stripLeading().startsWith("%dw");
+    }
+
+    private static String convertDataWeave(String expression) {
+        DataWeaveConverter converter = new DataWeaveConverter();
+        converter.setIncludeComments(false);
+        String result;
+        if (expression.contains("%dw") || expression.contains("---")) {
+            result = converter.convert(expression);
+        } else {
+            result = converter.convertExpression(expression);
+        }
+        if (converter.getTodoCount() > 0) {
+            LOG.warn("DataWeave conversion has {} construct(s) that could not 
be auto-converted and were emitted as null",
+                    converter.getTodoCount());
+        } else {
+            LOG.debug("Converted DataWeave to DataSonnet: {} expression(s)", 
converter.getConvertedCount());
+        }
+        return result;
+    }
+
     private Map<String, String> discoverDataSonnetLibraries() {
         Map<String, String> imports = new HashMap<>();
         try (ScanResult scanResult = new ClassGraph().acceptPaths("/").scan()) 
{
diff --git 
a/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/DataWeaveAutoDetectTest.java
 
b/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/DataWeaveAutoDetectTest.java
new file mode 100644
index 000000000000..82aaf0747570
--- /dev/null
+++ 
b/components/camel-datasonnet/src/test/java/org/apache/camel/language/datasonnet/DataWeaveAutoDetectTest.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.language.datasonnet;
+
+import com.datasonnet.document.MediaTypes;
+import org.apache.camel.Exchange;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.junit6.CamelTestSupport;
+import org.junit.jupiter.api.Test;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+class DataWeaveAutoDetectTest extends CamelTestSupport {
+
+    @Test
+    void testDataWeaveResourceAutoDetect() throws Exception {
+        template.sendBody("direct:dwlResource", "{\"name\": \"Camel\"}");
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        Exchange exchange = mock.assertExchangeReceived(0);
+        String response = exchange.getMessage().getBody(String.class);
+        JSONAssert.assertEquals("{\"name\": \"Camel\", \"greeting\": \"Hello, 
Camel\"}", response, true);
+    }
+
+    @Test
+    void testDataWeaveInlineAutoDetect() throws Exception {
+        template.sendBody("direct:dwlInline", "{\"name\": \"Camel\"}");
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        Exchange exchange = mock.assertExchangeReceived(0);
+        String response = exchange.getMessage().getBody(String.class);
+        JSONAssert.assertEquals("{\"greeting\": \"Hello, Camel\"}", response, 
true);
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:dwlResource")
+                        
.transform(datasonnet("resource:classpath:simpleMapping.dwl", String.class,
+                                MediaTypes.APPLICATION_JSON_VALUE, 
MediaTypes.APPLICATION_JSON_VALUE))
+                        .to("mock:result");
+
+                from("direct:dwlInline")
+                        .transform(datasonnet(
+                                "%dw 2.0\noutput application/json\n---\n{ 
greeting: \"Hello, \" ++ payload.name }",
+                                String.class,
+                                MediaTypes.APPLICATION_JSON_VALUE, 
MediaTypes.APPLICATION_JSON_VALUE))
+                        .to("mock:result");
+            }
+        };
+    }
+}
diff --git a/components/camel-datasonnet/src/test/resources/simpleMapping.dwl 
b/components/camel-datasonnet/src/test/resources/simpleMapping.dwl
new file mode 100644
index 000000000000..79ac36005bb7
--- /dev/null
+++ b/components/camel-datasonnet/src/test/resources/simpleMapping.dwl
@@ -0,0 +1,7 @@
+%dw 2.0
+output application/json
+---
+{
+    name: payload.name,
+    greeting: "Hello, " ++ payload.name
+}
diff --git a/components/camel-dataweave/pom.xml 
b/components/camel-dataweave/pom.xml
new file mode 100644
index 000000000000..4d590aba80fb
--- /dev/null
+++ b/components/camel-dataweave/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+         http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>4.22.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-dataweave</artifactId>
+    <packaging>jar</packaging>
+
+    <name>Camel :: DataWeave</name>
+    <description>Camel DataWeave support</description>
+
+    <properties>
+        <firstVersion>4.22.0</firstVersion>
+        <label>transformation</label>
+        <title>DataWeave</title>
+    </properties>
+
+    <dependencies>
+        <!-- test dependencies -->
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git 
a/components/camel-dataweave/src/generated/resources/META-INF/services/org/apache/camel/other.properties
 
b/components/camel-dataweave/src/generated/resources/META-INF/services/org/apache/camel/other.properties
new file mode 100644
index 000000000000..40bc48ca1d26
--- /dev/null
+++ 
b/components/camel-dataweave/src/generated/resources/META-INF/services/org/apache/camel/other.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+name=dataweave
+groupId=org.apache.camel
+artifactId=camel-dataweave
+version=4.22.0-SNAPSHOT
+projectName=Camel :: DataWeave
+projectDescription=Camel DataWeave support
diff --git a/components/camel-dataweave/src/generated/resources/dataweave.json 
b/components/camel-dataweave/src/generated/resources/dataweave.json
new file mode 100644
index 000000000000..9d86b56df2da
--- /dev/null
+++ b/components/camel-dataweave/src/generated/resources/dataweave.json
@@ -0,0 +1,15 @@
+{
+  "other": {
+    "kind": "other",
+    "name": "dataweave",
+    "title": "DataWeave",
+    "description": "Camel DataWeave support",
+    "deprecated": false,
+    "firstVersion": "4.22.0",
+    "label": "transformation",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-dataweave",
+    "version": "4.22.0-SNAPSHOT"
+  }
+}
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveAst.java
 
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveAst.java
similarity index 98%
rename from 
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveAst.java
rename to 
components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveAst.java
index 4b75a0569aff..f1ef34b9b40b 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveAst.java
+++ 
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveAst.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
 
 import java.util.List;
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverter.java
 
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveConverter.java
similarity index 96%
rename from 
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverter.java
rename to 
components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveConverter.java
index 3842f29b2c5e..6bc12820c8ea 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverter.java
+++ 
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveConverter.java
@@ -14,13 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.*;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.Token;
+import org.apache.camel.component.dataweave.DataWeaveAst.*;
+import org.apache.camel.component.dataweave.DataWeaveLexer.Token;
 
 /**
  * Converts DataWeave 2.0 scripts to DataSonnet. Parses the DataWeave input, 
walks the AST, and emits equivalent
@@ -84,7 +84,7 @@ public class DataWeaveConverter {
         return emitNode(ast);
     }
 
-    // ── Emission ──
+    // -- Emission --
 
     private String emit(DataWeaveAst node) {
         if (node instanceof Script script) {
@@ -352,7 +352,7 @@ public class DataWeaveConverter {
             case "Boolean" -> "cml.toBoolean(" + expr + ")";
             default -> {
                 todoCount++;
-                yield expr + (includeComments ? " // TODO: manual conversion 
needed — as " + tc.type() : "");
+                yield expr + (includeComments ? " // TODO: manual conversion 
needed -- as " + tc.type() : "");
             }
         };
     }
@@ -410,9 +410,9 @@ public class DataWeaveConverter {
                 yield "c.max(" + argStr + ")";
             }
             case "read" -> "std.parseJson(" + argStr + ")"
-                           + (includeComments ? " // NOTE: assumes JSON input 
— DW read() supports multiple formats" : "");
+                           + (includeComments ? " // NOTE: assumes JSON input 
-- DW read() supports multiple formats" : "");
             case "write" -> "std.manifestJsonEx(" + argStr + ", \"  \")"
-                            + (includeComments ? " // NOTE: outputs JSON — DW 
write() supports multiple formats" : "");
+                            + (includeComments ? " // NOTE: outputs JSON -- DW 
write() supports multiple formats" : "");
             default -> fc.name() + "(" + argStr + ")";
         };
     }
@@ -436,7 +436,7 @@ public class DataWeaveConverter {
             List<String> paramNames = lambdaParamNames(lam);
             String body = emitNode(lam.body());
             if (paramNames.size() == 2) {
-                // DW: map ((item, index) -> body) — DS: 
std.mapWithIndex(function(index, item) body, collection)
+                // DW: map ((item, index) -> body) -- DS: 
std.mapWithIndex(function(index, item) body, collection)
                 // Parameter order is swapped: DW is (item, index), DS is 
(index, item)
                 return "std.mapWithIndex(function(" + paramNames.get(1) + ", " 
+ paramNames.get(0)
                        + ") " + body + ", " + collection + ")";
@@ -498,7 +498,7 @@ public class DataWeaveConverter {
         if (dbe.lambda() instanceof Lambda lam) {
             List<String> paramNames = lambdaParamNames(lam);
             String body = emitNode(lam.body());
-            // distinctBy keeps first occurrence per key — use distinctBy 
helper
+            // distinctBy keeps first occurrence per key -- use distinctBy 
helper
             return "c.distinctBy(" + collection + ", function(" + 
paramNames.get(0) + ") " + body + ")";
         }
         return "c.distinct(" + collection + ")";
@@ -593,7 +593,7 @@ public class DataWeaveConverter {
         todoCount++;
         convertedCount--;
         return includeComments
-                ? "// TODO: manual conversion needed — " + u.reason() + ": " + 
u.originalText() + "\nnull"
+                ? "// TODO: manual conversion needed -- " + u.reason() + ": " 
+ u.originalText() + "\nnull"
                 : "null";
     }
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexer.java
 
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveLexer.java
similarity index 99%
rename from 
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexer.java
rename to 
components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveLexer.java
index 1d74d45d7382..703424acaeb6 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexer.java
+++ 
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveLexer.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParser.java
 
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveParser.java
similarity index 98%
rename from 
dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParser.java
rename to 
components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveParser.java
index 8c2f62c29dfb..e91187d23f17 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParser.java
+++ 
b/components/camel-dataweave/src/main/java/org/apache/camel/component/dataweave/DataWeaveParser.java
@@ -14,13 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
 
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.Token;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.TokenType;
+import org.apache.camel.component.dataweave.DataWeaveLexer.Token;
+import org.apache.camel.component.dataweave.DataWeaveLexer.TokenType;
 
 /**
  * Recursive descent parser for DataWeave 2.0 scripts producing {@link 
DataWeaveAst} nodes.
@@ -45,7 +45,7 @@ public class DataWeaveParser {
         return parseExpression();
     }
 
-    // ── Header parsing ──
+    // -- Header parsing --
 
     private DataWeaveAst.Header parseHeader() {
         String version = "2.0";
@@ -57,7 +57,7 @@ public class DataWeaveParser {
                 || checkIdentifier("output") || checkIdentifier("input");
 
         if (!hasHeader) {
-            // No header section — skip directly to body
+            // No header section -- skip directly to body
             return new DataWeaveAst.Header(version, null, inputs);
         }
 
@@ -118,7 +118,7 @@ public class DataWeaveParser {
         return sb.toString();
     }
 
-    // ── Expression parsing (precedence climbing) ──
+    // -- Expression parsing (precedence climbing) --
 
     private DataWeaveAst parseExpression() {
         // Handle var/fun declarations at expression level
@@ -442,7 +442,7 @@ public class DataWeaveParser {
                 expr = new DataWeaveAst.ReplaceExpr(expr, target, replacement);
             } else if (checkIdentifier("match")) {
                 advance(); // match
-                // Capture the match block as unsupported — skip braces
+                // Capture the match block as unsupported -- skip braces
                 StringBuilder matchText = new StringBuilder("match ");
                 if (check(TokenType.LBRACE)) {
                     int depth = 1;
@@ -717,7 +717,7 @@ public class DataWeaveParser {
         return new DataWeaveAst.ArrayLit(elements);
     }
 
-    // ── Token helpers ──
+    // -- Token helpers --
 
     private Token current() {
         return pos < tokens.size() ? tokens.get(pos) : 
tokens.get(tokens.size() - 1);
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverterTest.java
 
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveConverterTest.java
similarity index 95%
rename from 
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverterTest.java
rename to 
components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveConverterTest.java
index c2424bd1e66a..97441b844b19 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveConverterTest.java
+++ 
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveConverterTest.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -34,7 +34,7 @@ class DataWeaveConverterTest {
         converter = new DataWeaveConverter();
     }
 
-    // ── Header conversion ──
+    // -- Header conversion --
 
     @Test
     void testHeaderConversion() {
@@ -51,7 +51,7 @@ class DataWeaveConverterTest {
         assertTrue(result.contains("*/"));
     }
 
-    // ── Field access ──
+    // -- Field access --
 
     @Test
     void testPayloadToBody() {
@@ -83,7 +83,7 @@ class DataWeaveConverterTest {
         assertEquals("cml.header('page')", result);
     }
 
-    // ── Operators ──
+    // -- Operators --
 
     @Test
     void testStringConcat() {
@@ -109,7 +109,7 @@ class DataWeaveConverterTest {
         assertEquals("body.active && body.verified", result);
     }
 
-    // ── Default operator ──
+    // -- Default operator --
 
     @Test
     void testDefault() {
@@ -117,7 +117,7 @@ class DataWeaveConverterTest {
         assertEquals("cml.defaultVal(body.currency, \"USD\")", result);
     }
 
-    // ── Type coercion ──
+    // -- Type coercion --
 
     @Test
     void testAsNumber() {
@@ -143,7 +143,7 @@ class DataWeaveConverterTest {
         assertEquals("cml.toBoolean(body.active)", result);
     }
 
-    // ── Built-in functions ──
+    // -- Built-in functions --
 
     @Test
     void testSizeOf() {
@@ -194,7 +194,7 @@ class DataWeaveConverterTest {
         assertTrue(converter.needsCamelLib());
     }
 
-    // ── String operations ──
+    // -- String operations --
 
     @Test
     void testContains() {
@@ -221,7 +221,7 @@ class DataWeaveConverterTest {
         assertEquals("std.strReplace(body.text, \"old\", \"new\")", result);
     }
 
-    // ── Collection operations ──
+    // -- Collection operations --
 
     @Test
     void testMap() {
@@ -265,7 +265,7 @@ class DataWeaveConverterTest {
         assertTrue(result.contains("item.tags"));
     }
 
-    // ── If/else ──
+    // -- If/else --
 
     @Test
     void testIfElse() {
@@ -274,7 +274,7 @@ class DataWeaveConverterTest {
         assertEquals("if body.age >= 18 then \"adult\" else \"minor\"", 
result);
     }
 
-    // ── Object and array literals ──
+    // -- Object and array literals --
 
     @Test
     void testObjectLiteral() {
@@ -289,7 +289,7 @@ class DataWeaveConverterTest {
         assertEquals("[1, 2, 3]", result);
     }
 
-    // ── Full script tests ──
+    // -- Full script tests --
 
     @Test
     void testSimpleRenameScript() throws IOException {
@@ -382,7 +382,7 @@ class DataWeaveConverterTest {
         assertTrue(result.contains("name: body.name"));
     }
 
-    // ── startsWith / endsWith ──
+    // -- startsWith / endsWith --
 
     @Test
     void testStartsWith() {
@@ -398,7 +398,7 @@ class DataWeaveConverterTest {
         assertTrue(converter.needsCamelLib());
     }
 
-    // ── Math functions ──
+    // -- Math functions --
 
     @Test
     void testAbs() {
@@ -427,17 +427,17 @@ class DataWeaveConverterTest {
         assertTrue(converter.needsCamelLib());
     }
 
-    // ── mapWithIndex parameter order ──
+    // -- mapWithIndex parameter order --
 
     @Test
     void testMapWithIndex() {
+        // DataSonnet std.mapWithIndex uses function(index, item), so params 
must be swapped
         String result = converter.convertExpression(
                 "payload.items map ((item, idx) -> { index: idx, name: 
item.name })");
-        // DataSonnet std.mapWithIndex uses function(index, item), so params 
must be swapped
         assertTrue(result.contains("std.mapWithIndex(function(idx, item)"));
     }
 
-    // ── distinctBy ──
+    // -- distinctBy --
 
     @Test
     void testDistinctBy() {
@@ -448,7 +448,7 @@ class DataWeaveConverterTest {
         assertTrue(converter.needsCamelLib());
     }
 
-    // ── Lambda shorthand ──
+    // -- Lambda shorthand --
 
     @Test
     void testLambdaShorthand() {
@@ -456,7 +456,7 @@ class DataWeaveConverterTest {
         assertTrue(result.contains("function(x) x.name"));
     }
 
-    // ── match expression ──
+    // -- match expression --
 
     @Test
     void testMatchExpressionUnsupported() {
@@ -466,7 +466,7 @@ class DataWeaveConverterTest {
         assertTrue(converter.getTodoCount() > 0);
     }
 
-    // ── Multi-value selector ──
+    // -- Multi-value selector --
 
     @Test
     void testMultiValueSelector() {
@@ -475,7 +475,7 @@ class DataWeaveConverterTest {
         assertEquals(0, converter.getTodoCount());
     }
 
-    // ── Escape handling ──
+    // -- Escape handling --
 
     @Test
     void testStringEscapesPreserved() {
@@ -483,7 +483,7 @@ class DataWeaveConverterTest {
         assertTrue(result.contains("\"\\n\""), "Newline escape should be 
preserved, got: " + result);
     }
 
-    // ── Helpers ──
+    // -- Helpers --
 
     private String loadResource(String path) throws IOException {
         try (InputStream is = 
getClass().getClassLoader().getResourceAsStream(path)) {
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexerTest.java
 
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveLexerTest.java
similarity index 96%
rename from 
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexerTest.java
rename to 
components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveLexerTest.java
index 9395ac07424c..6d3b844babe1 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveLexerTest.java
+++ 
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveLexerTest.java
@@ -14,12 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
 
 import java.util.List;
 
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.Token;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.TokenType;
+import org.apache.camel.component.dataweave.DataWeaveLexer.Token;
+import org.apache.camel.component.dataweave.DataWeaveLexer.TokenType;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParserTest.java
 
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveParserTest.java
similarity index 83%
rename from 
dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParserTest.java
rename to 
components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveParserTest.java
index 8802531c2932..fcc71cc4e025 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/transform/DataWeaveParserTest.java
+++ 
b/components/camel-dataweave/src/test/java/org/apache/camel/component/dataweave/DataWeaveParserTest.java
@@ -14,31 +14,31 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.dsl.jbang.core.commands.transform;
+package org.apache.camel.component.dataweave;
 
 import java.util.List;
 
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.ArrayLit;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.BinaryOp;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.DefaultExpr;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.FieldAccess;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.FunctionCall;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.Identifier;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.IfElse;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.IndexAccess;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.Lambda;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.LambdaShorthand;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.MapExpr;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.NumberLit;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.ObjectLit;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.Parens;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.Script;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.StringLit;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.TypeCoercion;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.UnaryOp;
-import 
org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.Unsupported;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveAst.VarDecl;
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveLexer.Token;
+import org.apache.camel.component.dataweave.DataWeaveAst.ArrayLit;
+import org.apache.camel.component.dataweave.DataWeaveAst.BinaryOp;
+import org.apache.camel.component.dataweave.DataWeaveAst.DefaultExpr;
+import org.apache.camel.component.dataweave.DataWeaveAst.FieldAccess;
+import org.apache.camel.component.dataweave.DataWeaveAst.FunctionCall;
+import org.apache.camel.component.dataweave.DataWeaveAst.Identifier;
+import org.apache.camel.component.dataweave.DataWeaveAst.IfElse;
+import org.apache.camel.component.dataweave.DataWeaveAst.IndexAccess;
+import org.apache.camel.component.dataweave.DataWeaveAst.Lambda;
+import org.apache.camel.component.dataweave.DataWeaveAst.LambdaShorthand;
+import org.apache.camel.component.dataweave.DataWeaveAst.MapExpr;
+import org.apache.camel.component.dataweave.DataWeaveAst.NumberLit;
+import org.apache.camel.component.dataweave.DataWeaveAst.ObjectLit;
+import org.apache.camel.component.dataweave.DataWeaveAst.Parens;
+import org.apache.camel.component.dataweave.DataWeaveAst.Script;
+import org.apache.camel.component.dataweave.DataWeaveAst.StringLit;
+import org.apache.camel.component.dataweave.DataWeaveAst.TypeCoercion;
+import org.apache.camel.component.dataweave.DataWeaveAst.UnaryOp;
+import org.apache.camel.component.dataweave.DataWeaveAst.Unsupported;
+import org.apache.camel.component.dataweave.DataWeaveAst.VarDecl;
+import org.apache.camel.component.dataweave.DataWeaveLexer.Token;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -67,7 +67,7 @@ class DataWeaveParserTest {
         return new DataWeaveParser(tokens).parse();
     }
 
-    // ── Header ──
+    // -- Header --
 
     @Test
     void shouldParseHeaderVersionAndOutputType() {
@@ -109,7 +109,7 @@ class DataWeaveParserTest {
         assertInstanceOf(Identifier.class, script.body());
     }
 
-    // ── Literals and field access ──
+    // -- Literals and field access --
 
     @Test
     void shouldParseLiterals() {
@@ -129,7 +129,7 @@ class DataWeaveParserTest {
         assertEquals("payload", assertInstanceOf(Identifier.class, 
fa.object()).name());
     }
 
-    // ── Precedence ──
+    // -- Precedence --
 
     @Test
     void shouldGiveMultiplicationHigherPrecedenceThanAddition() {
@@ -165,7 +165,7 @@ class DataWeaveParserTest {
         assertEquals("+", assertInstanceOf(BinaryOp.class, 
parens.expr()).op());
     }
 
-    // ── Object / array literals ──
+    // -- Object / array literals --
 
     @Test
     void shouldParseObjectLiteralWithStaticAndDynamicKeys() {
@@ -186,7 +186,7 @@ class DataWeaveParserTest {
         assertEquals("2", assertInstanceOf(NumberLit.class, 
arr.elements().get(1)).value());
     }
 
-    // ── Collection operations / lambdas ──
+    // -- Collection operations / lambdas --
 
     @Test
     void shouldParseMapWithExplicitLambda() {
@@ -205,7 +205,7 @@ class DataWeaveParserTest {
         assertEquals(List.of("name"), sh.fields());
     }
 
-    // ── Function calls ──
+    // -- Function calls --
 
     @Test
     void shouldParseBuiltinFunctionCall() {
@@ -215,7 +215,7 @@ class DataWeaveParserTest {
         assertEquals("payload", assertInstanceOf(Identifier.class, 
call.args().get(0)).name());
     }
 
-    // ── Type coercion ──
+    // -- Type coercion --
 
     @Test
     void shouldParseTypeCoercionWithoutFormat() {
@@ -231,7 +231,7 @@ class DataWeaveParserTest {
         assertEquals("yyyy-MM-dd", tc.format());
     }
 
-    // ── Control flow ──
+    // -- Control flow --
 
     @Test
     void shouldParseIfElse() {
@@ -257,7 +257,7 @@ class DataWeaveParserTest {
         assertEquals("x", assertInstanceOf(Identifier.class, 
var.body()).name());
     }
 
-    // ── Unary ──
+    // -- Unary --
 
     @Test
     void shouldParseLogicalNot() {
@@ -266,7 +266,7 @@ class DataWeaveParserTest {
         assertEquals("a", assertInstanceOf(Identifier.class, 
not.operand()).name());
     }
 
-    // ── Graceful degradation ──
+    // -- Graceful degradation --
 
     @Test
     void shouldRepresentMatchExpressionAsUnsupported() {
@@ -278,9 +278,9 @@ class DataWeaveParserTest {
 
     @Test
     void shouldNotThrowOnUnbalancedInput() {
-        // expect() silently skips a missing RPAREN, so a best-effort AST is 
still produced
         List<Token> tokens = new DataWeaveLexer("(a + b").tokenize();
         assertEquals(DataWeaveLexer.TokenType.EOF, tokens.get(tokens.size() - 
1).type());
+        // expect() silently skips a missing RPAREN, so a best-effort AST is 
still produced
         assertInstanceOf(Parens.class, parseExpr("(a + b"));
     }
 }
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/collection-map.dwl
 b/components/camel-dataweave/src/test/resources/dataweave/collection-map.dwl
similarity index 100%
rename from 
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/collection-map.dwl
rename to 
components/camel-dataweave/src/test/resources/dataweave/collection-map.dwl
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/event-message.dwl
 b/components/camel-dataweave/src/test/resources/dataweave/event-message.dwl
similarity index 100%
rename from 
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/event-message.dwl
rename to 
components/camel-dataweave/src/test/resources/dataweave/event-message.dwl
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/null-handling.dwl
 b/components/camel-dataweave/src/test/resources/dataweave/null-handling.dwl
similarity index 100%
rename from 
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/null-handling.dwl
rename to 
components/camel-dataweave/src/test/resources/dataweave/null-handling.dwl
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/simple-rename.dwl
 b/components/camel-dataweave/src/test/resources/dataweave/simple-rename.dwl
similarity index 100%
rename from 
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/simple-rename.dwl
rename to 
components/camel-dataweave/src/test/resources/dataweave/simple-rename.dwl
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/string-ops.dwl 
b/components/camel-dataweave/src/test/resources/dataweave/string-ops.dwl
similarity index 100%
rename from 
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/string-ops.dwl
rename to components/camel-dataweave/src/test/resources/dataweave/string-ops.dwl
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/type-coercion.dwl
 b/components/camel-dataweave/src/test/resources/dataweave/type-coercion.dwl
similarity index 100%
rename from 
dsl/camel-jbang/camel-jbang-core/src/test/resources/dataweave/type-coercion.dwl
rename to 
components/camel-dataweave/src/test/resources/dataweave/type-coercion.dwl
diff --git a/components/pom.xml b/components/pom.xml
index e09d87cfe482..5c9fca05136b 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -120,6 +120,7 @@
         <module>camel-cyberark-vault</module>
         <module>camel-dapr</module>
         <module>camel-datasonnet</module>
+        <module>camel-dataweave</module>
         <module>camel-debug</module>
         <module>camel-diagram</module>
         <module>camel-debezium</module>
diff --git a/docs/components/modules/others/examples/json/dataweave.json 
b/docs/components/modules/others/examples/json/dataweave.json
new file mode 120000
index 000000000000..d2175aae6006
--- /dev/null
+++ b/docs/components/modules/others/examples/json/dataweave.json
@@ -0,0 +1 @@
+../../../../../../components/camel-dataweave/src/generated/resources/dataweave.json
\ No newline at end of file
diff --git a/dsl/camel-jbang/camel-jbang-core/pom.xml 
b/dsl/camel-jbang/camel-jbang-core/pom.xml
index d369b09415b0..d3066b4c5e6f 100644
--- a/dsl/camel-jbang/camel-jbang-core/pom.xml
+++ b/dsl/camel-jbang/camel-jbang-core/pom.xml
@@ -45,6 +45,10 @@
 
     <dependencies>
         <!-- camel -->
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-dataweave</artifactId>
+        </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-diagram</artifactId>
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
index bc3ff95df84d..e08ed966680f 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/TransformDataWeave.java
@@ -23,7 +23,7 @@ import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.camel.dsl.jbang.core.commands.transform.DataWeaveConverter;
+import org.apache.camel.component.dataweave.DataWeaveConverter;
 import picocli.CommandLine;
 import picocli.CommandLine.Command;
 
diff --git a/parent/pom.xml b/parent/pom.xml
index 1a8f16f90ce7..a3958175c1f7 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -1247,6 +1247,11 @@
                 <artifactId>camel-datasonnet</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
+                <artifactId>camel-dataweave</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
                 <artifactId>camel-debezium-common</artifactId>

Reply via email to