eta-dev / eta

Embedded JS template engine for Node, Deno, and the browser. Lighweight, fast, and pluggable. Written in TypeScript
https://eta.js.org
MIT License
1.35k stars 60 forks source link

Include name of replacement in filter function #274

Open cpetrov opened 5 months ago

cpetrov commented 5 months ago

Is your feature request related to a problem? Please describe. Currently, when a replacement is not defined, Eta will render undefined in its place:

const eta = new Eta()
const res = eta.renderString("Hello <%= it.name %>", {}) // Hello undefined

This is not ideal, as it will lead to undefined being rendered in the output. This is rarely desired.

As recommended in the related issue https://github.com/eta-dev/eta/issues/28, one can use filterFunction to handle missing replacements:

const eta = new Eta({
  autoFilter: true,
  filterFunction: (val) => {
    if (val == null) throw new Error('Replacement missing');
    return String(val);
  }
})
const res = eta.renderString("Hello <%= it.name %>", {}) // Error: Replacement missing

... however, the filter function does not have access to the name of the replacement that is missing, so it is not possible to provide a helpful error message.

Describe the solution you'd like The filter function could be called with the name of the missing replacement as a second argument to enable helpful error messages:

const eta = new Eta({
  autoFilter: true,
  filterFunction: (val, name) => {
    if (val == null) throw new Error(`Replacement "${name}" missing`);
    return String(val);
  }
})
const res = eta.renderString("Hello <%= it.name %>", {}) // Error: Replacement "name" missing
nebrelbug commented 4 months ago

@cpetrov I like this idea, but it's difficult to implement without writing something to try and parse JS. For example, what should happen if somebody writes <%= it.name + "!" %>? What should happen if somebody writes <%= undefined %>? Those are both possibilities with Eta.

I am open to a PR though!