From d9d78c67667f5404769e5a3088674f01478e289b Mon Sep 17 00:00:00 2001 From: mailq <15148854+mailq@users.noreply.github.com> Date: Sat, 16 May 2026 23:34:19 +0200 Subject: [PATCH] Added namespace support --- .../java/starfederation/datastar/Consts.java | 4 --- .../datastar/enums/Namespace.java | 5 +++ .../events/AbstractDatastarEvent.java | 2 +- .../datastar/events/CustomEvent.java | 13 ------- .../datastar/events/DatastarEvent.java | 3 -- .../datastar/events/ExecuteScript.java | 19 +++++----- .../datastar/events/PatchElements.java | 36 +++++++++++++++---- .../datastar/unit/PatchElementsTest.java | 22 ++++++++++++ 8 files changed, 69 insertions(+), 35 deletions(-) create mode 100644 core/src/main/java/starfederation/datastar/enums/Namespace.java delete mode 100644 core/src/main/java/starfederation/datastar/events/CustomEvent.java diff --git a/core/src/main/java/starfederation/datastar/Consts.java b/core/src/main/java/starfederation/datastar/Consts.java index 1354b3e..5b6ee33 100644 --- a/core/src/main/java/starfederation/datastar/Consts.java +++ b/core/src/main/java/starfederation/datastar/Consts.java @@ -7,10 +7,6 @@ */ public final class Consts { public static final String DATASTAR_KEY = "datastar"; - public static final String VERSION = "1.0.0-RC.1"; - - // The default duration for retrying SSE on connection reset. This is part of the underlying retry mechanism of SSE. - public static final int DEFAULT_SSE_RETRY_DURATION = 1000; // Should elements be patched using the ViewTransition API? public static final boolean DEFAULT_ELEMENTS_USE_VIEW_TRANSITIONS = false; diff --git a/core/src/main/java/starfederation/datastar/enums/Namespace.java b/core/src/main/java/starfederation/datastar/enums/Namespace.java new file mode 100644 index 0000000..e95101c --- /dev/null +++ b/core/src/main/java/starfederation/datastar/enums/Namespace.java @@ -0,0 +1,5 @@ +package starfederation.datastar.enums; + +public enum Namespace { + HTML, SVG, MATHML +} diff --git a/core/src/main/java/starfederation/datastar/events/AbstractDatastarEvent.java b/core/src/main/java/starfederation/datastar/events/AbstractDatastarEvent.java index 4913c6e..bf9522f 100644 --- a/core/src/main/java/starfederation/datastar/events/AbstractDatastarEvent.java +++ b/core/src/main/java/starfederation/datastar/events/AbstractDatastarEvent.java @@ -6,7 +6,7 @@ import java.util.Objects; sealed public abstract class AbstractDatastarEvent implements DatastarEvent permits PatchElements, PatchSignals, - ExecuteScript, CustomEvent { + ExecuteScript { private final String[] dataLines; diff --git a/core/src/main/java/starfederation/datastar/events/CustomEvent.java b/core/src/main/java/starfederation/datastar/events/CustomEvent.java deleted file mode 100644 index 91c416f..0000000 --- a/core/src/main/java/starfederation/datastar/events/CustomEvent.java +++ /dev/null @@ -1,13 +0,0 @@ -package starfederation.datastar.events; - -import starfederation.datastar.enums.EventType; - -import java.util.List; - -public abstract non-sealed class CustomEvent extends AbstractDatastarEvent { - - protected CustomEvent(EventType eventType, List dataLines) { - super(eventType, dataLines); - } - -} diff --git a/core/src/main/java/starfederation/datastar/events/DatastarEvent.java b/core/src/main/java/starfederation/datastar/events/DatastarEvent.java index 45810fd..b601f64 100644 --- a/core/src/main/java/starfederation/datastar/events/DatastarEvent.java +++ b/core/src/main/java/starfederation/datastar/events/DatastarEvent.java @@ -3,7 +3,6 @@ import starfederation.datastar.enums.EventType; sealed interface DatastarEvent permits AbstractDatastarEvent { - /** * Returns the event type. */ @@ -17,10 +16,8 @@ sealed interface DatastarEvent permits AbstractDatastarEvent { /** * Returns the builder for the event. */ - static AbstractBuilder builder() { throw new IllegalStateException("the builder method should be overridden to use the appropriate builder"); } - } diff --git a/core/src/main/java/starfederation/datastar/events/ExecuteScript.java b/core/src/main/java/starfederation/datastar/events/ExecuteScript.java index c8b26c8..c49813e 100644 --- a/core/src/main/java/starfederation/datastar/events/ExecuteScript.java +++ b/core/src/main/java/starfederation/datastar/events/ExecuteScript.java @@ -1,11 +1,11 @@ package starfederation.datastar.events; - -import starfederation.datastar.enums.EventType; +import static starfederation.datastar.Consts.ELEMENTS_DATALINE_LITERAL; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; -import static starfederation.datastar.Consts.*; +import starfederation.datastar.enums.EventType; public final class ExecuteScript extends AbstractDatastarEvent { @@ -29,6 +29,7 @@ public static final class Builder extends AbstractBuilder { /** * JavaScript to execute on the client. Do not wrap in HTML-script tags. + * * @param script valid JavaScript * @return a builder for fluent configuration */ @@ -39,6 +40,7 @@ public Builder script(String script) { this.script = script; return this; } + private Builder() { } @@ -61,8 +63,7 @@ public ExecuteScript build() { } var wrappedScript = new StringBuilder(" dataLines = new ArrayList<>(); - + // Add attributes if not default if (attributes != null && !attributes.isBlank()) { wrappedScript.append(' ').append(attributes); @@ -76,9 +77,11 @@ public ExecuteScript build() { wrappedScript.append(">").append(script).append(""); // Add script - wrappedScript.toString().lines() - .filter(line -> !line.isBlank()) - .forEach(line -> dataLines.add(ELEMENTS_DATALINE_LITERAL + line)); + var dataLines = wrappedScript.toString() + .lines() + .filter(Predicate.not(String::isBlank)) + .map(line -> ELEMENTS_DATALINE_LITERAL + line) + .toList(); return new ExecuteScript(EventType.PatchElements, dataLines); } diff --git a/core/src/main/java/starfederation/datastar/events/PatchElements.java b/core/src/main/java/starfederation/datastar/events/PatchElements.java index 2acb101..03f73d4 100644 --- a/core/src/main/java/starfederation/datastar/events/PatchElements.java +++ b/core/src/main/java/starfederation/datastar/events/PatchElements.java @@ -1,12 +1,19 @@ package starfederation.datastar.events; -import starfederation.datastar.enums.ElementPatchMode; -import starfederation.datastar.enums.EventType; +import static starfederation.datastar.Consts.DEFAULT_ELEMENTS_USE_VIEW_TRANSITIONS; +import static starfederation.datastar.Consts.DEFAULT_ELEMENT_PATCH_MODE; +import static starfederation.datastar.Consts.ELEMENTS_DATALINE_LITERAL; +import static starfederation.datastar.Consts.MODE_DATALINE_LITERAL; +import static starfederation.datastar.Consts.SELECTOR_DATALINE_LITERAL; +import static starfederation.datastar.Consts.USE_VIEW_TRANSITION_DATALINE_LITERAL; import java.util.ArrayList; import java.util.List; +import java.util.function.Predicate; -import static starfederation.datastar.Consts.*; +import starfederation.datastar.enums.ElementPatchMode; +import starfederation.datastar.enums.EventType; +import starfederation.datastar.enums.Namespace; public final class PatchElements extends AbstractDatastarEvent { @@ -27,6 +34,7 @@ public static final class Builder extends AbstractBuilder { private String selector; private ElementPatchMode mode = DEFAULT_ELEMENT_PATCH_MODE; // Default private boolean useViewTransition = DEFAULT_ELEMENTS_USE_VIEW_TRANSITIONS; // Default + private Namespace namespace = Namespace.HTML; private String rawData; private Builder() { @@ -47,6 +55,11 @@ public Builder useViewTransition(boolean useViewTransition) { return this; } + public Builder namespace(Namespace namespace) { + this.namespace = namespace; + return this; + } + public Builder data(String rawData) { this.rawData = rawData; return this; @@ -58,7 +71,7 @@ public PatchElements build() { throw new IllegalArgumentException("Data cannot be null or empty"); } - List dataLines = new ArrayList<>(); + var dataLines = new ArrayList(); // Add selector if (selector != null && !selector.isEmpty()) { @@ -75,11 +88,22 @@ public PatchElements build() { dataLines.add(USE_VIEW_TRANSITION_DATALINE_LITERAL + useViewTransition); } + // Add namespace + if (namespace != Namespace.HTML) { + var value = switch (namespace) { + case HTML -> "html"; + case SVG -> "svg"; + case MATHML -> "mathml"; + }; + dataLines.add("namespace " + value); + } + // Add raw data as fragments if (rawData!= null) rawData.lines() - .filter(line -> !line.isBlank()) - .forEach(line -> dataLines.add(ELEMENTS_DATALINE_LITERAL + line)); + .filter(Predicate.not(String::isBlank)) + .map(line -> ELEMENTS_DATALINE_LITERAL + line) + .forEach(dataLines::add); return new PatchElements(EventType.PatchElements, dataLines); } diff --git a/core/src/test/java/starfederation/datastar/unit/PatchElementsTest.java b/core/src/test/java/starfederation/datastar/unit/PatchElementsTest.java index 7112a10..deb7f23 100644 --- a/core/src/test/java/starfederation/datastar/unit/PatchElementsTest.java +++ b/core/src/test/java/starfederation/datastar/unit/PatchElementsTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.Test; import starfederation.datastar.enums.EventType; +import starfederation.datastar.enums.Namespace; import starfederation.datastar.enums.ElementPatchMode; import starfederation.datastar.events.PatchElements; @@ -46,6 +47,27 @@ void builderShouldExcludeDefaultValues() { assertArrayEquals(expectedDataLines, event.getDataLines()); } + @Test + void builderShouldRespectNamespace() { + PatchElements event = PatchElements.builder() + .selector("#feed") + .namespace(Namespace.SVG) + .mode(ElementPatchMode.Before) + .data("
1\n
") + .build(); + + String[] expectedDataLines = { + "selector #feed", + "mode before", + "namespace svg", + "elements
1", + "elements
" + }; + + assertArrayEquals(expectedDataLines, event.getDataLines()); + assertEquals(EventType.PatchElements, event.getEventType()); + } + @Test void builderShouldThrowExceptionForNullData() { assertThrows(IllegalArgumentException.class, () -> PatchElements.builder().build());