Skip to content

Commit c0cd1db

Browse files
authored
fix: merge data dictionary when including (#347)
* fix: allow running tests on Windows with path backslashes Signed-off-by: Oldřich Jedlička <[email protected]> * fix: merge data dictionary when including templates * fix: use __eta argument prefix to allow varName to be data --------- Signed-off-by: Oldřich Jedlička <[email protected]>
1 parent eb948d3 commit c0cd1db

File tree

4 files changed

+95
-14
lines changed

4 files changed

+95
-14
lines changed

src/compile-string.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ export function compileToString(
2020

2121
// note: when the include function passes through options, the only parameter that matters is the filepath parameter
2222
let res = `${config.functionHeader}
23-
let include = (template, data) => this.render(template, data, options);
24-
let includeAsync = (template, data) => this.renderAsync(template, data, options);
23+
let include = (__eta_t, __eta_d) => this.render(__eta_t, {...${config.varName}, ...(__eta_d ?? {})}, options);
24+
let includeAsync = (__eta_t, __eta_d) => this.renderAsync(__eta_t, {...${config.varName}, ...(__eta_d ?? {})}, options);
2525
2626
let __eta = {res: "", e: this.config.escapeFunction, f: this.config.filterFunction${
2727
config.debug

test/compile-string.spec.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ describe("Compile to String test", () => {
1414
it("compiles a simple template", () => {
1515
const str = eta.compileToString("hi <%= it.name %>");
1616
expect(str).toEqual(`
17-
let include = (template, data) => this.render(template, data, options);
18-
let includeAsync = (template, data) => this.renderAsync(template, data, options);
17+
let include = (__eta_t, __eta_d) => this.render(__eta_t, {...it, ...(__eta_d ?? {})}, options);
18+
let includeAsync = (__eta_t, __eta_d) => this.renderAsync(__eta_t, {...it, ...(__eta_d ?? {})}, options);
1919
2020
let __eta = {res: "", e: this.config.escapeFunction, f: this.config.filterFunction};
2121
@@ -40,8 +40,8 @@ return __eta.res;
4040
it("compiles a simple template with a raw tag", () => {
4141
const str = eta.compileToString("hi <%~ it.name %>");
4242
expect(str).toEqual(`
43-
let include = (template, data) => this.render(template, data, options);
44-
let includeAsync = (template, data) => this.renderAsync(template, data, options);
43+
let include = (__eta_t, __eta_d) => this.render(__eta_t, {...it, ...(__eta_d ?? {})}, options);
44+
let includeAsync = (__eta_t, __eta_d) => this.renderAsync(__eta_t, {...it, ...(__eta_d ?? {})}, options);
4545
4646
let __eta = {res: "", e: this.config.escapeFunction, f: this.config.filterFunction};
4747
@@ -68,8 +68,8 @@ return __eta.res;
6868
"hi\n<%- = it.firstname-%>\n<%_ = it.lastname_%>",
6969
);
7070
expect(str).toEqual(`
71-
let include = (template, data) => this.render(template, data, options);
72-
let includeAsync = (template, data) => this.renderAsync(template, data, options);
71+
let include = (__eta_t, __eta_d) => this.render(__eta_t, {...it, ...(__eta_d ?? {})}, options);
72+
let includeAsync = (__eta_t, __eta_d) => this.renderAsync(__eta_t, {...it, ...(__eta_d ?? {})}, options);
7373
7474
let __eta = {res: "", e: this.config.escapeFunction, f: this.config.filterFunction};
7575
@@ -95,8 +95,8 @@ return __eta.res;
9595
it("compiles complex template", () => {
9696
const str = eta.compileToString(complexTemplate);
9797
expect(str).toEqual(`
98-
let include = (template, data) => this.render(template, data, options);
99-
let includeAsync = (template, data) => this.renderAsync(template, data, options);
98+
let include = (__eta_t, __eta_d) => this.render(__eta_t, {...it, ...(__eta_d ?? {})}, options);
99+
let includeAsync = (__eta_t, __eta_d) => this.renderAsync(__eta_t, {...it, ...(__eta_d ?? {})}, options);
100100
101101
let __eta = {res: "", e: this.config.escapeFunction, f: this.config.filterFunction};
102102

test/file-handling.spec.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,13 @@ Hi Test Runner`,
2727
// Filepath caching is based on the premise that given the same path, includer filename, root directory, and views directory (or directories)
2828
// the getPath function will always return the same result (assuming that caching is enabled and we're not expecting the templates to change)
2929

30-
const pathToPartial = `{"filename":"${viewsDir}/has-include.eta","path":"./partial","views":"${viewsDir}"}`;
30+
const pathToPartial = `{"filename":${JSON.stringify(path.join(viewsDir, "has-include.eta"))},"path":"./partial","views":${JSON.stringify(viewsDir)}}`;
3131

32-
const pathToSimple = `{"filename":"${viewsDir}/partial.eta","path":"./simple","views":"${viewsDir}"}`;
32+
const pathToSimple = `{"filename":${JSON.stringify(path.join(viewsDir, "partial.eta"))},"path":"./simple","views":${JSON.stringify(viewsDir)}}`;
3333

3434
expect(eta.filepathCache).toEqual({
35-
[pathToPartial]: `${viewsDir}/partial.eta`,
36-
[pathToSimple]: `${viewsDir}/simple.eta`,
35+
[pathToPartial]: path.join(viewsDir, "partial.eta"),
36+
[pathToSimple]: path.join(viewsDir, "simple.eta"),
3737
});
3838
});
3939
});

test/render.spec.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { describe, expect, it } from "vitest";
44
import { Eta } from "../src/index";
55

66
interface SimpleEtaTemplate {
7+
greeting?: string;
78
name: string;
89
}
910

@@ -171,3 +172,83 @@ describe("file rendering", () => {
171172
HI FROM ASYNC`);
172173
});
173174
});
175+
176+
describe("import values merging", () => {
177+
const eta = new Eta({ views: path.join(__dirname, "templates") });
178+
eta.loadTemplate("@simple", "<%= it.greeting ?? 'Hi' %> <%= it.name %>");
179+
eta.loadTemplate("@partial", "This is a partial.\n<%~ include('@simple', {name: 'Test Runner'}) %>\n");
180+
eta.loadTemplate("@partial-merge", "This is a partial.\n<%~ include('@simple', {greeting: 'Hello'}) %>\n");
181+
eta.loadTemplate("@partial-pass-data", "This is a partial.\n<%~ include('@simple') %>");
182+
183+
it("can override value", () => {
184+
const res = eta.render<SimpleEtaTemplate>("@partial", { greeting: "Hello", name: "friend" });
185+
186+
expect(res).toEqual("This is a partial.\nHello Test Runner");
187+
});
188+
189+
it("merges values", () => {
190+
const res = eta.render<SimpleEtaTemplate>("@partial-merge", { name: "friend" });
191+
192+
expect(res).toEqual("This is a partial.\nHello friend");
193+
});
194+
195+
it("passes original values", () => {
196+
const res = eta.render<SimpleEtaTemplate>("@partial-pass-data", { greeting: "Hello", name: "friend" });
197+
198+
expect(res).toEqual("This is a partial.\nHello friend");
199+
});
200+
});
201+
202+
describe("import values merging with varName data", () => {
203+
const eta = new Eta({ varName: "data", views: path.join(__dirname, "templates") });
204+
205+
eta.loadTemplate("@simple", "<%= data.greeting ?? 'Hi' %> <%= data.name %>");
206+
eta.loadTemplate("@partial", "This is a partial.\n<%~ include('@simple', {name: 'Test Runner'}) %>\n");
207+
eta.loadTemplate("@partial-merge", "This is a partial.\n<%~ include('@simple', {greeting: 'Hello'}) %>\n");
208+
eta.loadTemplate("@partial-pass-data", "This is a partial.\n<%~ include('@simple') %>");
209+
210+
it("can override value", () => {
211+
const res = eta.render<SimpleEtaTemplate>("@partial", { greeting: "Hello", name: "friend" });
212+
213+
expect(res).toEqual("This is a partial.\nHello Test Runner");
214+
});
215+
216+
it("merges values", () => {
217+
const res = eta.render<SimpleEtaTemplate>("@partial-merge", { name: "friend" });
218+
219+
expect(res).toEqual("This is a partial.\nHello friend");
220+
});
221+
222+
it("passes original values", () => {
223+
const res = eta.render<SimpleEtaTemplate>("@partial-pass-data", { greeting: "Hello", name: "friend" });
224+
225+
expect(res).toEqual("This is a partial.\nHello friend");
226+
});
227+
});
228+
229+
describe("import values merging with the useWith", () => {
230+
const eta = new Eta({ useWith: true, views: path.join(__dirname, "templates") });
231+
232+
eta.loadTemplate("@simple", "<%= typeof greeting !== 'undefined' ? greeting : 'Hi' %> <%= name %>");
233+
eta.loadTemplate("@partial", "This is a partial.\n<%~ include('@simple', {name: 'Test Runner'}) %>\n");
234+
eta.loadTemplate("@partial-merge", "This is a partial.\n<%~ include('@simple', {greeting: 'Hello'}) %>\n");
235+
eta.loadTemplate("@partial-pass-data", "This is a partial.\n<%~ include('@simple') %>");
236+
237+
it("can override value", () => {
238+
const res = eta.render<SimpleEtaTemplate>("@partial", { greeting: "Hello", name: "friend" });
239+
240+
expect(res).toEqual("This is a partial.\nHello Test Runner");
241+
});
242+
243+
it("merges values", () => {
244+
const res = eta.render<SimpleEtaTemplate>("@partial-merge", { name: "friend" });
245+
246+
expect(res).toEqual("This is a partial.\nHello friend");
247+
});
248+
249+
it("passes original values", () => {
250+
const res = eta.render<SimpleEtaTemplate>("@partial-pass-data", { greeting: "Hello", name: "friend" });
251+
252+
expect(res).toEqual("This is a partial.\nHello friend");
253+
});
254+
});

0 commit comments

Comments
 (0)