Skip to content

Commit 252aab7

Browse files
committed
improve server side html template js api
1 parent 5640e1a commit 252aab7

File tree

8 files changed

+62
-12
lines changed

8 files changed

+62
-12
lines changed

karate-core/src/main/java/com/intuit/karate/core/ScenarioEngine.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -988,7 +988,7 @@ public void doc(String exp) {
988988
}
989989
if (templateEngine == null) {
990990
String prefixedPath = runtime.featureRuntime.rootFeature.feature.getResource().getPrefixedParentPath();
991-
templateEngine = TemplateUtils.forResourcePath(JS, prefixedPath);
991+
templateEngine = TemplateUtils.forResourceRoot(JS, prefixedPath);
992992
}
993993
String html = templateEngine.process(path);
994994
runtime.embed(FileUtils.toBytes(html), ResourceType.HTML);

karate-core/src/main/java/com/intuit/karate/http/ServerContext.java

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,11 @@
2525

2626
import com.intuit.karate.FileUtils;
2727
import com.intuit.karate.graal.JsArray;
28+
import com.intuit.karate.graal.JsEngine;
2829
import com.intuit.karate.graal.JsValue;
2930
import com.intuit.karate.graal.Methods;
31+
import com.intuit.karate.template.KarateTemplateEngine;
32+
import com.intuit.karate.template.TemplateUtils;
3033
import io.netty.handler.codec.http.cookie.Cookie;
3134
import io.netty.handler.codec.http.cookie.ServerCookieDecoder;
3235
import java.io.InputStream;
@@ -108,6 +111,43 @@ public ServerContext(ServerConfig config, Request request, Map<String, Object> v
108111
}
109112
return http;
110113
};
114+
RENDER_FUNCTION = o -> {
115+
if (o instanceof String) {
116+
return RequestCycle.get().getTemplateEngine().process((String) o);
117+
}
118+
Map<String, Object> map;
119+
if (o instanceof Map) {
120+
map = (Map) o;
121+
} else {
122+
logger.warn("invalid argument to render: {}", o);
123+
return null;
124+
}
125+
Map<String, Object> templateVars = (Map) map.get("variables");
126+
String path = (String) map.get("path");
127+
if (path != null) {
128+
if (templateVars == null) {
129+
return RequestCycle.get().getTemplateEngine().process(path);
130+
}
131+
JsEngine je = JsEngine.local();
132+
je.putAll(templateVars);
133+
KarateTemplateEngine kte = TemplateUtils.forResourceResolver(je, config.getResourceResolver());
134+
return kte.process(path);
135+
}
136+
String html = (String) map.get("html");
137+
if (html == null) {
138+
logger.warn("invalid argument to render, path or html needed: {}", map);
139+
return null;
140+
}
141+
JsEngine je;
142+
if (templateVars == null) {
143+
je = RequestCycle.get().getEngine();
144+
} else {
145+
je = JsEngine.local();
146+
je.putAll(templateVars);
147+
}
148+
KarateTemplateEngine kte = TemplateUtils.forStrings(je);
149+
return kte.process(html);
150+
};
111151
}
112152

