eta icon indicating copy to clipboard operation
eta copied to clipboard

Include name of replacement in filter function

Open cpetrov opened this issue 2 years ago • 1 comments

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

cpetrov avatar Feb 09 '24 13:02 cpetrov

@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!

bgub avatar Feb 09 '24 21:02 bgub