Merge branch 'feature/handlebars-migration' of github.com:Budibase/budibase into form-builder
This commit is contained in:
commit
e4b2792729
|
@ -1,17 +1,7 @@
|
||||||
const { HelperFunctions } = require("./helpers/index")
|
const { HelperFunctions } = require("../helpers")
|
||||||
|
const { swapStrings, isAlphaNumeric, FIND_HBS_REGEX, includesAny } = require("../utilities")
|
||||||
|
|
||||||
const HBS_CLEANING_REGEX = /{{[^}}]*}}/g
|
function handleProcessor(string, match, fn) {
|
||||||
const ALPHA_NUMERIC_REGEX = /^[A-Za-z0-9]+$/g
|
|
||||||
|
|
||||||
function isAlphaNumeric(char) {
|
|
||||||
return char.match(ALPHA_NUMERIC_REGEX)
|
|
||||||
}
|
|
||||||
|
|
||||||
function swapStrings(string, start, length, swap) {
|
|
||||||
return string.slice(0, start) + swap + string.slice(start + length)
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleCleaner(string, match, fn) {
|
|
||||||
const output = fn(match)
|
const output = fn(match)
|
||||||
const idx = string.indexOf(match)
|
const idx = string.indexOf(match)
|
||||||
return swapStrings(string, idx, match.length, output)
|
return swapStrings(string, idx, match.length, output)
|
||||||
|
@ -60,31 +50,34 @@ function finalise(statement) {
|
||||||
if (insideStatement.charAt(insideStatement.length - 1) === " ") {
|
if (insideStatement.charAt(insideStatement.length - 1) === " ") {
|
||||||
insideStatement = insideStatement.slice(0, insideStatement.length - 1)
|
insideStatement = insideStatement.slice(0, insideStatement.length - 1)
|
||||||
}
|
}
|
||||||
return `{{ all (${insideStatement}) }}`
|
if (includesAny(insideStatement, HelperFunctions)) {
|
||||||
|
insideStatement = `(${insideStatement})`
|
||||||
|
}
|
||||||
|
return `{{ all ${insideStatement} }}`
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When running handlebars statements to execute on the context of the automation it possible user's may input handlebars
|
* When running handlebars statements to execute on the context of the automation it possible user's may input handlebars
|
||||||
* in a few different forms, some of which are invalid but are logically valid. An example of this would be the handlebars
|
* in a few different forms, some of which are invalid but are logically valid. An example of this would be the handlebars
|
||||||
* statement "{{steps[0].revision}}" here it is obvious the user is attempting to access an array or object using array
|
* statement "{{steps[0].revision}}" here it is obvious the user is attempting to access an array or object using array
|
||||||
* like operators. These are not supported by handlebars and therefore the statement will fail. This function will clean up
|
* like operators. These are not supported by handlebars and therefore the statement will fail. This function pre-processes will
|
||||||
* the handlebars statement so it instead reads as "{{steps.0.revision}}" which is valid and will work. It may also be expanded
|
* the handlebars statement so it instead reads as "{{steps.0.revision}}" which is valid and will work. It may also be expanded
|
||||||
* to include any other handlebars statement cleanup that has been deemed necessary for the system.
|
* to include any other handlebars statement pre-process that has been deemed necessary for the system.
|
||||||
*
|
*
|
||||||
* @param {string} string The string which *may* contain handlebars statements, it is OK if it does not contain any.
|
* @param {string} string The string which *may* contain handlebars statements, it is OK if it does not contain any.
|
||||||
* @returns {string} The string that was input with cleaned up handlebars statements as required.
|
* @returns {string} The string that was input with processed up handlebars statements as required.
|
||||||
*/
|
*/
|
||||||
module.exports.cleanHandlebars = (string) => {
|
module.exports.preprocess = (string) => {
|
||||||
let cleaners = [swapToDotNotation, handleSpacesInProperties, finalise]
|
let preprocessors = [swapToDotNotation, handleSpacesInProperties, finalise]
|
||||||
for (let cleaner of cleaners) {
|
for (let processor of preprocessors) {
|
||||||
// re-run search each time incase previous cleaner update/removed a match
|
// re-run search each time incase previous cleaner update/removed a match
|
||||||
let regex = new RegExp(HBS_CLEANING_REGEX)
|
let regex = new RegExp(FIND_HBS_REGEX)
|
||||||
let matches = string.match(regex)
|
let matches = string.match(regex)
|
||||||
if (matches == null) {
|
if (matches == null) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
for (let match of matches) {
|
for (let match of matches) {
|
||||||
string = handleCleaner(string, match, cleaner)
|
string = handleProcessor(string, match, processor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return string
|
return string
|
|
@ -1,6 +1,6 @@
|
||||||
const handlebars = require("handlebars")
|
const handlebars = require("handlebars")
|
||||||
const { registerAll } = require("./helpers/index")
|
const { registerAll } = require("./helpers/index")
|
||||||
const { cleanHandlebars } = require("./cleaning")
|
const { preprocess } = require("./custom/preprocessor")
|
||||||
|
|
||||||
const hbsInstance = handlebars.create()
|
const hbsInstance = handlebars.create()
|
||||||
registerAll(hbsInstance)
|
registerAll(hbsInstance)
|
||||||
|
@ -84,8 +84,7 @@ module.exports.processStringSync = (string, context) => {
|
||||||
console.log(string)
|
console.log(string)
|
||||||
console.log(context)
|
console.log(context)
|
||||||
let template
|
let template
|
||||||
string = cleanHandlebars(string)
|
string = preprocess(string)
|
||||||
console.log(string)
|
|
||||||
// this does not throw an error when template can't be fulfilled, have to try correct beforehand
|
// this does not throw an error when template can't be fulfilled, have to try correct beforehand
|
||||||
template = hbsInstance.compile(string)
|
template = hbsInstance.compile(string)
|
||||||
return template(context)
|
return template(context)
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
const ALPHA_NUMERIC_REGEX = /^[A-Za-z0-9]+$/g
|
||||||
|
|
||||||
|
module.exports.FIND_HBS_REGEX = /{{[^}}]*}}/g
|
||||||
|
|
||||||
|
module.exports.isAlphaNumeric = (char) => {
|
||||||
|
return char.match(ALPHA_NUMERIC_REGEX)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.swapStrings = (string, start, length, swap) => {
|
||||||
|
return string.slice(0, start) + swap + string.slice(start + length)
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.includesAny = (string, options) => {
|
||||||
|
return options.some(option => string.includes(option))
|
||||||
|
}
|
|
@ -9,4 +9,5 @@ describe("test the custom helpers we have applied", () => {
|
||||||
})
|
})
|
||||||
expect(output).toBe("object is {\"a\":1}")
|
expect(output).toBe("object is {\"a\":1}")
|
||||||
})
|
})
|
||||||
|
|
||||||
})
|
})
|
Loading…
Reference in New Issue