Browse Source

Correctly handle JS nullish values by removing forced fallback value of HBS helper

master
Andrew Kingston 5 years ago
parent
commit
39e98800d3
  1. 12
      packages/string-templates/src/helpers/Helper.js
  2. 2
      packages/string-templates/src/helpers/index.js
  3. 6
      packages/string-templates/src/helpers/javascript.js

12
packages/string-templates/src/helpers/Helper.js

@ -1,14 +1,20 @@
class Helper {
constructor(name, fn) {
constructor(name, fn, useValueFallback = true) {
this.name = name
this.fn = fn
this.useValueFallback = useValueFallback
}
register(handlebars) {
// wrap the function so that no helper can cause handlebars to break
handlebars.registerHelper(this.name, (value, info) => {
const context = info?.data?.root
return this.fn(value, context || {}) || value
const context = info?.data?.root || {}
const result = this.fn(value, context)
if (result == null) {
return this.useValueFallback ? value : null
} else {
return result
}
})
}

2
packages/string-templates/src/helpers/index.js

@ -19,7 +19,7 @@ const HELPERS = [
return new SafeString(JSON.stringify(value))
}),
// javascript helper
new Helper(HelperFunctionNames.JS, processJS),
new Helper(HelperFunctionNames.JS, processJS, false),
// this help is applied to all statements
new Helper(HelperFunctionNames.ALL, value => {
if (

6
packages/string-templates/src/helpers/javascript.js

@ -36,11 +36,7 @@ module.exports.processJS = (handlebars, context) => {
// Create a sandbox with out context and run the JS
vm.createContext(sandboxContext)
const result = vm.runInNewContext(js, sandboxContext)
if (result == null || result === "") {
return " "
}
return result
return vm.runInNewContext(js, sandboxContext)
} catch (error) {
return "Error while executing JS"
}

Loading…
Cancel
Save