113153
private static final String DOT_JS = ".js";
@@ -273,7 +313,9 @@ public void afterSettle(String js) {
273313

274314
private static final Supplier<String> UUID_FUNCTION = () -> java.util.UUID.randomUUID().toString();
275315
private static final Function<String, Object> FROM_JSON_FUNCTION = s -> JsValue.fromString(s, false, null);
316+
276317
private final Methods.FunVar HTTP_FUNCTION; // set in constructor
318+
private final Function<Object, String> RENDER_FUNCTION; // set in constructor
277319

278320
private final Consumer<String> SWITCH_FUNCTION = s -> {
279321
if (switched) {
@@ -307,8 +349,6 @@ public void afterSettle(String js) {
307349
return o;
308350
};
309351

310-
private final Function<String, String> RENDER_FUNCTION = s -> RequestCycle.get().getTemplateEngine().process(s);
311-
312352
@Override
313353
public Object getMember(String key) {
314354
switch (key) {

karate-core/src/main/java/com/intuit/karate/report/Report.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ default File render() {
5353

5454
default File render(String reportDir) {
5555
JsEngine je = getJsEngine();
56-
KarateTemplateEngine engine = TemplateUtils.forResourcePath(je, getResourceRoot());
56+
KarateTemplateEngine engine = TemplateUtils.forResourceRoot(je, getResourceRoot());
5757
String html = engine.process(getTemplate());
5858
if (reportDir == null) {
5959
reportDir = getReportDir();

karate-core/src/main/java/com/intuit/karate/template/TemplateUtils.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ private TemplateUtils() {
4141
// only static methods
4242
}
4343

44-
private static final String HTMX_SCRIPT_TAG = "<script src=\"https://unpkg.com/htmx.org@1.2.0\"></script>";
44+
private static final String HTMX_SCRIPT_TAG = "<script src=\"https://unpkg.com/htmx.org@1.3.3\"></script>";
4545

4646
public static IModel generateHeadScriptTag(ITemplateContext ctx) {
4747
IModelFactory modelFactory = ctx.getModelFactory();
@@ -69,11 +69,14 @@ public static KarateTemplateEngine forStrings(JsEngine je) {
6969
return engine;
7070
}
7171

72-
public static KarateTemplateEngine forResourcePath(JsEngine je, String root) {
73-
ResourceResolver resourceResolver = new ResourceResolver(root);
72+
public static KarateTemplateEngine forResourceResolver(JsEngine je, ResourceResolver resourceResolver) {
7473
KarateTemplateEngine engine = new KarateTemplateEngine(je, new KarateScriptDialect(resourceResolver));
7574
engine.setTemplateResolver(new ResourceHtmlTemplateResolver(resourceResolver));
7675
return engine;
7776
}
7877

78+
public static KarateTemplateEngine forResourceRoot(JsEngine je, String root) {
79+
return forResourceResolver(je, new ResourceResolver(root));
80+
}
81+
7982
}

karate-core/src/test/java/com/intuit/karate/resource/ResourceUtilsTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,15 +197,15 @@ void testClassPathToFileThatDoesNotExist() {
197197
@Test
198198
void testFindJsFilesFromFileSystem() {
199199
Set<String> files = ResourceUtils.findJsFilesInDirectory(new File("src/test/java/demo").getAbsoluteFile());
200-
assertEquals(3, files.size());
201-
Match.that(new ArrayList(files)).contains("['api/demo.js', 'api/cats.js', 'api/payments.js']");
200+
assertEquals(4, files.size());
201+
Match.that(new ArrayList(files)).contains("['api/demo.js', 'api/cats.js', 'api/payments.js', 'api/render.js']");
202202
}
203203

204204
@Test
205205
void testFindJsFilesFromClassPath() {
206206
Set<String> files = ResourceUtils.findJsFilesInClassPath("demo");
207-
assertEquals(3, files.size());
208-
Match.that(new ArrayList(files)).contains("['/api/demo.js', '/api/cats.js', '/api/payments.js']");
207+
assertEquals(4, files.size());
208+
Match.that(new ArrayList(files)).contains("['/api/demo.js', '/api/cats.js', '/api/payments.js', '/api/render.js']");
209209
}
210210

211211
}

karate-core/src/test/java/com/intuit/karate/template/TemplateTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ void testHtmlString() {
2626
@Test
2727
void testHtmlFile() {
2828
JsEngine je = JsEngine.local();
29-
KarateTemplateEngine engine = TemplateUtils.forResourcePath(je, "classpath:com/intuit/karate/template");
29+
KarateTemplateEngine engine = TemplateUtils.forResourceRoot(je, "classpath:com/intuit/karate/template");
3030
String rendered = engine.process("main.html");
3131
// logger.debug("rendered: {}", rendered);
3232
assertTrue(rendered.contains("<div id=\"before_one\"><span>js_one</span></div>"));
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
var someName = 'John';
2+
var msg1 = context.render('api/test');
3+
var msg2 = context.render({path: 'api/test.html', variables: {someName: 'Smith'}});
4+
var msg3 = context.render({html: '<div th:text="someName"></div>'});
5+
var msg4 = context.render({html: '<div th:text="someName"></div>', variables: {someName: 'Smith'}});
6+
response.body = {msg1: msg1, msg2: msg2, msg3: msg3, msg4: msg4};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<h1 th:text="someName"></h1>

0 commit comments

Comments
 (0)